【问题标题】:How to properly validate decimal values?如何正确验证十进制值?
【发布时间】:2021-11-27 22:21:03
【问题描述】:

我正在编写一个输入字段清理函数,该函数应检查输入值是否为十进制。

测试用例:

  • 1234 - 是的
  • 12.34 - 是的
  • 0.123 - 是的
  • 000045 - 是的
  • 000.45 - 错误
  • .45685 - 错误
  • 5..454 - 错误
  • 55874. - 是的
  • 000000 - 是的
  • 0.0. - 错误

我不想显示验证错误,我只想防止用户输入错误的十进制值。

这个正则表达式/^[0-9]+\.?[0-9]+/ 涵盖了除第 5 点之外的所有情况。 我想这里唯一可以使用的方法是String.prototype.replace(),以便删除不需要的错误字符。

附:此验证与HTML input type number 原生验证非常相似,不同之处在于第 5 点被接受为有效数字类型。

更新!

const rgx = /^[0-9]+\.?[0-9]+$/

const cases = [
  ["1234", true],
  ["12.34", true],
  ["0.123", true],
  ["000045", true],
  ["000.45", false],
  [".45685", false],
  ["5..454", false],
  ["55874.", true],
  ['000000', true],
  ['0.0.', false],
]

cases.forEach(([str, result]) => {
  const actual = rgx.test(str);
  if (actual !== result) {
    console.log(`Test case "${str}" failed, gave ${actual} but expected ${result}.`);
  }
});

【问题讨论】:

  • 您不想阻止用户输入“55874”。从您的上一个用例开始,因为他们可能打算用另一个数字跟进,例如“55784.1”,这是一个有效的小数
  • 感谢您的留言,更新了问题。
  • 试试const rgx = /^(?:0(?:(?:0*[1-9]\d*)?|(?=\.))|[1-9]\d*)(?:\.[0-9]*)?$/
  • 案例 '00000' 失败但不应该。
  • 您根据@Dexygen 的评论编辑了问题,但您仍将"55874." 显示为匹配项。浮点数永远不会这样写。在下面的评论中,您声明“我需要用空字符串替换无效字符。”,但没有提及替换字符的问题。

标签: javascript html regex


【解决方案1】:

您可以测试字符串是否不以 2 个或多个零开头

^(?!00+\.)[0-9]+\.?[0-9]*$

Regex demo

请注意,您的模式 ^[0-9]+\.?[0-9]+$ 至少匹配 2 位数字,因为只有逗号是可选的。

const rgx = /^(?!00+\.)[0-9]+\.?[0-9]*$/

const cases = ["1234",
  "12.34",
  "0.123",
  "000045",
  "000.45",
  ".45685",
  "5..454",
  "55874.",
  "000000",
  "0.0."
]

cases.forEach(s => console.log(`${s} --> ${rgx.test(s)}`));

【讨论】:

  • 我需要用空字符串替换无效字符。
  • @NorayrGhukasyan 那么对于除000.45 之外的所有示例,这种模式^[0-9]+\.?[0-9]+$ 好吗
  • 请查看更新版本。 5645. 也是如此,因为用户可能打算用另一个数字跟进它,例如“55784.1”,这是@Dexygen 在评论中提到的有效小数。
  • @NorayrGhukasyan 这也将匹配末尾的一个点regex101.com/r/AtjNgX/1
  • 是的,我认为单独的答案并不合理,但我已经完成了这项工作,所以我忍不住发布了它。 “悬停”显然是在开玩笑。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多