如何在org-mode中将表字段格式化为货币

时间:2016-02-26 20:31:59

标签: emacs spreadsheet currency org-mode

我想将组织模式表中的字段格式化为货币 - 表示货币符号($)和逗号作为千位分隔符。我一直在使用$%。2f得到例如$ 1000.00但是如何获得逗号分隔符,例如$ 1,000.00?我有RTFM,但也许我太密集了,无法得到它。 calc或elisp公式都可以。见下面的样本表:

| Item     | Quantity |  Price |      Ext |
|----------+----------+--------+----------|
| Widget 1 |       10 | 100.00 |  1000.00 |
| Widget 2 |        5 |  50.00 |   250.00 |
| Widget 3 |        1 |   5.00 |     5.00 |
|----------+----------+--------+----------|
|          |          |  Total | $1255.00 |
#+TBLFM: $4=($2*$3);%.2f::@5$4=vsum(@2..@4);$%.2f

1 个答案:

答案 0 :(得分:1)

我发现无法始终如一地执行此操作,因此您可以获得包含数千个分隔符的数字,而这些数字将被正确解释以进行进一步计算。所以这不是答案,只是为了记录我迄今为止的研究。

以下示例steals code用于格式化具有数千个分隔符的数字。 C-c C-c用于定义函数的代码,或添加到init文件中。

然后,使用elisp计算总计,并使用新的格式化函数进行转换。

#+begin_src elisp :results none
(defun my-thousands-separate (num)
  "Formats the (possibly floating point) number with a thousands
separator."
  (let* ((nstr (number-to-string num))
         (dot-ind (string-match "\\." nstr))
         (nstr-no-decimal (if dot-ind
                               (substring nstr 0 dot-ind)
                             nstr))
         (nrest (if dot-ind
                    (substring nstr dot-ind)
                  nil))
         (pretty nil)
         (cnt 0))
    (dolist (c (reverse (append nstr-no-decimal nil)))
      (if (and (zerop (% cnt 3)) (> cnt 0))
          (setq pretty (cons ?, pretty)))
      (setq pretty (cons c pretty))
      (setq cnt (1+ cnt)))
    (concat pretty nrest)))
#+end_src

| Item     | Quantity |      Price |          Ext |
|----------+----------+------------+--------------|
| Widget 1 | 10       | 1001001.00 |  10010010.00 |
| Widget 2 | 5        |  501001.00 |   2505005.00 |
| Widget 3 | 1        |   51001.00 |     51001.00 |
|----------+----------+------------+--------------|
|          |          |      Total | 12,566,016.0 |
#+TBLFM: $4=($2*$3);%.2f::@5$4='(my-thousands-separate (apply '+ '(@2..@4)));N

请注意,如果对行总计执行相同操作,则不能正确解释以逗号分隔的数字。

正确的方法应该是set the numeric locale并让printf做到这一点,但我不知道如何为emacs设置它。