使用正则表达式过滤掉浮点数小数点

问题描述:

我有一些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

我想通使用将是实现这一目标的最佳途径。

我该如何指定在之后的两个数字将包含尾随零,而仍然不包括这两个数字中的任何零?

+0

'5.000000000000000000000'呢? –

+0

@ibrahimmahrir'5.000000000000000000000'会输出'5'。以您的示例更新问题。谢谢。 –

+0

这不会给你像'223.3284293.toFixed(2)'那样的舍入吗?'这会是一个问题吗? – sln

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

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

RegEx Demo

正则表达式破碎:

  • ^ - 在拍摄组点之前开始
  • (\d*)匹配和捕获数#1
  • (?:开始非捕获组
    • \.0*匹配斑点,随后的零个或更多0s
    • | OR
    • (\.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);

+1

@Kinduser:是的,用代码演示更新。 – anubhava

你可以尝试以下的正则表达式:

\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);

您可以使用^(\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")) 
 
);