我正在使用<f:convertNumber>标记转换十进制输入。

<f:convertNumber minFractionDigits="2" />

但是它接受尾随的字母字符。例如,如果我输入12345.1234AAA,它将转换为12345.123。我希望它引发转换错误,而不是修剪字母字符。我怎样才能做到这一点?

最佳答案

这就是java.text.NumberFormat所使用的standard behavior <f:convertNumber> :它会修剪第一个不允许的字符之后的所有条目(例如,除输入语言环境中定义的字母或小数点分隔符外)。仅当令人反感的字符位于开头时,转换才会失败。

我真的不喜欢这种行为,因为用户可能不会注意到自己错误输入的值被修剪掉了,从而导致了意想不到的(甚至更糟的是)未被注意的自动校正为错误的值。

有趣的是,特定的数字转换器的行为有所不同。使用<f:converter converterId="javax.faces.Double" />不会自动处理非数字输入,但会导致转换失败。但是,标记不具有convertNumber的其他属性,例如minFractionDigits或货币符号。

一种不同的方法是编写您自己的自定义转换器,该转换器扩展了in this answer中描述的标准转换器。然后,您可以检查字符值,如果发现任何字符,则直接中止进一步处理(引发相应的转换异常)。如果该值已不含字符,则可以调用从其派生的转换器的标准行为。

两种方法的缺点是,您失去了convertNumber的其他功能。您在minFractionDigits上没有currencySymbol<f:converter>之类的属性,因此,如果需要此属性,则必须找到另一种传递参数的方法。我们的实现不需要任何这些,因此我没有进一步研究(我们采用了方法A),但是this answer提供了一种实现此目的的方法。

关于jsf - f :convertNumber doesn't throw conversion error on trailing alphabetic characters in decimal,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11253368/

10-09 23:07