web-dev-qa-db-ja.com

特定のロケールを使用してJavaで文字列をDoubleに変換するにはどうすればよいですか?

文字列として取得した数値をDoubleに変換したいのですが、これらの数値は米国の標準ロケールではなく、別のロケールにあります。どうやってやるの?

38

_Java.text.NumberFormat_ を試してください。 Javadocsから:

異なるロケールの数値をフォーマットするには、getInstanceの呼び出しでそれを指定します。

_NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
_

NumberFormatを使用して数値を解析することもできます。

_myNumber = nf.parse(myString);
_

parse()Number を返します;したがって、doubleを取得するには、 myNumber.doubleValue() を呼び出す必要があります。

_    double myNumber = nf.parse(myString).doubleValue();
_

parse()nullを返すことはないため、これによってNullPointerExceptionが発生することはありません。代わりに、parseは、失敗した場合、チェックされたParseExceptionをスローします。

編集:最初に、doubleに変換する別の方法があると言いました:結果をDoubleにキャストし、ボックス化解除を使用します。 NumberFormatの汎用インスタンスが使用されていたため(Javadocの getInstance について)、常にDoubleが返されると思いました。しかし DJClayworth は、 parse(String, ParsePosition)parse(String)によって呼び出される)のJavadocが、可能であればLongが返されることを指摘している。したがって、Doubleへの結果のキャストは安全ではなく、試してはいけません!
ありがとう、DJClayworth!

65
Michael Myers

NumberFormatを使用する方法ですが、データが100%未満の場合に発生する特殊性に注意する必要があります。

私は次の便利なものを見つけました:

http://www.ibm.com/developerworks/Java/library/j-numberformat/index.html

入力が信頼できる場合は、心配する必要はありません。

7
Jasper Floor

NumberFormatここ は一例ですが、私は正しいと思います。

4
unwind

Javaとプログラミングを学習しています。同様の質問がありました。私の教科書で次のようなものを見つけました:

Scanner sc = new Scanner(string);
double number = sc.nextDouble();

この本によると、スキャナーは文字列変数の内容を自動的にデコードし、スキャナークラスは設定されたLocaleの言語に自動的に適応します。システムLocaleがデフォルトですが、他のものに設定するのは簡単です。

私はこの方法で問題を解決しました。たぶん、これは解析の代わりに上記の問題でうまくいくでしょうか?

追加:このメソッドが好きだった理由は、入力にスイングダイアログボックスを使用していて、解析で文字列をdoubleに変換しようとすると、NumberFormatExceptionが発生したという事実でした。 Scannerはすべての形式を処理できますが、解析では専らUS番号形式を使用していることがわかりました。スキャナーは、コンマ(、)小数点区切り文字を使用しても、入力を問題なく処理しました。最も投票された回答はparseを使用しているため、この特定の問題をどのように解決するかはわかりません。数値をUS形式で入力してから、ロケール形式に変換する必要があります。これは、数値キーボードにカンマが付けられている場合にはかなり不便です。

今、あなたは私をバラバラに細断するのは自由です;)

4
lytwaytLaz

これは、Java.text.DecimalFormatを使用しても問題ありません。

2
Roland Ewald

NumberFormat.getNumberInstance(Locale)を使用します

2
adrian.tarau

それがどのロケールか知っていますか?その後、使用できます

DecimalFormat format = DecimalFormat.getInstance(theLocale);
format.parse(yourString);

これは、科学的表記、パーセント記号付きの文字列、または通貨記号付きの文字列でも機能します。

1
Fortega