« Charu3ストックモードは便利 | メイン | フルレックスS »

DecimalFormatのparseでBigDecimalを返す

  • 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();
    }

トラックバック

このエントリーのトラックバックURL:
http://www.srcw.net/cgi/mt/mt-tb.cgi/75

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2007年08月10日 12:24に投稿されたエントリーのページです。

ひとつ前の投稿は「Charu3ストックモードは便利」です。

次の投稿は「フルレックスS」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。