【问题标题】:Using RegEx to filter out decimals from float使用 RegEx 从浮点数中过滤掉小数
【发布时间】:2017-07-16 16:59:29
【问题描述】:

我有一些带有大量小数的float 数字。我一直试图通过设置最多两位小数来保持整洁。

到目前为止,我使用的是toFixed(2)。只是为了让事情变得简单。

223.3284293.toFixed(2);

“223.33”

我现在需要一个更复杂的解决方案。我想要任何尾随零后面的最后 两个 数字。

例如1030.0002500082会给我1030.00025

此外,我想排除两位数的任何尾随零。

例如400.002010082会给我400.002

这里有更多例子:

380.12939499380.12

0.000039092000490.000039

0.00000040000040.0000004

39094.0302990000439094.03

75.0000003000000175.0000003

5.0000000000000000000005

我认为使用 是实现这一目标的最佳方式。

我如何指定 后的两个数字将包括尾随零,同时仍然排除这两个数字中的任何零?

【问题讨论】:

  • 5.000000000000000000000 呢?
  • @ibrahimmahrir 5.000000000000000000000 将输出 5。用你的例子更新了问题。谢谢。
  • 这不会像223.3284293.toFixed(2); 那样给你任何四舍五入,这会是个问题吗?
  • @sln 不。我只使用toFixed,因为它很简单。

标签: regex javascript regex floating-point numbers decimal


【解决方案1】:

您可以使用此正则表达式替换:

str = str.replace(/^(\d*)(?:\.0*|(\.0*[1-9]{1,2}).*)$/, '$1');

RegEx Demo

RegEx 拆分:

  • ^ - 开始
  • (\d*) 在捕获组#1 中匹配并捕获点之前的数字
  • (?:启动非捕获组
    • \.0* 匹配点后跟零个或多个 0s
    • |
    • (\.0*[1-9]{1,2}).* 匹配点后跟 0 个或多个 0s 后跟 1 或 2 个非零并在组 #2 中捕获它
  • )结束非捕获组
  • $结束

代码演示:

var arr = [
  '23.3284293',
  '1030.0002500082', 
  '400.002010082',
  '380.12939499', 
  '0.00003909200049', 
  '0.0000004000004', 
  '39094.03029900004', 
  '75.00000030000001', 
  '5.0000000'
];

arr = arr.map(str => str.replace(/^(\d*)(?:\.0*|(\.0*[1-9]{1,2}).*)$/, "$1$2"));

console.log(arr);

【讨论】:

    【解决方案2】:

    您可以尝试以下正则表达式:

    \d+(\.(0+|)[1-9][1-9]?|)
    

    let numbers = [
      '380.12939499', 
      '0.00003909200049', 
      '0.0000004000004', 
      '39094.03029900004', 
      '75.00000030000001', 
      '5.0000000'
    ];
    
    let res = numbers.map(v => v.match(/\d+(\.(0+|)[1-9][1-9]?|)/)[0]);
    
    console.log(res);

    【讨论】:

      【解决方案3】:

      您可以使用^(\d+(?:\.0*[1-9]{1,2})?).*$;捕获所有整数部分和小数(小数部分是可选的,因此如果模式不匹配,则只取整数部分),可选零后最多两个非零数字:

      var examples = ['380.12939499', '0.00003909200049', '0.0000004000004', '39094.03029900004', '75.00000030000001', '5.000000000000000000000'];
      
      console.log(
        examples.map(x => x.replace(/^(\d+(?:\.0*[1-9]{1,2})?).*$/, "$1"))
      );

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 2016-09-09
        • 2012-11-27
        相关资源
        最近更新 更多