- DecimalFormatのparseの戻り値はNumber。
- 何もしないと、Double(小数っぽい文字列の場合) or Long(整数っぽい文字列の場合)を返す。
- しかしsetParseBigDecimal(true)するとBigDecimalを返すようになる。
例えば次のように使えます。
//parseがBigDecimalを返すかどうか
DecimalFormat fmt = new DecimalFormat("##.00");
fmt.setParseBigDecimal(true);
String value = "10.1";
BigDecimal n = (BigDecimal) fmt.parse(value);
そもそもなんでこんなことを調べていたかというと、ClickのDoubleFieldを拡張してBigDecimalを扱える ように改造していたから。何もケアしないと入力のBigDecimalと出力のBigDecimalでスケールがことなり Beanの比較で失敗していたので、いろいろ調べていたのでした。
結局DoubleFieldを継承したクラスで次のようにメソッドをオーバーライドし、コンストラクタで渡された 小数部の長さをスケールとして持つBigDecimalを返すようにしました。
public Number getNumber() {
String value = getValue();
if (value != null && value.length() > 0) {
try {
BigDecimal n = (BigDecimal) getNumberFormat().parse(value);
//スケールを合わせないとequalsで等しいと見なされない。
// ex 100.00と100は等しくない
return n.setScale(decimalPartMaxLength);
} catch (ParseException nfe) {
return null;
}
} else {
return null;
}
}
public BigDecimal getBigDecimal() {
return (BigDecimal) getNumber();
}
public Object getValueObject() {
return getBigDecimal();
}