我正在尝试将值的输入字段保存到 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 我该如何解决这个问题?我在这里做错了什么?
蒂
解析英语区域设置数字时,逗号并不重要。Java 的原始Number
类型不会保留任何格式信息——那只是表示数据。
inputText
NumberConverter的逻辑如下:
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,010
和1010.0
。
的行为NumberConverter
记录在javadoc中。EL 类型强制的规则记录在JSR 245中:
将 A 强制转换为数字类型 N
- 如果 A 是 Number,则使用以下算法强制安静地键入 N:
- 如果 N 是
BigDecimal
,
- 如果 A 是 a
BigInteger
,则返回new BigDecimal(A)
- 否则,返回
new BigDecimal(A.doubleValue())
如果要使用用户的浏览器区域设置来解释数字格式,请删除区域设置属性。如果您希望转换器将句点和逗号视为小数分隔符,请提供您自己的转换器实现。
归档时间: |
|
查看次数: |
10210 次 |
最近记录: |