我正在尝试将值的输入字段保存到BigDecimal。哪个已经有效了。 但是如果我输入的不是语言环境类型的十进制分隔符,它会产生奇怪的结果。
例如:
class Payment {
BigDecimal amount;
}
<p:inputText id="amount" value="#{payment.amount}">
<f:convertNumber locale="en"/>
</p:inputText>
<h:outputText value="#{payment.amount}" />
如果我输入10,10 我得到:1,010.00
因此该值被视为1010 我怎么能解决这个问题?我在这里做错了什么?
TY
答案 0 :(得分:4)
解析英语区域设置号时,逗号不重要。 Java的原始Number
类型不会保留任何格式信息 - 这只是表示数据。
带有NumberConverter的inputText
的逻辑如下:
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);
outputText
没有转换器,因此只会在其值绑定上调用toString()
(BigDecimal
。)
我希望结果分别为1,010
和1010.0
。
NumberConverter
中记录了BigDecimal
的行为。 EL类型强制的规则记录在javadoc:
强制A到数字类型N
- 如果A是Number,则使用以下算法悄悄强制输入N:
- 如果N是
BigInteger
,
- 如果A是
new BigDecimal(A)
,请返回new BigDecimal(A.doubleValue())
- 否则,请返回{{1}}
如果要使用用户的浏览器区域设置来解释数字格式,请删除区域设置属性。如果您希望转换器将句点和逗号视为小数分隔符,请提供您自己的JSR 245实现。
答案 1 :(得分:0)
正如McDowel在评论中明确指出的那样 - EN语言环境表明,它是成千上万的分界符。是小数点的分隔符..如果你想使用&#34;,&#34;作为小数分隔符,使用具有给定格式的语言环境(例如法语(fr))
在java中,我建议如下:
// Using french locale as it is in form of "123 456 789,012345"
DecimalFormat df = (DecimalFormat)
NumberFormat.getInstance(Locale.FRENCH);
df.setParseBigDecimal(true);
// Replace all dots (due to the french format) so we handle "." as well as ","
hodnota = hodnota.replace('.', ',');
try {
return (BigDecimal) df.parseObject(hodnota);
} catch(ParseException e) {
// TODO: What ever you desire
}