【问题标题】:f:convertNumber doesn't throw conversion error on trailing alphabetic characters in decimalf:convertNumber 不会在十进制的尾随字母字符上引发转换错误
【发布时间】:2012-06-28 21:45:43
【问题描述】:

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

<f:convertNumber minFractionDigits="2" />

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

【问题讨论】:

    标签: jsf converter number-formatting


    【解决方案1】:

    这只是&lt;f:convertNumber&gt; 使用的java.text.NumberFormatstandard behavior:它会修剪第一个不允许的字符之后的所有条目(例如,输入区域设置中定义的字母或小数分隔符除外)。仅当违规字符位于开头时,转换才会失败。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2016-01-25
      • 2015-05-06
      • 1970-01-01
      • 2012-12-06
      相关资源
      最近更新 更多