【问题标题】:Regex Replace all but Numbers and Decimal Place正则表达式替换除数字和小数位以外的所有内容
【发布时间】:2019-12-11 10:57:00
【问题描述】:

在尝试对表单进行客户端验证时,我尝试替换特定输入中的所有字符,数字和小数除外。我不关心多个小数点,因为我在字符串上使用 parseFloat。

在进行故障排除时,我在这里遇到了这个问题,其中推荐的答案与我使用的正则表达式模式相同。 Regex to replace everything except numbers and a decimal point

虽然下面的模式可以很好地验证数字,但每次我尝试输入小数时,它都会被所有其他非数字字符删除。

tempVal = parseFloat($(this).val().replace(/[^.0-9]/g, ''));

我希望能够在输入框中同时输入数字和小数,而不会去掉小数。正如我所说,它与上面另一个问题中使用的模式完全相同,但似乎没有得到预期的结果。任何指导表示赞赏。

更新:

虽然这与我在上面提到(并链接到)的另一个问题相似,并且该问题的解决方案似乎与我使用的代码相同,但结果值将只允许数字,但仍然去掉小数。

这里是完整的 JQuery 代码:

$('#input1, #input2').on('keyup', function() {
    if (ignoreBackDelete()) {
        return;
    }

    tempVal = parseFloat($(this).val().replace(/[^.0-9]/g, ''));

    if (tempVal.length < 1) {
        $(this).val('');
    } else {
        $(this).val(tempVal);
    }
});

为了表明 ignoreBackDelete() 函数不是可能的罪魁祸首,这里也是该函数的代码:

function ignoreBackDelete() {
    var key = event.keyCode || event.charCode;

    if (key == 8 || key == 46) {
        return true;
    }

    return false;
}

我再次检查了我的代码,以确认在 #input1 或 #input2 中输入值时不会触发其他函数。

希望这可以为问题提供更多细节。

【问题讨论】:

  • 在控制台'asasas2a.322'.replace(/[^.0-9]/g, '')中尝试。所有作品
  • 上面使用的输入值@SouXin 工作正常。您在代码@Xthralls 中使用了什么输入?
  • @SouXin,我已经更新了原始问题以提供完整的代码。

标签: jquery regex


【解决方案1】:

正如您在我在这里创建的工作小提琴中看到的那样 https://jsfiddle.net/yosefrow/Lscyn8q3/2/

在processInput函数中

var processInput = function(inputValue) {
  let outputValue = parseFloat(inputValue.replace(/[^.0-9]/g, ''));
  console.log("outputValue: " +  outputValue);
  updateDOM(inputValue, outputValue);
};

线

outputValue = parseFloat(inputValue.replace(/[^.0-9]/g, ''));

在你的实现中比较

inputValue = $(this).val();
outputValue = parseFloat(inputValue.replace(/[^.0-9]/g, ''));

这意味着如果您的代码无法正常工作,可能与在定义inputValue之前或期间发生的一些预处理有关

也许有什么东西正在消除这些时期?也许您的 javascript 代码正在以某种方式处理以影响正则表达式中的句点?

编辑

根据添加的代码,我可以肯定地说,去除句点的函数是每次按键时调用的 parseFloat。因为 parseFloat 不会将 1234. 视为有效数字,所以即使 replace 方法没有,它也会将其删除。

你需要添加一个函数

  1. 跳过句号
  2. 健全性检查双周期。例如将双周期 .. 减少到一个周期 .
  3. 如果字符串中某处已存在句点,则忽略句点

您可能还希望合并现有的验证方法,例如

https://jqueryvalidation.org/number-method/

一种更简单的即时验证方法可能是在每次按键时简单地进行搜索替换,而不使用 parseFloat。

例如

// replace middle non float chars
outputValue = inputValue.replace(/[^.0-9]/g, '')
// replace non number start
outputValue = inputValue.replace(/^[^0-9]/g, '')
// replace double dots
outputValue = inputValue.replace(/\.\./g, '.')

请记住,它不会解决结束句号“。”所以可能在提交之前解析浮点数

【讨论】:

  • 我已经更新了问题并提供了完整的函数代码。输入#input1 或#input2 的值时,没有触发我编写的其他函数,所以我怀疑它与预处理错误有关。但我总是愿意被证明是错误的。
  • @Xthralls 我更新了我的答案来解释为什么你的月经被剔除。
  • 啊,我忽略了这一点。现在这很有意义,并且通过这些更改,它现在似乎工作正常。
  • 记住它不会解决结局。所以可能在提交之前解析浮动
  • 我的意思是结束点
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
相关资源
最近更新 更多