5

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

<f:convertNumber minFractionDigits="2" />

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

4

1 回答 1

3

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

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

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

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

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

于 2012-10-17T11:54:44.527 回答