我尝试使用Javascript来验证用户输入是否为有效的货币(美元和美分)金额,小数点右侧不超过两位数。
向左移动,然后执行模1失败,因为固有的浮点问题:
(parseFloat("19.99") * 100) % 1 // Returns 0.9999999999997726
我知道BigDecimal库,但我不确定转换为BigDecimal然后进行验证是正确的方法,因为它可以掩盖无效输入和浮点的问题。
目前,我的解决方法是针对以下正则表达式测试原始(字符串)输入:
/^\d*((\.\d{0,2})?)$/
这是否足以保证输入是货币格式的有效浮点数?如果没有,是否有基于数学的方法进行验证?
答案 0 :(得分:2)
你的正则表达式也会匹配空输入,这是不对的。
请尝试使用此正则表达式:
^(?=[^.])\d*(?:\.\d{0,2})?$
(?=[^.])
是一个预测,它将确保输入中至少有一个非点字符,以避免匹配空字符串。答案 1 :(得分:2)
如果你不需要使用RegExp,那么让JS的数学运算起来很重要:
var n=myInput.value;
if(!n || +(+n || 0).toFixed(2) != +n) {
alert("real numbers only!");
myInput.select();
}
验证例程部分组成并且用户体验很差,但数学是坚实且防弹的。