web-dev-qa-db-ja.com

parseDouble in Java結果はNumberFormatExceptionになります

プロパティファイルから情報を読み込もうとしていますが、次のコードがあります。

anInt = Integer.parseInt(prop.getProperty("anInt"));
aDouble = Double.parseDouble(prop.getProperty("aDouble"));

最初の行は問題なく機能しますが、double変数をロードしようとしている2番目の行はNumberFormatExceptionをスローします。特定の例外メッセージは次のとおりです。

Exception in thread "main" Java.lang.NumberFormatException: For input string: "78,5"
at Sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.Java:1222)
at Java.lang.Double.parseDouble(Double.Java:510)
at Assignment1.BaseStation.readPropertyFile(BaseStation.Java:59)
at Assignment1.BaseStation.main(BaseStation.Java:83)
9
nikos

Double.parseDouble()を使用して解析する場合は、カンマではなくピリオドを区切り文字として使用する必要があります。 Doubleクラスのドキュメントには、

FloatingPointLiteral ... [is] Java言語仕様のの字句構造セクションで定義されているとおりです。

From Java言語仕様:

FloatingPointLiteral:

  • 数字。数字opt ExponentPart opt FloatTypeSuffix opt
  • 。 Digits ExponentPart opt FloatTypeSuffix opt
  • Digits ExponentPart FloatTypeSuffix opt
  • Digits ExponentPart opt FloatTypeSuffix

ロケールを考慮したい場合は、Java.text.NumberFormatを使用できます。

NumberFormat nf = NumberFormat.getInstance();
double number = nf.parse(myString).doubleValue();
19
Malcolm

一部のEU諸国が使用しているように、「、」を使用する場合。ローカリゼーションには注意が必要です。

Java api http://docs.Oracle.com/javase/7/docs/api/Java/lang/Double.html を見てください

valueOfで、それは言った

To interpret localized string representations of a floating-point value, use subclasses of NumberFormat.

たとえば、このコードは問題を解決します。

NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
double number = nf.parse(myString).doubleValue();

重要なことの1つは、あなたのようなものを使用してはならないということです

Locale.setDefault(something);

JVM全体に影響を与える可能性があるためです。つまり、ローカリゼーションを使用している他のコードに影響を与える可能性があるということです。さらに、サーブレットコンテナ(共有Tomcatホスティングなど)などのコンテナを使用している場合は、同じJVMにある他のアプリに影響を与える可能性があります。

そしてほとんどの場合、Locale.setDefault()のようなものはローカルコンピューターで使用できますが、他のサーバー(共有Tomcatホスティング)にはJREが許可を設定している可能性があるため、デプロイできませんそのような方法を許可しないようにします。私は、優れたホスティングプロバイダーのほとんどがこれを行ったと確信しています。このようなコードをホスティングプロバイダーの共有Tomcatにデプロイできる場合は、別のホスティング会社に変更することを強くお勧めします。

4

「。」通常、カンマ区切り文字として使用されます。 「、」を使用したい場合は、ローカリゼーション設定を変更する必要があります。

 Locale.setDefault(Locale.GERMAN);   //German will do the trick, better to use your country code

または、「NumberFormat」クラスを利用します。それは本当によく説明されています このスタックオーバーフロースレッドで

3
mort