【问题标题】:Rounding using regular expressions使用正则表达式舍入
【发布时间】:2011-09-28 13:37:09
【问题描述】:

是否可以使用正则表达式对数字进行四舍五入?问题是我在一个文件中有很多超过 2 位小数的数字,我需要将它们移动到小数点后 2 位。

它在源文件中,所以理想情况下我想使用 Visual Studio 的查找和替换,但我不反对编写脚本以在文件上运行(将其视为纯文本)的想法,如果 regex 不有答案。

【问题讨论】:

    标签: regex decimal


    【解决方案1】:

    正如 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'
    

    匹配小数的正则表达式非常简单;例如,它与指数符号不匹配,但它应该给你一个想法。

    【讨论】:

    • 谢谢。这是我期望做的事情
    • 在 json 中替换:cutstr='{"probability": {"neg": 0.33828654512348322, "neutral": 0.79405570286895666,.... ReplaceRegExpr('\d\d{4,12} [},]',cutstr,' ',false)) {"概率": {"neg": 0.3382 "neutral": 0.7940 ...
    【解决方案2】:

    我认为你不能对数字进行四舍五入,因为正则表达式不能做加法。

    您可以按如下方式截断它们(这将在 Notepad++ 中工作):

    找到(\d*\.\d\d)\d*

    替换为\1

    【讨论】:

    【解决方案3】:

    嗯...至少你可以搜索(\d+\.\d\d\d)\d* 并将其替换为round($1, 2)

    是的,也许这不是你所期望的:)

    【讨论】:

    • 这是一个很好的建议,可以解决我的问题,但我同意 Tim 的回答,因为我想保持代码干净
    • 整洁。使用 JavaScript:string.replace(/(\d+\.\d\d\d)\d*/,function($0,$1) {return Math.round($1*100)/100;})
    • @Christophe : 对于 JS,我们也可以使用 return Number($1).toFixed(3).toString()(当然,速度争论随之而来)
    • 迟到总比不到好:在 javascript 中 - 您需要应用全局标志进行多次替换: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
    【解决方案4】:

    我刚刚想出了一个简单的方法来对一组 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?)
    

    然后是圆整和截断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多