2

このコード スニペットを使用して文字列を double に変換する Android アプリケーションが市場に出回っています。文字列には、それが実際の 10 進数値であるかどうかを確認するための検証があります。ほとんどの場合、これは問題なく実行されますが、例外がスローされることがあります。これはローカリゼーションの問題であり、米国英語を使用していないデバイスで発生していると確信しています。

[ほとんどの場合、値 = 0 であることがわかっています。]

これが私のコードです。if else ブロックのコードが例外をスローします。

DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("en", "en"));
symbols.setDecimalSeparator('.');
DecimalFormat df = new DecimalFormat("#.##", symbols);
double temperature = Double.valueOf(numberString);
if (tempUnits.equals("f")) {
    mBBTValue.setText(df.format(temperature) + " °F");
} else {
    mBBTValue.setText(df.format(getTemperatureInCelcius(temperature) + " °C"));
}

このコードは、一部の国で次の例外をスローしています。

java.lang.IllegalArgumentException
at java.text.NumberFormat.format(NumberFormat.java:304)
at java.text.DecimalFormat.format(DecimalFormat.java:702)
at java.text.Format.format(Format.java:93)
at com.mysa.DetailsActivity$InitTask.onPostExecute(DayDataDetailsActivity.java:543)
at com.mysa.DetailsActivity$InitTask.onPostExecute(DayDataDetailsActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:4787)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
at dalvik.system.NativeStart.main(Native Method)

誰かがこのコードで私が間違っていることを説明してもらえますか?

4

2 に答える 2

3

// DecimalFormat df = new DecimalFormat("#.##", symbols); 問題の原因 http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

デフォルト ロケールを含む特定のロケールの NumberFormat を取得するには、getInstance() などの NumberFormat のファクトリ メソッドのいずれかを呼び出します。通常、NumberFormat ファクトリ メソッドは DecimalFormat 以外のサブクラスを返す可能性があるため、DecimalFormat コンストラクターを直接呼び出さないでください。フォーマット オブジェクトをカスタマイズする必要がある場合は、次のようにします。

NumberFormat f = NumberFormat.getInstance(loc); if (f instanceof DecimalFormat) { ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true); }

DecimalFormat は、パターンと一連の記号で構成されます。パターンは、applyPattern() を使用して直接設定するか、API メソッドを使用して間接的に設定できます。

于 2013-05-22T23:20:50.533 に答える