JavaScript将字符串转换为整数

3
我只是在尝试学习javascript,更多的是出于必要而非兴趣。我遇到了一个问题,需要将两个整数相加。

1,700.00 + 500.00

得到的结果是1,700.00500.00

经过一些研究,我发现1,700.00被当作一个字符串来处理,因此我需要进行转换。
我阅读了这个问题这个页面中最相关的部分来解决这个问题。然而,当我使用 parseInt(string, radix)
时,它返回1。我是在使用错误的函数还是选择了错误的进制数(老实说,我无法理解如何决定使用哪个进制数)?
var a="1,700.00";
var b=500.00;
parseInt(a, 10); 

parseFloat?我认为你无法解析数字1,700.00,你期望输出哪个数字? - hawk
4个回答

4

基本答案

parseInt无法工作的原因是逗号。您可以使用正则表达式删除逗号,例如:

var num = '1,700.00';

num = num.replace(/\,/g,'');

这将返回一个包含数字的字符串。现在你可以使用parseInt函数。如果你没有选择基数,它将默认为10,这是在此处使用的正确值。

num = parseInt(num);

在将它们相加之前,对于每个字符串数字都要这样做,这样一切都应该正常工作。

更多信息

替换是如何工作的:

有关替换的更多信息,请参见mdn

`/` - start  
`\,` - escaped comma  
`/` - end  
`g` - search globally

全局搜索将查找所有匹配项(如果没有这个功能,它会在第一个匹配项后停止)
'' 用空字符串替换匹配的部分,从而删除它们。

正则表达式

  • 测试正则表达式的好工具: Rubular ,更多信息请访问:mdn
  • 如果你正在寻找一个好的教程 这里有一个

ParseInt和舍入, parseFloat

parseInt 总是四舍五入到最近的整数。如果你需要小数位数,有几个技巧可以使用。这是我最喜欢的:

2 places: `num = parseInt(num * 100) / 100;`
3 places: `num = parseInt(num * 1000) / 1000;`

更多关于parseInt的信息,请参考mdn
如果您不想四舍五入,也可以使用parseFloat。我假设您需要转换为整数,因此在标题中使用了“convert to an integer”。@fr0zenFry提供了一个很好的示例,他指出parseFloat也不会使用基数,因此始终是以十进制表示。有关更多信息,请参见mdn

已经起作用了,谢谢。您能否对.replace(/,/g,'');提供一些澄清,并解释为什么parseInt会删除字符串末尾的.00? - tony09uk
+1 感谢您在回答中注意到我的观点。我已经更新了我的答案,提供了另一种解决方案(针对小数位数)。如果想要在添加数字后进行比较,您的方法可能更好。我使用的是 toFixed(),它会将数字转换回字符串。 - Fr0zenFyr

4
尝试使用 replace(), 替换为 nothing,然后使用 parseFloat() 转换为浮点数。从OP的变量中可以看出,可能存在小数,因此在这种情况下,parseInt() 可能不起作用(小数点后的数字将被剥离)。
replace() 内部使用正则表达式来消除每个出现的 ,
var a = parseFloat('1,700.00'.replace(/,/g, '')); 
var b = parseFloat('500.00'.replace(/,/g, ''));
var sum = a+b;

即使您的数字是小数,例如1,700.55,这也可以为您提供正确的结果。

如果我按照您问题的标题来看,您需要一个整数。为此,您可以使用parseInt(string, radix)。它可以在没有radix的情况下工作,但最好指定它,因为您永远不知道浏览器可能会如何运行(例如,请参见@Royi Namir的注释)。该函数将把字符串四舍五入为最近的整数值。

var a = parseInt('1,700.00'.replace(/,/g, ''), 10);   //radix 10 will return base10 value
var b = parseInt('500.00'.replace(/,/g, ''), 10);
var sum = a+b;

请注意,在parseFloat()中不需要基数,它将始终返回一个十进制/基础10值。此外,它会在小数点后剥离任何多余的零(例如:17500.50变成了17500.517500.00变成了17500)。如果您需要始终获得2个小数位,请附加另一个函数toFixed(decimal places)
var a = parseFloat('1,700.00'.replace(/,/g, '')); 
var b = parseFloat('500.00'.replace(/,/g, ''));   
var sum = (a+b).toFixed(2);    //change argument in toFixed() as you need
// 2200.00

另一种解决方法是由@EpiphanyMachine提供的,需要您将每个值乘以100,然后再除以100。如果您未来想要更改小数位数,这可能会成为问题,因为您必须为每个变量更改乘法/除法因子。使用toFixed(),您只需更改参数即可。但请记住,toFixed()将数字更改回字符串,而不像@EpiphanyMachine的解决方案。所以你得自己判断。

你知道输入来自哪里吗?它可能是来自愚蠢的用户输入或不正确的流程,比如 function getMeTheNumber(){return 010.toString();}; alert(parseFloat(getMeTheNumber().replace(/,/g, ''))),这会导致你的代码失败。为什么不指定基数呢?你应该构建健壮的代码。 - Royi Namir
@RoyiNamir:再次回答你,parseFloat()不接受基数。它只能使用十进制(即十进制值)。这仅适用于parseInt()#ref1#ref2#ref3 - Fr0zenFyr
@RoyiNamir:这里有另一个你会喜欢的不错的参考资料 - Fr0zenFyr
这似乎无法保留 .oo。我如何保留小数点后的数字? - tony09uk
抱歉,这个问题已经回答了我之前的问题。https://dev59.com/VG855IYBdhLWcg3wSSKl - tony09uk
1
@tony09uk:我更新了我的答案。另外,请注意toFixed()会将数字转换为字符串。因此,对结果进行比较可能无法正常工作。 - Fr0zenFyr

3

试试这个:

parseFloat(a.replace(/,/g, ''));

它也适用于:1,800,300.33

示例:

parseFloat('1,700,800.010'.replace(/,/g, '')) //1700800.01


不,它不能在1,800,300.33上工作。使用 parseInt('1,800,300.33'.replace(/,/g,''),10); ,它会变成 1800300。请参阅我的答案,应该使用parseFloat() - Fr0zenFyr
我猜,也不需要基数。 - Fr0zenFyr
@Fr0zenFyr 在 ie8 中执行 parseInt('010') 返回的是 8。如果你看到一个洞,不要试图去堵住它,而是绕过它走。 - Royi Namir
我们在谈论 parseFloat(),这个规则也适用于它吗?你把它和 parseInt() 搞混了,parseFloat() 不需要第二个参数,只需要小数。如果我错了,请纠正我。 - Fr0zenFyr
@Fr0zenFyr 如果参数是数字 parseFloat(010),则需要它,这是8(即8,见鬼-010 is 8)。这不是OP的情况,因为他的输入是字符串。但是,为了确保所有情况下都正确,指定基数有什么问题呢? - Royi Namir
不,我只是说parseFloat()不需要使用基数参数。#ref1, #ref2, #ref3 - Fr0zenFyr

0
Javascript 不认识那个逗号。可以像这样删除它:
a.replace(',', '')

一旦你去掉了逗号,这个字符串就应该可以被顺利解析。


这将仅替换第一次出现的文本。 - Royi Namir
@RoyiNamir:说得好,你是对的。 说实话,我几乎不用JavaScript。 继续写一个更好的答案,我会点赞的。 - Nate C-K

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