1. ホーム
  2. java

[解決済み] DecimalFormat を使用してフォーマットすると、例外 - "Cannot format given Object as a Number" がスローされます。

2022-02-07 01:55:48

質問

これは繰り返しの質問のように見えるかもしれませんが、私は以下のすべてのリンクで試してみましたが、適切な答えを得ることができません。

与えられたオブジェクトを数値としてフォーマットできない コンボボックス

不正な引数例外

しかし、何が間違っているのかがわからない。以下は私のコードです。

DecimalFormat twoDForm = new DecimalFormat("#.##");
double externalmark = 1.86;
double internalmark = 4.0;
System.out.println(String.valueOf((externalmark*3+internalmark*1)/4));
String val = String.valueOf((externalmark*3+internalmark*1)/4);
String wgpa1=twoDForm.format(val); // gives exception
String wgpa2=twoDForm.format((externalmark*3+internalmark*1)/4)); // works fine
System.out.println(wgpa1);

format メソッドは Object 型の引数を取るので、String オブジェクトを渡したところ、例外が発生しました。

<ブロッククオート

スレッド "main" java.lang.IllegalArgumentException で例外が発生しました。できません 指定されたオブジェクトを数値としてフォーマットしてください。

しかし、引数としてdouble値を与えると、プログラムは正常に動作します。しかし、もしメソッドが Object を渡すと例外が発生するのはなぜですか? String を渡すと例外が発生し double ?

解決方法は?

その format() メソッドの DecimalFormat がオーバーロードされます。

動作例では、.NETを起動しています。

 public final String format(double number)

また、失敗した場合は、.NET Frameworkを起動することになります。

 public final String format (Object obj) 

最初のメソッドは、非常に特殊な引数を取ります。このメソッドでは double .

これは2つ目のケースとは異なり、受け入れられる型は非常に広範囲です : Object で、渡された型のチェックは実行時に行われます。

でない引数を与えることで double でなく String の場合、呼び出されるメソッドは2番目のものです。

このメソッドでは、(1) と (2) の間にある format(Object number, StringBuffer toAppendTo, FieldPosition pos) メソッドに期待します。 number のインスタンスである引数を返します。 Number クラス( Short , Long , ... Double ):

@Override
public final StringBuffer format(Object number,
                                 StringBuffer toAppendTo,
                                 FieldPosition pos) {
    if (number instanceof Long || 
        number instanceof Integer ||                   
        number instanceof Short || 
        number instanceof Byte ||                   
        number instanceof AtomicInteger ||
        number instanceof AtomicLong ||
        (number instanceof BigInteger && ((BigInteger)number).bitLength () < 64)) {

        return format(((Number)number).longValue(), toAppendTo, pos);
    } else if (number instanceof BigDecimal) {
        return format((BigDecimal)number, toAppendTo, pos);
    } else if (number instanceof BigInteger) {
        return format((BigInteger)number, toAppendTo, pos);
    } else if (number instanceof Number) {
        return format(((Number)number).doubleValue(), toAppendTo, pos);
    } else {
        throw new IllegalArgumentException("Cannot format given Object as a Number");
    }
}

を渡したのですが、これは String のインスタンスを作成します。

この問題を解決するには double 成功した場合のようにプリミティブを変換するか、あるいは String のインスタンスに変換します。 Number というように DoubleDouble.valueOf(yourString) .
私は、最初の方法( double をすでに使用しているコードでは、この方法がより自然です。 double プリミティブを使用します。
2つ目は String から Double .