转换BigDecimal语言环境的输入依赖?

时间:2012-02-28 16:11:37

标签: 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}" />

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

因此该值被视为1010 我怎么能解决这个问题?我在这里做错了什么?

TY

2 个答案:

答案 0 :(得分:4)

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

带有NumberConverterinputText的逻辑如下:

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,0101010.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
}