f:convertNumber不会在十进制的尾随字母字符上抛出转换错误

时间:2012-06-28 21:45:44

标签: jsf converter number-formatting

我正在使用<f:convertNumber>标记来转换小数输入。

<f:convertNumber minFractionDigits="2" />

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

1 个答案:

答案 0 :(得分:3)

这只是<f:convertNumber>使用standard behaviorjava.text.NumberFormat:它修剪了第一个不允许的字符后的所有条目(例如,字母或小数分隔符,而不是在输入区域设置)。如果违规字符位于开头,则转换仅失败。

我真的不喜欢这种行为,因为用户可能没有注意到他的错误输入值被修剪,导致意外和(甚至更糟)未被注意的自动修正为错误值。

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

另一种方法是编写自己的自定义转换器,扩展标准转换器,如in this answer所述。然后,您可以检查字符的值,如果找到任何字符,则直接中止进一步处理(抛出相应的转换异常)。如果该值已经是无字符的,则可以调用您派生的转换器的标准行为。

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