在Javascript中从数字中删除前导零

189

3
为什么?你是想格式化文本框内的文本,还是只是想获得正确的十进制值?parseInt函数有第二个参数——基数,应该总是设置为10 - Felix Kling
@felix。你已经将此输入为注释了 :) 因为一元的+,我没有想到加1。 - naveen
3个回答

305

我们可以使用四种方法进行这种转换:

  1. parseInt 方法并设置 进制 参数为 10
  2. Number 构造函数
  3. 一元加运算符
  4. 使用数学函数(减法)

const numString = "065";

//parseInt with radix=10
let number = parseInt(numString, 10);
console.log(number);

// Number constructor
number = Number(numString);
console.log(number);

// unary plus operator
number = +numString;
console.log(number);

// conversion using mathematical function (subtraction)
number = numString - 0;
console.log(number);


根据评论更新:为什么这在“大数”上不起作用?

对于原始类型Number,最安全的最大值是2的53-1次方(Number.MAX_SAFE_INTEGER)。

console.log(Number.MAX_SAFE_INTEGER);

现在,让我们考虑数字字符串'099999999999999999999',并尝试使用上述方法进行转换

const numString = '099999999999999999999';

let parsedNumber = parseInt(numString, 10);
console.log(`parseInt(radix=10) result: ${parsedNumber}`);

parsedNumber = Number(numString);
console.log(`Number conversion result: ${parsedNumber}`);

parsedNumber = +numString;
console.log(`Appending Unary plus operator result: ${parsedNumber}`);

parsedNumber = numString - 0;
console.log(`Subtracting zero conversion result: ${parsedNumber}`);

所有的结果都将是不正确的。

这是因为当进行转换时,numString值大于Number.MAX_SAFE_INTEGER。即,

99999999999999999999 > 9007199254740991

这意味着所有假设 string 可以转换为 number 类型的操作都将失败。

对于大于2的53次方的数字,最近已经添加了原始的BigInt。在此处检查BigInt的浏览器兼容性

转换代码将如下所示。

const numString = '099999999999999999999';
const number = BigInt(numString);

附注:为什么在使用 parseInt 时基数很重要?

如果未定义或设置基数为0(或不存在),JavaScript将做出以下猜测:

  • 如果输入字符串以 "0x" 或 "0X" 开头,则基数为16(十六进制),并解析字符串的其余部分。
  • 如果输入字符串以 "0" 开头,则基数为8(八进制)或10(十进制)。
  • 如果输入字符串以任何其他值开头,则基数是10(十进制)。

选择的确切基数取决于实现。 ECMAScript 5 指定使用10(十进制),但不是所有浏览器都支持这一点。

因此,在使用 parseInt 时,始终指定基数


4
从问题中并不清楚是否总是这样,但这也会删除小数点后的任何内容。 - pimvdb
3
parseInt("08") == 0,这是一个错误,请使用其他答案。 - Greg
2
@Greg。谢谢提供的信息。但我没有理解它的相关性。parseInt(“08”,10)确实是8 - naveen
9
建议提及进制的重要性,以免像格雷格一样犯同样的错误。 - Zach Lysobey
3
对于以字符串形式表示的大数,这种方法行不通。 - None
显示剩余6条评论

254

正则表达式:

"014".replace(/^0+/, '')

8
最佳解决方案,如果你有一个类似于012A(街道号码)的字符串,这是可行的方法。谢谢。 - cuzzea
19
不好的地方在于它会把用户想要保留的那个零变成空值(""),而不是保留为数字 0。 - john-jones
2
@HermannIngjaldsson:可以使用负向先行断言replace(/^(?!0$)0+/, '')来实现。 - Pranav C Balan
@PranavCBalan 这很好,但如果用户输入类似于00、000等内容怎么办? - Devid
23
@Devid 提供了一个更简单的方法,使用正向先行断言 replace(/^0+(?=\d)/, '')。请注意,这仅是翻译,不包含任何解释或其他内容。 - Pranav C Balan

26

不清楚你为什么想要这样做。如果你想获取正确的数值,你可以使用一元加操作符+[文档]

value = +value;

如果你只是想格式化文本,正则表达式可能更好。我会说这取决于你处理的值。如果你只有整数,那么

input.value = +input.value;

也可以。 当然,它也适用于浮点值,但是取决于小数点后有多少位,将其转换为数字再转回字符串可能会(至少对于显示来说)删除一些内容。


由于某些原因,这个不起作用了...请参见http://jsfiddle.net/8pYXH/ - copenndthagen
2
@hmthr:你没有给x赋一个字符串,而是一个数字。以零开头会被解释为八进制值。打印x,你会发现这个值已经是13了。使用字符串可行:http://jsfiddle.net/fkling/8pYXH/1/。 - Felix Kling
那么最终它仍然会是一个字符串吗?我希望最终的值应该是一个整数。 - copenndthagen
@hmthr:不会。你从字段中获取的值将是一个字符串。在应用一元运算符 + 后,它将变成一个数字(正如文档中所写)。请参见:http://jsfiddle.net/fkling/8pYXH/3/。 - Felix Kling

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