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})?$
正则表达式详细信息:
^
: 开始
(?=[\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);
我想验证一个货币字符串,其数字最大长度为 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})?$
正则表达式详细信息:
^
: 开始(?=[\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);