형식화 된 BigDecimal 값을 인쇄하는 방법은 무엇입니까?


104

나는이 BigDecimal필드 amount돈을 나타내고, 나는 같은 형식으로 브라우저에서 그 값을 인쇄해야 $123.00, $15.50, $0.33.

어떻게 할 수 있습니까?

(나 자신이 점점 볼 수있는 유일한 간단한 솔루션 floatValue에서 BigDecimal사용하여 다음과 NumberFormat분수 부분에 대한 두 자리 정밀도를 만들기 위해).

답변:


134
public static String currencyFormat(BigDecimal n) {
    return NumberFormat.getCurrencyInstance().format(n);
}

JVM의 현재 기본값 Locale을 사용하여 통화 기호를 선택합니다. 또는 Locale.

NumberFormat.getInstance(Locale.US)

자세한 내용은 NumberFormat수업을 참조하세요 .


DecimalFormat처럼 패턴을 지정할 수 있습니까?
Philippe Gioseffi

70

천 단위 구분 기호를 설정하려면 DecimalFormat123,456.78 을 사용해야 한다고 가정 합니다 .

     DecimalFormat df = new DecimalFormat("#,###.00");
     System.out.println(df.format(new BigDecimal(123456.75)));
     System.out.println(df.format(new BigDecimal(123456.00)));
     System.out.println(df.format(new BigDecimal(123456123456.78)));

결과는 다음과 같습니다.

123,456.75
123,456.00
123,456,123,456.78

#,###.00마스크를 설정했지만 더 긴 값도 성공적으로 형식화합니다. 결과의 쉼표 (,) 구분 기호는 로케일에 따라 다릅니다. 러시아어 로케일의 경우 공백 () 일 수 있습니다.


19
0이 0.00 대신 0.00으로 표시되도록하려면 "#,##0.00"대신 패턴을 사용하십시오.
Jonik

35

주어진 상황에 대해 이해할 수있는 또 다른 방법은

BigDecimal newBD = oldBD.setScale(2);

때문에 난 그냥이 말을 어떤 경우 는 이해가되지 않습니다 2 소수점을 넘어 돈에 관해서. 이를 한 단계 더 나아가면

String displayString = oldBD.setScale(2).toPlainString();

그러나 저는 단지 setScale 메소드를 강조하고 싶었습니다 (마지막 소수점 자리를 처리하는 방법을 제어하기 위해 두 번째 반올림 모드 인수를 사용할 수도 있습니다. 경우에 따라 Java는이 반올림 방법을 지정하도록 강제합니다).


14
 BigDecimal pi = new BigDecimal(3.14);
 BigDecimal pi4 = new BigDecimal(12.56);

 System.out.printf("%.2f",pi);

// 3.14 출력

System.out.printf("%.0f",pi4);

// 13을 인쇄합니다.


6

@Jeff_Alieffson의 답변과 비슷하지만 기본값에 의존하지 않습니다 Locale.

사용하여 DecimalFormatSymbols명시 적으로 로케일 :

DecimalFormatSymbols decimalFormatSymbols  = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));

또는 명시 적 구분 기호 :

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(' ');

그때:

new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));

결과:

12 345.00

1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)

1
BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()이어야합니다
Jeff Tsay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.