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

liu*_*hao 4 emacs elisp

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

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

(format "%0.2f" 1.2345)
(round 1.2)
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*ean 7

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

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

\,(...)在替换文本单元进行内插主叫括号Lisp的表达式的结果,并且\#&是指"无论整个图案匹配时,转换为数字".


Ehv*_*nce 6

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

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

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

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

这不是我最终得到的功能:

(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)))
                   )))))
Run Code Online (Sandbox Code Playgroud)

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