【发布时间】:2010-04-23 01:22:33
【问题描述】:
我有这样的表格的文本文件:
Investment advisory and
related fees receivable (161,570 ) (71,739 ) (73,135 )
Net purchases of trading
investments (93,261 ) (30,701 ) (11,018 )
Other receivables 61,216 (10,352 ) (69,313 )
Restricted cash 20,658 (20,658 ) -
Other current assets (39,643 ) 14,752 64
Other non-current assets 71,896 (26,639 ) (26,330 )
由于这些是会计数字,括号内的数字表示负数。 破折号代表 0 或没有数字。
我希望能够标记一个矩形区域,例如上面的第三列,
调用一个函数(format-thousands-column),并自动拥有
-73.135-11.018-69.313+0.064-26.330 坐在我的杀戮圈里。
这是我想出的:
(defun div_by_1000 (astr)
(number-to-string
(/ (string-to-number astr) 1000.0))
)
(defun format-column-base (format-hook)
"format accounting numbers in a rectangular column. format-column puts the result
in the kill-ring"
(copy-rectangle-to-register 0 (min (mark) (point)) (max (mark) (point)) nil)
(with-temp-buffer
(insert-register 0)
(replace-regexp "[^0-9.+( \n]" "" nil (point-min) (point-max))
(goto-char (point-min))
(while (search-forward "(" nil t)
(replace-match "-" nil t)
(just-one-space)
(delete-backward-char 1)
)
(kill-new
(replace-regexp-in-string
"+-" "-" (mapconcat format-hook
(split-string (buffer-substring (point-min) (point-max))) "+")))))
(defun format-column ()
(interactive)
(format-column-base 'identity)
)
(defun format-thousands-column ()
(interactive)
(format-column-base 'div_by_1000)
)
(global-set-key "\C-c\C-f" 'format-thousands-column)
(global-set-key "\C-c\C-g" 'format-column)
虽然它似乎可以工作,但我怀疑这个函数编码不好。
你有没有更好的写format-column-base的方法,或者除非这样,
您能否就如何改进此代码提出建议?
编辑:我做了一些改进;它现在可以对数字进行简单的处理,例如将每个数字除以 1000。对每个数字的处理也可以使用 format-hook 进行自定义。
【问题讨论】:
标签: elisp