Java에서 천 단위 구분 기호를 설정하는 방법은 무엇입니까?


129

Java에서 천 단위 구분 기호를 설정하는 방법은 무엇입니까?
수천 구분 기호로 서식을 지정하고 String으로 반환하려는 BigDecimal의 String 표현이 있습니다.


DB에서 이러한 값을 얻고 있습니까?
Dead Programmer

답변:


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 for getDecimalFormatSymbols()says : 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);
리 이홍

\ u00a0 (비 공백 공간)을 그룹화 구분 기호로 사용하고 싶다고 생각합니다. 일부 로케일의 기본값입니다.
ACV

3
왜 longValue를 호출합니까? 문제는 BigDecimal을 위해 수천 개의 연산자를 설정하는 것이 었습니다.
FINDarkside

232

","와 함께 format 함수를 사용할 수 있습니다.

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

//str = 124,750

","에는 로캘 별 그룹화 문자가 포함됩니다.

문서


11
.구분 기호 로 사용하려면 어떻게해야합니까?
Enissay

일반적으로 String.format을 사용하므로 가장 쉽고 편리합니다!
알리

16
전화 @Enissay format()명시 적 로케일 ( Local.US사용 알려진 ,구분 기호) 한 후 교체 ,사용자 정의 구분 기호 : String.format(Locale.US, "%,d", n).replace(',', '.').
minipif

java.util.IllegalFormatConversionException은 : % d를 java.lang.String의 인수를 포맷 할 수 없습니다
이만 Marashi에게

1
@ImanMarashi로 캐스팅하십시오 int. 또는 long. 또는 BigInteger. 그리고 사용 f를 당신이 사용하려는 경우 double, float또는 BigDecimal.
Adowrath

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. A는 BigDecimal단지 지정된 값을 가지고, 그것은 하지 않습니다 지정된 형식을 가지고있다.
Joachim Sauer

1
천 단위 구분 기호는 일반적으로 비 분리 공간입니다 (공백 일 때)
cquezel

두 번째 옵션의 맨 위 줄을 DecimalFormatSymbols로 변경해야했습니다. symbols = new DecimalFormatSymbols (); 이 작동합니다.
PaperThick

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")); 이 매개 변수를 보고서로 보내십시오.
dellasavia

8

정수 데이터 유형에 천 단위 구분 기호를 사용하는 경우 1을 사용하십시오.

  1. 정수 데이터 유형

String.format ( "%, d \ n", 58625) 및 출력은 58,625입니다.

  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.