Javascript parse float忽略了逗号后的小数

Onl*_*ere 70 javascript parsefloat

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

//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
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 132

这是"按设计".该parseFloat函数只会考虑字符串的各个部分,直到达到非+, - ,数字,指数或小数点.一旦它看到逗号就停止查看,只考虑"75"部分.

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

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));
Run Code Online (Sandbox Code Playgroud)

  • 我想大多数人都忘记了逗号可以用作千位分隔符,而不仅仅是小数分隔符. (12认同)
  • 上面的代码只会删除第一个','.如果这个数字是700,000,000怎么办?你需要:.replace(/,/ g,'') (11认同)
  • 这会在所有地区有效吗?是否使用逗号取决于您在操作系统中的区域设置? (9认同)
  • 您好,如果输入为“ 5.200,75”,那意味着五千二百零七十五。 (2认同)

Joe*_*Joe 26

javascript的parseFloat不接受locale参数.所以,你将不得不更换,.

parseFloat('0,04'.replace(/,/, '.')); // 0.04
Run Code Online (Sandbox Code Playgroud)

  • 如果这个数字是7,000,000.15怎么办? (14认同)
  • 在尝试解析它们时,您负责使字符串看起来像浮点数.如果您的语言环境使用小数点的句点,那么您可以安全地删除所有逗号(千位分隔符),然后再尝试将其解析为浮点数.如果您的语言环境使用逗号而不是小数点的句点,则可以安全地删除任何句点(千位分隔符),然后将逗号(小数点)更改为句点. (6认同)

T.J*_*der 18

parseFloat根据十进制文字的JavaScript 定义解析,而不是您的语言环境定义.(例如,parseFloat不支持语言环境.)JavaScript中的十进制文字.用于小数点.


小智 17

为什么不使用globalize?这只是您不使用英语时可以遇到的问题之一:

Globalize.parseFloat('0,04'); // 0.04
Run Code Online (Sandbox Code Playgroud)

stackoverflow上的一些链接可以查看:

  • 你忘了提到它只能在JQuery中工作. (4认同)

Mic*_*res 10

正如@JaredPar在他的回答中指出的那样使用parseFloatreplace

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));
Run Code Online (Sandbox Code Playgroud)

只需更换comma一个dot将修复,除非它是这样的数千个1.000.000,00数字将给你错误的数字.所以你需要更换comma删除dots.

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

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


Que*_*tin 6

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


mus*_*ria 6

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

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

g方法删除所有逗号。

此处查看Jsfiddle 演示

  • 谢谢你的信息。它是一个与任何其他解决方案一样的解决方案(没有什么是完美的)。欢迎您添加您的贡献,但请不需要“呃不”和投反对票。我们来这里是为了学习和互相帮助 (2认同)

sbg*_*gib 5

对于任何到达这里想知道如何处理可能涉及逗号 ( ,) 和句号 ( .) 但确切的数字格式可能未知的问题的人 - 这就是我在使用之前更正字符串的方式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(',', '.')));
};
Run Code Online (Sandbox Code Playgroud)
// <-- parseFloat(preformatFloat('5.200,75'))
// --> 5200.75
Run Code Online (Sandbox Code Playgroud)

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

  • 这个数字是多少?“1,234”?一千二百三十四零?还是一点二三四?上述函数假设是后者。是否存在其中之一而不是另一个,仍然是模糊的。人们只能确定两者是否都被使用,或者其中之一是否被多次使用。 (2认同)