3

私はJava 1.6を使用java.text.DecimalFormatしており、数値のフォーマットに使用しています。例えば

    DecimalFormat df = new DecimalFormat();
    df.setPositivePrefix("$");
    df.setNegativePrefix("(".concat($));
    df.setNegativeSuffix(")");
    df.setMaximumFractionDigits(2);
    df.setMinimumFractionDigits(2);
    df.setGroupingSize(3);

    df.format(new java.math.BigDecimal(100);

null値を 渡すたびにアプリケーションがクラッシュするdf.format(null)

Error: cannot format given object as a number 

私の質問は、 functionnullで値をどのように処理できますか?df.format()

関数にnull を渡し、上記のエラーの代わりにdf.format()返すようにしたいと思います。0.00

ありがとうございます

よろしく、

アンクシュ

4

2 に答える 2

10

null 値を渡すたびにアプリケーションがクラッシュする

はい、そうです。それは文書化された動作です:

スロー: IllegalArgumentException -がのインスタンスであるかnumberどうか。nullNumber

次:

null を df.format() 関数に渡し、上記のエラーの代わりに 0.00 を返したいと思います。

いいえ、うまくいきません。動作しないことが文書化されています。ただ通過しないでくださいnull... 検出するのは簡単です。したがって、これを使用できます:

String text = value == null ? "0.00" : df.format(value);

または

String text = df.format(value == null ? BigDecimal.ZERO : value);
于 2013-06-11T11:42:23.437 に答える
2

DecimalFormat を拡張すると、その API が壊れます (Jon Skeet によって正しく指摘されました) が、指定された DecimalFormat をラップする独自の Format を実装できます。

public class OptionalValueFormat extends Format {

  private Format wrappedFormat;

  private String nullValue;

  public OptionalValueFormat(Format wrappedFormat, String nullValue) {
    this.wrappedFormat = wrappedFormat;
    this.nullValue = nullValue;
  }

  @Override
  public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
    if (obj == null) {
      // Just add our representation of the null value
      return toAppendTo.append(nullValue);
    }

    // Let the default format do its job
    return wrappedFormat.format(obj, toAppendTo, pos);
  }

  @Override
  public Object parseObject(String source, ParsePosition pos) {
    if (source == null || nullValue.equals(source)) {
      // Unwrap null
      return null;
    }

    // Let the default parser do its job
    return wrappedFormat.parseObject(source, pos);
  }

}

これは の API を壊すことはありません。必要なのは null でないことjava.text.Formatだけだからです。toAppendTopos

の使用例OptionalValueFormat:

DecimalFormat df = ...

OptionalValueFormat format = new OptionalValueFormat(df, "0.00");
System.out.println(format.format(new java.math.BigDecimal(100)));
System.out.println(format.format(null));

結果:

100
0.00

残念ながら、私が知っているヘルパー ライブラリの中で、このようなフォーマット ラッパーを提供しているものはないため、このクラスをプロジェクトに追加する必要があります。

于 2015-05-05T15:02:36.213 に答える