2016-02-26 3 views
3

Я хотел бы форматировать поля в таблице org-mode в качестве валюты - значение с символом валюты ($) и запятыми как разделители тысяч. Я использовал $%. 2f, чтобы получить, например. $ 1000,00, но как получить разделители запятой, например. $ 1,000,00? У меня RTFM, но, возможно, я слишком плотный, чтобы получить его. Любая формула calc или elisp в порядке. Смотрите таблицу ниже пример:Как форматировать поля таблицы в качестве валюты в org-mode

| 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(@[email protected]);$%.2f 

ответ

1

Я не нашел способа сделать это последовательно, так что вы получите номера с тысячами сепараторами, и эти цифры вместо правильно интерпретированы для дальнейших расчетов. Так что это не ответ, просто чтобы записать мои исследования.

Следующий пример steals code для форматирования чисел с разделителями тысяч. C-c C-c в коде для определения функции или добавления в файл инициализации.

Затем общая сумма вычисляется с использованием 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 '+ '(@[email protected])));N 

Обратите внимание, что если вы делаете то же самое для строки итогов, то разделенные запятыми номера не будут правильно интерпретированы для итога.

Правильный способ должен быть set the numeric locale и позволить printf делать трюк, но я не знаю, как установить это для emacs.

Смежные вопросы