2011-09-15 55 views
34

一种输入元素包含其中逗号或点作为小数分隔和空间数的可被用于组数千个这样的:字符串转换用点或逗号为十进制分隔符号在JavaScript

“1 ,2'
'110 000,23'
'100 1.23'

如何将一个将其转换为使用JavaScript浏览器中的浮点数?

使用jQuery和jQuery UI。 Number(string)返回NaNparseFloat()在第一个空格或逗号处停止。

回答

43

不要给第一替代:

parseFloat(str.replace(',','.').replace(' ','')) 
+27

这完全忽略了','常常被用作千位分隔符(分组)的事实。如果你在'1,000,000.00'这个数字上使用这个数字,你会得到'1',这显然是完全错误的。 – Thor84no

+0

@ Thor84no你以为他的代码将在EN文化运行,但如果数据将使用即法语,丹麦语,芬兰语,捷克语等语言的人投入,就不会有混乱。这一切都取决于使用代码 – Zbynek

+9

@Zbynek我并不是假设的。大多数(如果不是所有的语言/地区)使用某些描述的数字分组。使用的字符各不相同(例如'[。,']')。我指出这样的事实,即这段代码忽略了大量的输入,在答案中没有任何警告(并且没有办法知道它已经发生)的情况下,它会使其不正确。即使您列出的语言不会有这个问题,也不会否定这个事实,即在许多* *很多*种语言中它都会遇到这个问题。请注意,如果所讨论的语言使用'.'作为数字分组字符,它将同样被破坏。 – Thor84no

8

你可以用一个空字符串替换所有空格,由点全部昏迷,然后解析它。

var str = "110 000,23"; 
var num = parseFloat(str.replace(/\s/g, "").replace(",", ".")); 
console.log(num); 

我在第一个中使用了正则表达式,能够匹配所有空格,而不仅仅是第一个。

14

的完美解决方案

accounting.js是一个很小的JavaScript库的数量,资金和货币格式。

Check this for ref

+0

谢谢。这并不提供检查格式不正确的选项,但它是一个很好的基础库,可以在此基础上构建该功能。含糊结果的例子:http://jsfiddle.net/SkzYe/ –

+0

为了将来参考,该库已经移动到http://openexchangerates.github.io/accounting.js/ – Thor84no

7

我意识到我迟到了,但我想这是正确处理数字分组以及不同的小数点分隔符为货币的解决方案。由于这两个完全覆盖我的使用情况下,我写我自己的解决方案,它可能是有用的人:跟随

function parsePotentiallyGroupedFloat(stringValue) { 
    stringValue = stringValue.trim(); 
    var result = stringValue.replace(/[^0-9]/g, ''); 
    if (/[,\.]\d{2}$/.test(stringValue)) { 
     result = result.replace(/(\d{2})$/, '.$1'); 
    } 
    return parseFloat(result); 
} 

这应该去掉任何非数字,然后检查是否有一个小数点(或逗号)由两位数字并在需要时插入小数点。

值得注意的是,我专门针对货币,因此它假设无小数位或两位。除非您知道当前语言环境的具体情况,否则很难确定遇到的第一个潜在小数点是小数点还是数字分组字符(例如,1.542可能是1542),但它应该很容易定制通过将\d{2}$更改为与小数点后您期望的值相符的值。

-1

从数货币字符串很容易通过Number.prototype.toLocaleString。然而,反过来似乎是一个常见问题。 JS标准中可能不会获得千位分隔符和小数点。

在这个特殊的问题,千位分隔符是一个空白" ",但在许多情况下,它可以是一个周期"."和小数点可以是逗号","。如1 000 000,001.000.000,00。那么这就是我如何将它转换为适当的浮点数。

var price = "1 000.000,99", 
 
    value = +price.replace(/(\.|\s)|(\,)/g,(m,p1,p2) => p1 ? "" : "."); 
 
console.log(value);

所以替代品的回调需要"1.000.000,00"并将其转换为"1000000.00"。之后+在结果字符串的前面强制它成为一个数字。

这个功能其实是很方便。例如,如果你有p1 = ","更换p1 = ""部分在回调函数的1.000.000,00输入会导致1,000,000.00

+0

两个'“1 000 000,99”'和'“1 000 000.99”'产生'NaN'。你的语法也混淆了'p1 ='和'p2 ='实际上什么都不做。分配给它们的值将被返回,因为它是一个单独的语句箭头函数,但分配完全没有必要,只是使其更难阅读。 – Thor84no

+0

@ Thor84no感谢您的支持。 – Redu

5

什么:

parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.')); 
1

所有其他解决方案都需要你提前知道的格式。我需要在每种情况下检测(!)格式,这就是我最终的结果。

function detectFloat(source) { 
    let float = accounting.unformat(source); 
    let posComma = source.indexOf(','); 
    if (posComma > -1) { 
     let posDot = source.indexOf('.'); 
     if (posDot > -1 && posComma > posDot) { 
      let germanFloat = accounting.unformat(source, ','); 
      if (Math.abs(germanFloat) > Math.abs(float)) { 
       float = germanFloat; 
      } 
     } else { 
      // source = source.replace(/,/g, '.'); 
      float = accounting.unformat(source, ','); 
     } 
    } 
    return float; 
} 

这与以下情况下测试:

 const cases = { 
      "0": 0, 
      "10.12": 10.12, 
      "222.20": 222.20, 
      "-222.20": -222.20, 
      "+222,20": 222.20, 
      "-222,20": -222.20, 
      "-2.222,20": -2222.20, 
      "-11.111,20": -11111.20, 
     }; 

建议表示欢迎。

相关问题