Javaで桁区切り記号を設定する方法は?


129

Javaで桁区切り記号を設定する方法は?
BigDecimalの文字列表現があり、これを3桁の区切り記号でフォーマットして、文字列として返します。


これらの値をDBから取得していますか?
デッドプログラマ

回答:


110

これは動作するはずです(テストされていない、JavaDocに基づく):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

JavaDocによると、ほとんどのロケールでは、最初の行のキャストは保存する必要があります。


16
これに対する未テストのコメント:JavadocのコメントgetDecimalFormatSymbols()Returns: a copy of the desired DecimalFormatSymbols。したがってsetDecimalFormatSymbols(theCopy)、コピーを変更してから使用する必要があります。
java.is.for.desktop

6
bd.longValue()のドキュメントでは、「小数部分は破棄されます」と記載されています。あなたは精度心配している場合、これは、これを行うための最善の方法である場合、私は知らないので
codinguser

2
使用newしてフォーマッタに戻すことができると思います: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

グループ区切り文字として\ u00a0(改行しないスペース)を使用することをお勧めします。一部のロケールのデフォルトです。
ACV 2016年

3
なぜlongValueを呼び出すのですか?問題は、長い間ではなく、BigDecimalに数千の演算子を設定することでした。
FINDarkside 2017

232

"、"でフォーマット関数を使用できます。

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

「、」には、ロケール固有のグループ化文字が含まれます。

docs


11
.セパレータとして使用したい場合はどうなりますか?
Enissay、2015年

私は通常String.formatを使用しているので、それが私にとって最良かつ最も簡単です。
アリ

16
format()明示的なロケール(セパレーターとしてLocal.US使用,されることが知られている)で@Enissayを呼び出し,、カスタムセパレーターに置き換えますString.format(Locale.US, "%,d", n).replace(',', '.')
minipif

java.util.IllegalFormatConversionException:%dはjava.lang.String引数をフォーマットできません
Iman Marashi

1
@ImanMarashiにキャストしてくださいint。またはlong。またはBigInteger。そして、使用fはあなたが使用したい場合doublefloatまたはBigDecimal
Adowrath、2016

56
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

編集

スペースなどのカスタムのグループ化セパレーターを取得するには、次のようにします。

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));

DecimalFormatSymbols setGroupingSeparatorを使用する必要があることはわかっていますが、BigDecimalに適用する方法がわかりません
Funtime

1
@Funtime:「BigDecimalに適用」しないでください。NumberFormat目的のプロパティでオブジェクトを作成し、それを使用してをフォーマットしますBigDecimal。にBigDecimalは値が指定されているだけで、形式は指定されていません
Joachim Sauer、2011年

1
3桁
ごとの

2番目のオプションの一番上の行をDecimalFormatSymbolsに変更する必要があったsymbols = new DecimalFormatSymbols(); これが機能するために。
PaperThick 2013年

14

ブラジルで使用されるようにフォーマットするためにこのコードを試してください:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"

2
JasperReportsの場合、これも試して、フォーマットを強制的に修正します。 parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); このパラメーターをレポートに送信します。
デラサビア、2015年

8

整数データ型に千の桁区切りを使用している場合は、1を使用します。

  1. 整数データ型の場合

String.Formatの( "%、D \ n"、58625)と出力があろう58625

  1. 浮動小数点データタイプString.format( "%,. 2f"、58625.21)の場合、出力は58,625.21になります

これはひらめきでした。ただし、 "、"は単なるフラグであり、グループセパレーターとして使用する文字ではないことを強調する必要があります。(この問題を見つけるためにしばらく時間をかけてください。)docs.oracle.com/javase/7/docs/api/java/util/Formatter.htmlを
Vankog

5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);

4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);

3

受け入れられた答えは実際に変更されなければなりません。そうでなければ機能しません。getDecimalFormatSymbolsは守備のコピーを作成します。したがって、

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

新しい行はこれです:formatter.setDecimalFormatSymbols(symbols);


2

以下のための小数

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));

1

上記のように、次のリンクはJavaが番号をローカライズできるようにする特定の国コードを提供します。どの国にも独自のスタイルがあります。

上記のリンクには、ここに配置する必要がある国コードがあります。

...(new Locale(<COUNTRY CODE HERE>));

たとえばスイスでは、数値を次のようにフォーマットします。

1000.00-> 1'000.00

国コード

これを達成するために、次のコードが私のために働きます:

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

結果は期待通りです:

1'000.00

1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20



このコードは質問に対する解決策を提供するかもしれませんが、それがなぜ/どのように機能するかに関してコンテキストを追加する方が良いです。これは、将来のユーザーが学習し、その知識を自分のコードに適用するのに役立ちます。また、コードが説明されている場合は、賛成票の形でユーザーから肯定的なフィードバックを受ける可能性があります。
borchvm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.