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

IT技术 javascript html parseint
2021-03-11 00:13:04

可能的重复:
在 Javascript 中截断字符串的前导零

在 Javascript 中从数字中删除前导零的最简单且跨浏览器兼容的方法是什么?

例如,如果我有一个文本框值为 014 或 065,它应该只返回 14 或 65

3个回答

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

  1. 带有基数的parseInt 10
  2. 数字构造函数
  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_INTEGERIE,

99999999999999999999 > 9007199254740991

这意味着在假设string可以转换为number类型的情况下执行的所有操作失败了。

对于大于2 53 的数字BigInt最近添加了原语检查BigInt此处的浏览器兼容性

转换代码将是这样的。

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

PS:为什么基数对 很重要parseInt

如果 radix 未定义或为 0(或不存在),JavaScript 会假设如下:

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

究竟选择哪个基数取决于实现。ECMAScript 5 指定使用 10(十进制),但并非所有浏览器都支持它。

为此,在使用 parseInt 时总是指定一个基数

这不适用于表示为字符串的大量数字。
2021-04-25 00:13:04
从问题中不清楚是否曾经如此,但这也会删除小数点后的任何内容。
2021-04-26 00:13:04
@格雷格。谢谢(你的)信息。但我没有得到相关性。parseInt("08", 10)确实是8
2021-05-03 00:13:04
可能想提一下基数很重要,这样人们就不会像 greg 那样犯同样的错误。
2021-05-04 00:13:04
parseInt("08") == 0,这是一个错误,使用另一个答案。
2021-05-07 00:13:04

正则表达式:

"014".replace(/^0+/, '')
不好的是,当用户可能希望将那个 0 保留为零时,它会将“0”变成“”。
2021-04-17 00:13:04
@HermannIngjaldsson:对于可以使用的负面预测replace(/^(?!0$)0+/, '')
2021-04-17 00:13:04
@PranavCBalan 很好,但是如果用户输入诸如 00 或 000 之类的内容怎么办?
2021-04-17 00:13:04
@Devid:为此,使用积极的前瞻断言要简单得多 replace(/^0+(?=\d)/, '')
2021-04-28 00:13:04
最好的解决方案,如果你有一个像 012A(街道号码)这样的字符串,这是要走的路。
2021-05-01 00:13:04

目前尚不清楚您为什么要这样做。如果你想获得正确的数值,你可以使用一元+ [docs]

value = +value;

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

input.value = +input.value;

也很好。当然,它也适用于浮点值,但取决于点后有多少位数字,将其转换为数字并返回到字符串可以(至少用于显示)删除一些。

由于某些原因,这不起作用......见jsfiddle.net/8pYXH
2021-04-18 00:13:04
所以最后它仍然是一个字符串......我希望最终值应该是一个整数......
2021-04-29 00:13:04
@hmthr:不。您从字段中获得的值将是一个字符串。应用一元后+,它将是一个数字(如文档中所写)。参见:jsfiddle.net/fkling/8pYXH/3
2021-05-06 00:13:04
@hmthr:您没有为 分配一个字符串x,而是一个数字。前导零将被解释为八进制值。打印出来x,你会看到这个值已经是 了13使用字符串有效:jsfiddle.net/fkling/8pYXH/1
2021-05-14 00:13:04