【问题标题】:Remove leading zeros from a number in Javascript [duplicate]从Javascript中的数字中删除前导零[重复]
【发布时间】:2011-10-04 07:48:17
【问题描述】:

可能重复:
Truncate leading zeros of a string in Javascript

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

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

【问题讨论】:

  • 有什么用?您想格式化字段中的文本还是只想获得正确的十进制值? parseInt 采用第二个参数,基数,应该始终设置!将其设置为10
  • @felix。你已经输入了这个作为评论:) +1 为那个一元 + 没想到。

标签: javascript html parseint


【解决方案1】:

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

  1. parseIntradix 10
  2. Number Constructor
  3. Unary Plus Operator
  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);


更新(基于 cmets):为什么这不适用于“大数”?

对于基本类型Number,最安全的最大值是253-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类型的假设下执行的所有操作都会失败。

对于大于 253 的数字,最近添加了基元 BigInt。检查BigInthere 的浏览器兼容性。

转换代码会是这样的。

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

P.S:为什么基数对parseInt 很重要?

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

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

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

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

【讨论】:

  • 从问题中不清楚是否是这种情况,但这也会删除小数点后的任何内容。
  • parseInt("08") == 0,这是一个错误,使用另一个答案。
  • @Greg。谢谢(你的)信息。但我没有得到相关性。 parseInt("08", 10) 确实是8
  • 可能想提一下基数很重要,这样人们就不会犯和 greg 一样的错误。
  • 这不适用于表示为字符串的大数字。
【解决方案2】:

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

value = +value;

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

input.value = +input.value;

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

【讨论】:

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

正则表达式:

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

【讨论】:

  • 最好的解决方案,如果你有一个像 012A (街道号码)这样的字符串,这是要走的路。 ty
  • 不好的是,当用户可能希望将那个 1 保留为 0 时,它会将“0”变成“”。
  • @HermannIngjaldsson : 对于负前瞻可以使用replace(/^(?!0$)0+/, '')
  • @PranavCBalan 很好,但是如果用户输入诸如 00 或 000 之类的东西怎么办?
  • @Devid :为此,更简单的是使用积极的前瞻断言replace(/^0+(?=\d)/, '')
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
相关资源
最近更新 更多