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

Tri*_*ipp 5 jsf converter number-formatting

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

<f:convertNumber minFractionDigits="2" />
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*ise 3

这只是所使用的标准行为:它会修剪第一个不允许的字符之后的所有条目(例如,除输入区域设置中定义的字母或小数分隔符之外的字母或小数分隔符)。仅当有问题的字符位于开头时,转换才会失败。java.text.NumberFormat<f:convertNumber>

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

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

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

这两种方法的缺点是您失去了convertNumber. 您没有诸如minFractionDigitscurrencySymbolon 之类的属性<f:converter>,因此如果您需要它,您必须找到另一种方法来传递参数。我们的实现不需要任何这些,所以我没有进一步研究这个(我们采用了方法 A),但这个答案提供了一种这样做的方法。