如何围绕一个地区的所有数字?

时间:2014-05-13 16:03:23

标签: emacs elisp

我正在编辑一个乳胶文件,其中一个表格中有太多小数位。如果我想将表格(或区域)中的所有数字四舍五入到十分之一或百分之一,我该怎么办?

我用Google搜索并找到了一些lisp函数,比如

(format "%0.2f" 1.2345)
(round 1.2)

等,但我不知道如何将它们应用于某个地区的所有数字。感谢。

2 个答案:

答案 0 :(得分:7)

您可以执行此任务,而无需以交互方式query-replace-regexp编写专用的Elisp函数:

C-米 - % [0-9]+\.[0-9]+ RET \,(format "%0.2f" \#&) RET

替换文本中的\,(...)表示插入调用带括号的Lisp表达式的结果,\#&表示"无论整个模式匹配,转换为数字。&#34 ;

答案 1 :(得分:6)

对我而言,这是一个常见的用例:搜索区域中的某些内容并使用匹配的文本执行某些操作。

这里有一个有用的代码段:http://wikemacs.org/wiki/Emacs_Lisp_Cookbook#Scripted_Use

我只需要将匹配的字符串转换为带string-to-number的int。

根据您的需要调整我的正则表达式。

这不是我最终的功能:

(defun my-round-nb (start end)
"round the nb of the region."
(interactive "r")
(save-restriction
  (narrow-to-region start end)
  (goto-char 1)
  (let ((case-fold-search nil))
    (while (search-forward-regexp "\\([0-9]+\\.[0-9]+\\)" nil t)
      (replace-match (format "%0.2f" (string-to-number (match-string 1)))
                   )))))

我的文档:http://wikemacs.org/wiki/Category:Emacs_Lisp