如何在JavaScript中将字符串转换为浮点数?

315

我正在尝试从数据网格中解析两个值。这些字段是数字类型,但当它们含有逗号(例如,554,20)时,我无法获取逗号后面的数字。我已经尝试了parseIntparseFloat。请问我该如何处理?


参见:http://stackoverflow.com/questions/24318654 - dreftymac
9个回答

434

如果它们是要分开的值,尝试这样:

var values = "554,20".split(",")
var v1 = parseFloat(values[0])
var v2 = parseFloat(values[1])

如果它们是单一值(例如在法语中,半个值写作0,5)的话

var value = parseFloat("554,20".replace(",", "."));

6
如果逗号被用作千位分隔符,该怎么办? 例如,数字1234写为1,234。 - Chris B
6
你可以直接将逗号删除,然后解析它。(例如,用“”替换它) - Jesse Rusak
7
这并不是很安全,因为 sconto = parseFloat("5,,5".replace(",", ".")); 会返回 5,让人误以为它是一个有效的数字,但实际上你会失去 .5 部分,或者你可以认为它不是一个有效的数字。 - max4ever
1
如果你担心静默地接受无效的数字,你可以使用+(string)而不是像@Stev建议的那样使用parseString(string)。因此,第一个示例将是v1 = +(values[0]); v2 = +(values[1]); - Jesse Rusak
1
失败,如果我的数字是6.000.000。函数replace只会替换第一个逗号分隔符。 - GusDeCooL
显示剩余2条评论

63

你曾经尝试过这样做吗?:p

var str = '3.8';ie
alert( +(str) + 0.2 );

+(string)可以将字符串强制转换为浮点数。

很方便!

因此,为了解决您的问题,您可以像这样做:

var floatValue = +(str.replace(/,/,'.'));

8
我非常喜欢使用+(str)的解决方案 - parseFloat会忽略数字后面的无效字符,而在这些情况下+(str)将返回NaN,这正是我需要的。 - Alex

47

将逗号替换为点号。

这将仅返回554:

var value = parseFloat("554,20")

这将返回554.20:

var value = parseFloat("554.20")

因此,最终你可以简单地使用:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",","."))

请注意,parseInt() 只能用于解析整数(不能解析浮点数)。在您的情况下,它只会返回 554。此外,在浮点数上调用 parseInt() 不会四舍五入数字:它将取其 floor(最接近较低的整数)。


以下是回答 Pedro Ferreira 在评论中提出的问题的扩展示例:

如果文本字段包含像 1.234.567,99 这样的千位分隔符,可以先使用另一个 replace 函数将其删除:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))

那么千位分隔符“.”呢?像4.554,20会返回什么呢? - Pedro Ferreira

17

如果您像这样扩展String对象...

String.prototype.float = function() { 
  return parseFloat(this.replace(',', '.')); 
}

..你可以像这样运行它

"554,20".float()
> 554.20

同时也适用于句点

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"

10
尽管通常认为修改基本对象原型是不好的做法,但如果另一个框架也尝试这样做并且功能不同呢? - phreakhead

3

@GusDeCool或其他试图替换一千个以上分隔符的人,一种方法是使用正则表达式全局替换:/foo/g。请记住,.是元字符,因此您必须对其进行转义或将其放入方括号中(\.[.])。以下是一种选项:

var str = '6.000.000';
str.replace(/[.]/g,",");

1
是的,没有正则表达式的替换只会替换一个字符的出现。 - Aukhan

2
您可以使用这个函数。它将用空格替换逗号,然后解析浮点数值,最后再次调整值中的逗号。
function convertToFloat(val) {
        if (val != '') {
            if (val.indexOf(',') !== -1)
                val.replace(',', '');
            val = parseFloat(val);
            while (/(\d+)(\d{3})/.test(val.toString())) {
                val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
            }
        }
        return val;
    }

2

如果有人想要从任意字符串中解析出 浮点数,可以按照以下方法进行:

代码如下:

function extractFloat(text) {
  const match = text.match(/\d+((\.|,)\d+)?/)
  return match && match[0]
}

extractFloat('some text with float 5.25') // 5.25

1

尝试

let str ="554,20";
let float = +str.replace(',','.');
let int = str.split(',').map(x=>+x);

console.log({float,int});


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接