Javaの小数点としての強制ポイント(“。”)


103

私は現在、次のコードを使用してdoubleを出力します。

return String.format("%.2f", someDouble);

ポイントを使用したいのに、Javaがロケールの小数点記号(カンマ)を使用することを除いて、これはうまく機能します。これを行う簡単な方法はありますか?


正確な小数でdouble値を使用する必要がある場合は、double / DoubleではなくBigDecimalを使用する必要があります。double変数を使用するときに発生する可能性がある問題については、このリンクを参照してください。これを試すこともできます:System.out.println(5.1d + 1.1d); -結果は6.2ではなく6.199999999999999になります。小数を文字列としてフォーマットする方法を検討している人は、二重変数をスキップする必要があると思います。
razvanone

回答:


172

のオーバーロードを使用してString.format、ロケールを指定できます。

return String.format(Locale.ROOT, "%.2f", someDouble);

ここにあるように、数値をフォーマットするだけの場合NumberFormatは、おそらく使用する方が適切でしょう。ただし、の残りのフォーマット機能が必要な場合はString.format、これで問題なく動作します。


6
Locale.ROOTはよりニュートラルです。
speedogoo 2016年

@speedogoo:編集済みですが、数値のフォーマットは疑わしいものの、違いはありません。
Jon Skeet 2016年

1
ええ、でもアメリカとイギリスのどちらかを選ぶ必要はありません。😜
speedogoo

2
Locale.ROOTは、国が選択した小数点記号の将来の変更に対しても安全です。
Attila Tanyi

IMOこれは質問に答えません。むしろLocale.setDefault(new Locale( "en"、 "US")); 他の答えで指摘されているように行います。それがグローバルであるために望ましくない副作用がある可能性があることは事実ですが、プログラマとしてのOTHで本当に欲しいのは、グローバルデフォルトがUSであることです。
nyholku

21

より抜本的な解決策は、main()の早い段階でロケールを設定することです。

お気に入り:

Locale.setDefault(new Locale("en", "US"));

11
これはグローバルな影響を与えるため、非常に問題の多い回答です。したがって、他の多くの(望ましくない可能性がある)変更が発生する可能性があります。
sleske 2016

2
IMOこれは質問に対する正しい答えであり、プログラマとしてはこれが私が欲しいものです。私が実際にローカライゼーションを必要とするコード内のすべての場所と同じように、JavaがデフォルトでUSロケールを使用するようにしたいので、コードで明示的にします。おそらく私の習慣だけかもしれませんが、printf / formatがローカルロケールの原因を使用する場合、10進数の 'コンマ'は、私が使用する他のソフトウェア(Matlabだれでも)と完全に互換性がありません。
nyholku

10

追加のロケールをjava.lang.String.formatとjava.io.PrintStream.printf(例:System.out.printf())に渡すことができます。

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

これにより、次の結果になります(私のPC上):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Java APIのString.formatを参照してください。


4
out.printf((Locale)null, ...)またはout.format((Locale)null, ...)を使用して、ロケールに依存しない表現を取得することもできます。(そしてそこにもありますLocale.ROOT
eckes

10

手遅れですが、ここで述べたように、NumberFormat(およびそのサブクラスDecimalFormat)の使用例です

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

DecimalFormatSymbolsこの方法の前に、セパレーターの作成と設定を一度行うべきだと感じています。
ライン

0

NumberFormatとDecimalFormatを使用できます。

JavaチュートリアルのLocaleSpecific Formattingからこのリンクを見てください。

ロケール依存の書式設定というタイトルのセクションが必要です。


-3

私は同じ問題が...持っていた55.1に変換します55,10。私の迅速な(汚い?)修正は:

String.format("%.2f", value).replaceAll(",",".");


1
これは、誰かが別のロケールでコードを実行しようとするまでのみ機能します。実際の解決策ではありません。-1
マルコフロイデンバーガー、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.