Javascript将字符串转换为整数

Posted

技术标签:

【中文标题】Javascript将字符串转换为整数【英文标题】:Javascript convert string to integer 【发布时间】:2014-04-16 04:46:37 【问题描述】:

我只是将我的脚趾伸入令人困惑的 javascript 世界,更多是出于必要而非愿望,我遇到了两个整数相加的问题。

1,700.00 + 500.00

返回 1,700.00500.00

所以经过一些研究,我发现 1,700.00 被视为字符串,我需要对其进行转换。

为了解决这个问题,我阅读的最相关的页面是 this question 和 this page。但是当我使用

parseInt(string, radix)

它返回 1。我是否使用了错误的函数或不正确的基数(老实说,我无法理解如何决定使用哪个基数)。

var a="1,700.00";
var b=500.00;
parseInt(a, 10); 

【问题讨论】:

parseFloat ?我认为您无法解析数字1,700.00,您希望输出哪个数字? 【参考方案1】:

基本答案

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

var num = '1,700.00';

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

这将返回一个带有数字的字符串。现在你可以解析Int了。如果您不选择基数,它将默认为10,这是此处使用的正确值。

num = parseInt(num);

在添加它们之前对每个字符串数字执行此操作,一切都会正常。

更多信息

替换的工作原理:

更多关于替换的信息mdn:

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

全局搜索将查找所有匹配项(如果没有这个,它将在第一个匹配项后停止)'' 将匹配的部分替换为空字符串,实质上是删除它们。

正则表达式

测试正则表达式的好工具:Rubular 和更多关于它们的信息mdn 如果您正在寻找好的教程here is one。

ParseInt 和舍入,parseFloat

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

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

有关 parseInt 的更多信息,请查看mdn。

如果您不想四舍五入,也可以使用

parseFloat。我假设您这样做了,因为标题已转换为整数。下面的@fr0zenFry 就是一个很好的例子。他指出 parseFloat 也不采用基数,所以它总是在 base10 中。如需更多信息,请参阅mdn。

【讨论】:

成功了,谢谢。您能否为 .replace(/\,/g,''); 提供一些清晰的说明?以及为什么 parseInt 将 .00 放在字符串末尾? +1 感谢您在回答中指出我的观点。我已经用您的替代解决方案更新了我的答案(小数位)。如果您想在添加数字后进行比较,您的方法可能会更好。我使用toFixed() 将数字转换回字符串。【参考方案2】:

尝试使用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() 中不需要基数,它将始终返回十进制/base10 值。此外,它将去除小数点后末尾的任何多余零(例如: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。如果您将来想更改小数位,这可能会成为一个问题,您必须更改每个变量的乘法/除法因子。使用toFixed(),您只需更改参数即可。但请记住,toFixed() 将数字改回 为字符串,这与 @EpiphanyMachine 解决方案不同。所以你将是你自己的法官。

【讨论】:

你知道输入来自哪里吗?它可能来自愚蠢的用户输入或不正确的流程,如function getMeTheNumber()return 010.toString();; alert(parseFloat(getMeTheNumber().replace(/,/g, ''))),您的代码将失败。为什么不指定基数?你应该构建健壮的代码。 @RoyiNamir:我再次给出相同的答案:parseFloat() 不采用基数。它只能使用 base10(即十进制值)。它仅适用于parseInt()。 #ref1, #ref2, #ref3 @RoyiNamir:这是另一个不错的reference,你会喜欢的。 这似乎没有保留.oo。如何保留小数点后的数字? @tony09uk:更新了我的答案。另外,请注意toFixed() 会将数字转换为字符串。因此,比较可能对结果不起作用。【参考方案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 parseInt('010') in ie8 返回 8。如果你看到一个洞,不要试图堵住这个洞。绕过它。 这里我们说的是parseFloat(),这个规则在这里也适用吗?您将它与parseInt() 混淆了,parseFloat() 不需要第二个参数,它只需要十进制。如果我错了,请纠正我。 @Fr0zenFyr 如果参数是数字 parseFloat(010) 即 8 ( ie8 , heck -010 is 8),它将是必需的。这不是 OP 案例,因为他的输入是字符串。但是再次指定基数以确保所有情况的问题是什么?【参考方案4】:

Javascript 不理解那个逗号。像这样删除它:

a.replace(',', '')

去掉逗号后,解析字符串应该没有问题。

【讨论】:

这将只替换第一个匹配项。 @RoyiNamir:好点,你是对的。 TBH 我几乎不使用 Javascript。继续写一个更好的答案,我会投赞成票。

以上是关于Javascript将字符串转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

如何在JavaScript中将数字的二进制表示从字符串转换为整数?

如何将一串大数转换为整数?

JavaScript类型转换

javascript 如何将字符串转换成数字,小数!

javascript进制转换

在 Groovy 中将整数转换为十六进制字符串