【发布时间】:2011-09-28 13:37:09
【问题描述】:
是否可以使用正则表达式对数字进行四舍五入?问题是我在一个文件中有很多超过 2 位小数的数字,我需要将它们移动到小数点后 2 位。
它在源文件中,所以理想情况下我想使用 Visual Studio 的查找和替换,但我不反对编写脚本以在文件上运行(将其视为纯文本)的想法,如果 regex 不有答案。
【问题讨论】:
是否可以使用正则表达式对数字进行四舍五入?问题是我在一个文件中有很多超过 2 位小数的数字,我需要将它们移动到小数点后 2 位。
它在源文件中,所以理想情况下我想使用 Visual Studio 的查找和替换,但我不反对编写脚本以在文件上运行(将其视为纯文本)的想法,如果 regex 不有答案。
【问题讨论】:
正如 Ryan 指出的那样,您不能单独使用正则表达式,但您可以使用正则表达式在输入中查找小数,并在替换操作中使用回调函数。
在 Python 中:
>>> import re
>>> text = "1.234 and 99.999; .555 12.345"
>>> simpledec = re.compile(r"\d*\.\d+")
>>> def mround(match):
... return "{:.2f}".format(float(match.group()))
...
>>> re.sub(simpledec, mround, text)
'1.23 and 100.00; 0.56 12.35'
匹配小数的正则表达式非常简单;例如,它与指数符号不匹配,但它应该给你一个想法。
【讨论】:
我认为你不能对数字进行四舍五入,因为正则表达式不能做加法。
您可以按如下方式截断它们(这将在 Notepad++ 中工作):
找到(\d*\.\d\d)\d*
替换为\1
【讨论】:
"C51.13333,85.23333".replace(/(\d*\.\d\d)\d*/g, '$1')jsfiddle.net/v1aqbeck
嗯...至少你可以搜索(\d+\.\d\d\d)\d* 并将其替换为round($1, 2)。
是的,也许这不是你所期望的:)
【讨论】:
string.replace(/(\d+\.\d\d\d)\d*/,function($0,$1) {return Math.round($1*100)/100;})
return Number($1).toFixed(3).toString()(当然,速度争论随之而来)
string.replace(/(\d+\.\d\d\d)\d*/g, (s) => { return Math.round( parseFloat(s) * 100 ) / 100).toString(); });
string.replace(/(\d+\.\d\d\d)\d*/g, (s) => { return Math.round( parseFloat(s) * 100 ) / 100}).toString();jsfiddle.net/uso58hkL
我刚刚想出了一个简单的方法来对一组 Google BigQuery 结果中的结果进行四舍五入 - 他们的 SQL 子集不允许您四舍五入到特定的小数位 a.f.a.i.k.,但它确实支持正则表达式。
由于正如上面提到的那样,正则表达式无法添加,那么只要您可以以某种方式为每个值添加一个常量,您仍然可以在那里获得其余的方式:
+ 0.5 if you're rounding up to the nearest integer
+ 0.05 if you are rounding up to the nearest 0.1
+ 0.005 if you are rounding up to the nearest 0.01 etc.
... 等 - 基本上添加最小精度值的一半以获得舍入效果。
然后对结果运行正则表达式提取。以上这些可能会为此工作。
这是我确定的正则表达式模式——它不是最强大的,但可以处理已知为基本浮点格式的数字:
+ for 0.1 precision use (-?\d*\.?\d?)
+ for 0.01 precision use (-?\d*\.?\d?\d?)
+ for 0.001 precision use (-?\d*\.?\d?\d?\d?)
然后是圆整和截断。
【讨论】: