在我的XHTML页面中,我有一些inputText字段,用户可以在其中插入格式为“999,999”的数值(最多三个整数值,最多三个十进制值)。小数点分隔符是“,”,因为我想使用意大利语语言环境格式化上述字段。
实际上这是我的p:inputText组件:
<p:inputText value="#{r.value}" id="verog_#{r.id}"
onkeypress="return isNumberKey(event)" />
isNumberKey()javascript函数仅启用允许的字符(数字和逗号):
function isNumberKey(evt)
{
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode == 44) return true;
if (charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
但是我无法控制允许的最大位数,因此用户可以输入一个类似“1234,5678”的数字,或者更糟糕的是,“12 ,, 34”。
我需要在客户端检查这些值,因为它们在对话框中。实际上,在点击“保存”按钮后,我在服务器端进行检查:
<p:commandButton value="save" action="#{myBean.saveAction}" ajax="true"
update=":growl" oncomplete="dialogVar.hide()">
<f:param name="action" value="#{action}" />
</p:commandButton>
但如果我输入错误,则对话框始终隐藏,并且用户被迫再次提交值。
我不能使用f:convertNumber,因为数据作为字符串保存在db上,而不是数字。
我也尝试使用p:inputMask组件,但我无法使其正常工作(可能缺乏知识):掩码“999?,999”不符合我的要求。
也许我可以使用转换器(p:inputText组件具有“converter”和“converterMessage”属性),但我的转换器尝试也失败了:
NumberFormat nf = NumberFormat.getNumberInstance(Locale.ITALIAN);
nf.setMaximumIntegerDigits(3);
nf.setMaximumFractionDigits(3);
String result = nf.format(submittedValue);
即使submittedValue为0,它也总是给我IllegalArgumentException。
我如何达到目标?提前谢谢。
答案 0 :(得分:0)
您需要在客户端测试整个值。
我用JS验证示例:http://jsfiddle.net/lechlukasz/w8K8j/1/
它在模糊时调用验证功能:
function valid(val) {
var reg = new RegExp('^[0-9]{1,3}(,[0-9]{1,3})?$');
if (!reg.test(val))
return false;
return true;
}
如果您想对按键进行完全验证,请不要忘记将昏迷作为最后一个字符(在最终字符串中是非法的,但在输入时是必需的)。