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.5
和 17500.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将字符串转换为整数的主要内容,如果未能解决你的问题,请参考以下文章