如图红框地方是个金额的输入框,两位小数,整数部分每三位加一个都逗号,求写一个正则表达式,判断输入的格式是否正确,谢谢了。
先确认下金额的规则:
1、可正、可负;
2、保留两位小数;
3、大于1的首位数字不能是0,即首位是0的只有一个;
3、整数部分是千分位形式:从个位开始每三位之间加一个逗号,高位可不足三个
正则: /^-?(0|[1-9](\d{1,2})?(,\d{3})*).\d{2}$/
js测试:
let regex = /^-?(0|[1-9](\d{1,2})?(,\d{3})*).\d{2}$/;
let arrTestData = ["0.00", "-1.01", "99,999.99"];
arrTestData.forEach(v => console.log(v, regex.test(v)));
结果:
0.00 true
-1.01 true
99,999.99 true
\d{1,3}(\,\d{3})\.\d{2}
^([1-9]\d{1,3})$|^(0|[1-9]\d{1,3}).(\d{1,2})$
改进下,
如果允许输入1位小数可用:^\d{1,3}(\,\d{3}){0,}.\d{1,2}$
如果只允许输入2位小数: ^\d{1,3}(\,\d{3}){0,}.\d{2}$
在发个严谨的,
(^([1-9])\d{0,2}(\,\d{3}){0,}.\d{1,2}$)|(^0.\d{1,2}$)
(^([1-9])\d{0,2}(\,\d{3}){0,}.\d{2}$)|(^0.\d{2}$)
这种是考虑是0开头的情况,只要小于1的情况下,0开头才生效;大于1的情况,首位不能是0.
如:
1,111,111,111.00 通过
0,111,111,111.00 不通过
^[1-9]\d{0,2}?(,\d{3})*.\d{2}$|^0.\d{2}$
稍微解释下:
前半段首位不为0的情况:[1-9]表示首位不能为0,
“\d{0,2}”表示0-9的数字可以出现两次,
"(,\d{3})*"表示","跟3位数字可以出现0次或者0次以上,后面再接小数点,最后跟两位小数
首位为0的情况,0开头,再接小数点,然后再跟两位小数
^([1-9]\d{0,2}(\,\d{3})*)(\.\d{2})$
以下测试粗体不通过,其他正常
1.00
12.00
100.00
1,100.00
1100.00
0,100.00
12,100.00
123,100.00
1,123,100.00
1,111,111,111.00
var pattern = /^\d{1,3}(,\d{3})*(.\d{2})?$/;
如果允许输入1位小数可用:^\d{1,3}(\,\d{3}){0,}.\d{1,2}$
如果只允许输入2位小数: ^\d{1,3}(\,\d{3}){0,}.\d{2}$
//value为你上述输入框中获取的变量值
通过 value.toString().replace(/(\d{1,2})(?=(\d{3})+\.)/g, '$1,') 可直接将金额转换成指定分隔格式