当前位置: 首页 > 知识库问答 >
问题:

Javascript正则表达式,用于最大长度的money

笪建章
2023-03-14

我想验证一个数字最大长度为13、小数点为2的货币字符串。我用逗号作为十进制分隔符,用句点作为千位分隔符。

我有一个正则表达式:

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

For 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

共有3个答案

郎增
2023-03-14

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);
戎志勇
2023-03-14

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

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

正则表达式演示

正则表达式详细信息:

  • ^:开始
  • (? =[\d.]{1,17}(?:,\d{2})? $):预览匹配点或数字1到17次,后跟可选逗号和2位数字
  • \d{1,3}:匹配1到3位数字
  • (?:\.\d{3})*:匹配后跟3位数字。重复此组0次或更多次
  • (?:,\d{2})?:匹配可选的后跟2个十进制数字
  • $:结束
楚瑞
2023-03-14

可能尝试使用负前瞻性断言位置后面没有18位/点:

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

请参阅在线演示。这里假设您也允许一位数十进制。

  • ^-打开线锚
 类似资料:
  • 我不确定这是否可以使用正则表达式。我会尝试使用正则表达式,但如果不可能,我会切换到双重验证。 我的数据库(postgresql)接受为15,6(最多15位,最多6位小数),因此如果我有10位整数,我可以有5位小数。小数分隔符被忽略。 我目前有一个正则表达式(逗号是小数分隔符): 它不验证总长度,只验证左侧的数字。但由于用户也可以键入点(千位分隔符),我有一个怪物:

  • 我正在尝试构建一个正则表达式,它接受具有以下条件的域名: 允许DNS名称(仅允许连字符、句点和字母数字字符)最多255个字符 连字符只能出现在字母之间 应该以字母开头,以字母结尾。它至少有3个字符(字母和句点必填,连字符可选)。 周期前标签的长度应为63 可能的情况: a、 b.c a-a.b 不该通过的案子 a-b q wert q wert q wert q wert q wert q wer

  • 问题内容: 我一直认为,Java的regex-API(以及与此相关的许多其他语言)中的后置断言必须具有明显的长度。因此,STAR和PLUS量词在内部回顾中是不允许的。 优秀的在线资源regular-expressions.info似乎证实了我的一些假设: “ […] Java通过允许有限重复而向前迈进了一步。你仍然不能使用星号或加号,但是可以使用问号和花括号以及指定的max参数。Java认识到有限

  • 我有一个正则表达式,最多允许6个小数(“.”是小数分隔符) 我还想设置最大长度条件,以便用户只能输入12位数字,最大长度应排除“.”我如何使用正则表达式做到这一点。

  • 我需要根据给定条件验证输入, -总长度必须为20个字符-前五个位置必须是字母-剩余的应该是数字,但必须存在一个连字符(-),该连字符只能出现在数字之间。我喜欢正则表达式 但它也允许在结尾使用连字符,甚至可以不使用连字符。

  • 我在寻找一个正则表达式,它允许数字具有小数点后的最大长度。 它应该允许最大16位数字和3位小数,但是最大16位应该包括小数,但不包括。字符。到目前为止,我已经尝试过了:,除了允许17个单个数字之外,它很接近,而它应该只接受16个。如果我将更改为,它会破坏小数。 可接受值: 123 123.3 123.45 123.456 1111111111111.345(共16个数字) 111111111111