Javascript解析浮点数忽略逗号后的小数


80

这是一个简单的场景。我想显示在我的网站上显示的两个值的减法:

//Value on my websites HTML is: "75,00"
var fullcost = parseFloat($("#fullcost").text()); 

//Value on my websites HTML is: "0,03"
var auctioncost = parseFloat($("#auctioncost").text());

alert(fullcost); //Outputs: 75
alert(auctioncost); //Ouputs: 0

谁能告诉我我在做什么错?

Answers:


152

这是“按设计”。该parseFloat函数将仅考虑字符串的各个部分,直到in达到非+,-,数字,指数或小数点为止。一旦看到逗号,它将停止查找,仅考虑“ 75”部分。

要解决此问题,请将逗号转换为小数点。

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

9
这会在所有地区起作用吗?不使用逗号取决于您在OS中的区域设置吗?
Dusan Plavak 2015年

14
上面的代码只会删除第一个','。如果数字是700,000,000怎么办?您需要:.replace(/,/ g,'')
hyankov

17
我认为大多数人都忘记了逗号也可以用作千位分隔符,而不仅仅是十进制分隔符。
彼得·雷夫斯

3
您好,如果输入的5.200,75意思是五千二百七十五点。
hasan05

此答案仅在当前情况下有效,例如,如果数字为15,000,则显示15,这是不正确的!
itsHarshad

31

javascript的parseFloat不采用语言环境参数。所以你将不得不替换,.

parseFloat('0,04'.replace(/,/, '.')); // 0.04

19
如果数字是7,000,000.15,该怎么办?
彼得·雷夫斯

7
尝试解析字符串时,您负责使字符串看起来像浮点数。如果您的语言环境使用句点表示小数点,则可以在尝试将其解析为浮点数之前安全地剥离所有逗号(千位分隔符)。如果您的语言环境使用逗号代替小数点的句点,则可以安全地删除任何句点(千位分隔符),然后将逗号(小数点)更改为句点。
塔科马塔尔奥特曼



12

正如@JaredPar在他的答案中指出的,使用parseFloatreplace

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

只是将其替换commadotwill fix,除非这样的数字超过数千,1.000.000,00将为您提供错误的数字。因此,您需要替换comma删除dots

// Remove all dot's. Replace the comma.
var fullcost = parseFloat($("#fullcost").text().replace(/\./g,'').replace(',', '.'));

通过使用两个替换,您将能够处理数据而不会在输出中接收到错误的数字。


8

在一百万个1,234,567的情况下,最好使用此语法替换所有逗号

var string = "1,234,567";
string = string.replace(/[^\d\.\-]/g, ""); 
var number = parseFloat(string);
console.log(number)

g方法删除所有逗号。

此处查看Jsfiddle演示


7

JS中的数字使用.(句号/句点)字符表示小数点而不是,(逗号)。


1

对于到达这里的人,想知道如何处理可能涉及逗号(,)和句号(.)但可能不知道确切数字格式的问题-这是我在使用之前更正字符串的方法parseFloat()(借用其他答案的想法):

function preformatFloat(float){
   if(!float){
      return '';
   };

   //Index of first comma
   const posC = float.indexOf(',');

   if(posC === -1){
      //No commas found, treat as float
      return float;
   };

   //Index of first full stop
   const posFS = float.indexOf('.');

   if(posFS === -1){
      //Uses commas and not full stops - swap them (e.g. 1,23 --> 1.23)
      return float.replace(/\,/g, '.');
   };

   //Uses both commas and full stops - ensure correct order and remove 1000s separators
   return ((posC < posFS) ? (float.replace(/\,/g,'')) : (float.replace(/\./g,'').replace(',', '.')));
};
// <-- parseFloat(preformatFloat('5.200,75'))
// --> 5200.75

至少,这将允许解析英式/美式和欧洲十进制格式(假设字符串包含有效数字)。


它既适用于两种格式,1,234.561.234,56
适用

-1

在我的原籍国,货币格式为“ 3.050,89€”

parseFloat将点标识为小数点分隔符,要添加2个值,我们可以像这样输入:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.