转换 BigDecimal 区域设置相关的输入?

mem*_*und 2 java jsf

我正在尝试将值的输入字段保存到 BigDecimal。这已经有效了。但如果我输入不属于区域设置类型的小数分隔符,它会产生奇怪的结果。

例如:

class Payment {
   BigDecimal amount;
}

<p:inputText id="amount" value="#{payment.amount}">
  <f:convertNumber locale="en"/>
</p:inputText>
<h:outputText value="#{payment.amount}" />
Run Code Online (Sandbox Code Playgroud)

如果我输入 10,10 我得到: 1,010.00

所以该值被视为 1010 我该如何解决这个问题?我在这里做错了什么?

McD*_*ell 5

解析英语区域设置数字时,逗号并不重要。Java 的原始Number类型不会保留任何格式信息——那只是表示数据。

inputTextNumberConverter逻辑如下:

NumberFormat formatter = NumberFormat.getNumberInstance(Locale.ENGLISH);
// NumberConverter turns input string into Number
Number number = formatter.parse("10,10");
// Expression language coerces the Number to BigDecimal
BigDecimal decimal = BigDecimal.valueOf(number.doubleValue());
// On output back to browser:
String output = formatter.format(decimal);
System.out.println(output);
Run Code Online (Sandbox Code Playgroud)

outputText没有转换器,因此只会调用其toString()值绑定(. BigDecimal

我预计结果分别为1,0101010.0

的行为NumberConverter记录在javadoc中。EL 类型强制的规则记录在JSR 245中:

将 A 强制转换为数字类型 N

  • 如果 A 是 Number,则使用以下算法强制安静地键入 N:
    • 如果 N 是BigDecimal,
      • 如果 A 是 a BigInteger,则返回new BigDecimal(A)
      • 否则,返回new BigDecimal(A.doubleValue())

如果要使用用户的浏览器区域设置来解释数字格式,请删除区域设置属性。如果您希望转换器将句点和逗号视为小数分隔符,请提供您自己的转换器实现。