我正在使用<f:convertNumber>
标记来转换小数输入。
<f:convertNumber minFractionDigits="2" />
但它正在接受尾随的字母字符。例如,如果我输入12345.1234AAA
,则会转换为12345.123
。我希望它抛出转换错误而不是修剪字母字符。我怎样才能做到这一点?
答案 0 :(得分:3)
这只是<f:convertNumber>
使用standard behavior的java.text.NumberFormat
:它修剪了第一个不允许的字符后的所有条目(例如,字母或小数分隔符,而不是在输入区域设置)。如果违规字符位于开头,则转换仅失败。
我真的不喜欢这种行为,因为用户可能没有注意到他的错误输入值被修剪,导致意外和(甚至更糟)未被注意的自动修正为错误值。
有趣的是,具体的数字转换器表现不同。使用<f:converter converterId="javax.faces.Double" />
不会自动处理非数字输入,而是会导致转换失败。但是,标记不具有convertNumber的附加属性,例如minFractionDigits或货币符号。
另一种方法是编写自己的自定义转换器,扩展标准转换器,如in this answer所述。然后,您可以检查字符的值,如果找到任何字符,则直接中止进一步处理(抛出相应的转换异常)。如果该值已经是无字符的,则可以调用您派生的转换器的标准行为。
这两种方式的缺点是你失去了convertNumber
的附加功能。您在minFractionDigits
上没有currencySymbol
或<f:converter>
等属性,因此如果您需要此属性,则必须找到另一种传递参数的方法。我们的实现不需要任何这些,所以我没有进一步研究(我们采用方法A),但this answer提出了一种方法。