输入小数时如何使用正则表达式保留0起始字符?

时间:2018-08-19 02:51:41

标签: javascript regex

我使用此代码替换数字字符,当数字以0开头时,例如“ 000001111”或“ 0000000”,将替换0。“ 000001111”更改为“ 1111”,“ 0000000”更改为“ 0”。

但是当我输入一个小数时,想要这个。

例如,我输入“ 00012.340”,保持“ 12.34”,当我输入“ 00.00”时保持“ 0.0”,当我输入“ 000.0012”时保持“ 0.0012”。 如何修复我的代码的onkeyup?

我的代码:

<input id="text_target_value" maxlength="11" class="text-right number" type="text" onkeyup="value=value.replace(/[^\d]+|^0+(?!$)/g, '')" style="display: inline-block;">

2 个答案:

答案 0 :(得分:2)

因此,您要修剪前导零,如果要在后面加上小数点或字符串的末尾,则保留一个前导零,您要在其后修剪尾随零小数点。

您可以使用以下字符匹配非数字,非句点字符:

[^\d.]

您可以将不希望有的前导零与匹配

^0+(?=0(\.|$)|\d)

换句话说,匹配前导零,后跟0.0和字符串的末尾,或其他某个数字。

以上两种模式都可以用空字符串替换。

然后,要修剪后缀的零,则必须捕获一组中的小数点和十进制数字,然后匹配尾随的零,然后替换第一个被捕获的组:

document.querySelector('#text_target_value').onkeyup = function() {
  this.value = this.value
    .replace(/[^\d.]+|^0+(?=0(\.|$)|\d)/g, '')
    // Still need to trim trailing zeros after decimal point:
    .replace(/(\.\d*[1-9])0+$/, '$1');
}
<input id="text_target_value" maxlength="11" class="text-right number" type="text">

可能更清楚地先替换非数字和非句点,并保持前导零的正则表达式分开:

this.value = this.value
  // Replace anything that isn't a digit or a period:
  .replace(/[^\d.]+/g, '')
  // Replace undesirable leading zeros:
  .replace(/^0+(?=0(\.|$)|\d)/g, '')
  // Still need to trim trailing zeros after decimal point:
  .replace(/(\.\d*[1-9])0+$/, '$1');

答案 1 :(得分:0)

您不需要多次调用replace()方法。您可以一步一步完成:

value.replace(/^0*(?!\.)|(0)0*$/g, '$1');

正则表达式:

^0*(?!\.)|(0)0*$

这将匹配所有不立即跟在小数点后的前0个和后所有0个。然后尝试用$1替换整个匹配项,当满足交替的第二面时,该匹配项具有一个值。