2017-07-16 424 views
1

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

回答

3

您可以使用此正則表達式替換:

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

1

你可以嘗試以下的正則表達式:

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

1

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