Javascript 最大长度的货币正则表达式

Javascript regex for money with max length

我想验证一个货币字符串,其数字最大长度为 13,小数点后两位。我有一个逗号作为小数分隔符,一个句点作为千位分隔符。

我有这个正则表达式:

/^(\d{1}\.)?(\d+\.?)+(,\d{2})?$/

因为 sintax 有效但不适用于最大长度。我需要在此正则表达式中添加什么?

例如,这些字符串必须有效:

1.000.000.000.000
1.000.000.000.000,00
1
1,00
123,45

并且这些必须是无效的:

10.000.000.000.000
10.000.000.000.000,00
10.000.000.000.000.000
10.000.000.000.000.000,00

您可以使用此正则表达式进行验证:

^(?=[\d.]{1,17}(?:,\d{2})?$)\d{1,3}(?:\.\d{3})*(?:,\d{2})?$

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?=[\d.]{1,17}(?:,\d{2})?$):先行匹配点或数字 1 到 17 次,后跟可选的逗号和 2 个数字
  • \d{1,3}:匹配1到3位数字
  • (?:\.\d{3})*:匹配.后跟3位数字。重复此组 0 次或更多次
  • (?:,\d{2})?:匹配可选的,后跟2位小数
  • $:结束

也许尝试断言 position 后面不跟 18 digits/dots 使用否定前瞻:

^(?![\d.]{18})\d{1,3}(?:\.\d{3})*(?:,\d\d?)?$

在线查看demo。这里假设您还允许一位小数。

  • ^ - 打开线锚点。
  • (?![\d.]{18}) - 否定前瞻以防止 18 digits/dots 提前。
  • \d{1,3} - 一到三位数。
  • (?:\.\d{3})* - 一个非捕获组,由一个文字点后跟三个数字和 0+ 乘数组成。
  • (?:,\d\d?)? - 可选的非捕获组,由逗号后跟 1 位或两位数字组成。删除问号以使第二位小数成为非可选的。
  • $ - 结束行锚点。

90% 的时间有比使用正则表达式更好的解决方案。最好只是将您的字符串转换为实数,然后与您的限制进行比较(即 9999999999999.99)。

// Pass a string
function convertStr(string) {
  /*
  Remove all '.'
  Replace all ',' with '.'
  */
  let numStr = string.split('.').join('').replaceAll(',', '.');
  // Convert modified string into a real number
  let realNum = parseFloat(numStr);
  /*
  if converted string is a real number...
  round it to two decimal places and return it
  Otherwise return false
  */
  return !Number.isNaN(realNum) ? Math.round((realNum + Number.EPSILON) * 100) / 100 : false;
}

// Pass a string and the maxed number 
function numLimit(string, limit) {
  // Get the result of convertString()
  let number = convertStr(string);
  // if the result is equal to or less than limit...
  if (number <= limit) {
    return true;
  } else {
    return false;
  }
}

const limit = 9999999999999.99;
const valid = ['1.000.000.000.000',
  '1.000.000.000.000,00', '1', '1,00', '123,45'
];
const invalid = ['10.000.000.000.000', '10.000.000.000.000,00', '10.000.000.000.000.000', '10.000.000.000.000.000,00'];

let validResults = valid.map(str => numLimit(str, limit));

let invalidResults = invalid.map(str => numLimit(str, limit));

console.log('valid: ' + validResults);
console.log('invalid: ' + invalidResults);