DecimalFormat의 소수점 구분 기호를 쉼표에서 점 / 점으로 변경하는 방법은 무엇입니까?


204

BigDecimal 값을 멋지고 읽기 쉬운 문자열로 변환하는이 미친 방법이 있습니다.

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}

그러나 소위 그룹화 구분 기호 ","를 생성하여 내 모든 값을 다음과 같이 표시합니다.

xxx,xxx

구분 기호가 쉼표가 아닌 점 또는 점이어야합니다. 아무도이 작은 위업을 달성하는 방법에 대한 단서가 있습니까?

나는 이것을 읽고 특히 이것을 죽음에 이르렀지만 이것을 끝내는 방법을 찾을 수는 없다. 내가 잘못 접근하고 있습니까? 이것을하는 훨씬 더 우아한 방법이 있습니까? 쉼표는 유럽 표준에 따라 완벽하기 때문에 다른 지역 번호 표현을 설명하는 솔루션조차도 가능합니다.


답변:


323

로케일을 설정하거나 DecimalFormatSymbols를 사용하여 구분 기호를 변경할 수 있습니다 .

그룹화 구분 기호를 점으로 사용하려면 유럽 로캘을 사용할 수 있습니다.

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

또는 DecimalFormatSymbols 클래스를 사용하여 format 메서드로 생성 된 서식이 지정된 숫자로 표시되는 심볼을 변경할 수 있습니다. 이러한 기호에는 소수점 구분 기호, 그룹 구분 기호, 빼기 기호 및 백분율 기호가 포함됩니다.

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocale 은 Locale.getDefault ()에서 얻을 수 있습니다.

Locale currentLocale = Locale.getDefault();

1
당신은 당신의 0.00 얻을 수있는 진수 형식에에 applyPattern 사용할 수 있습니다
krystan 명예

otherSymbols.setDecimalSeparator ( ',')를 변경했습니다. otherSymbols.setDecimalSeparator ( '.')로; 고마워. 그것은 나를 위해 작동합니다.
Aakanksha

2
형식은 다음과 같습니다. 예를 들어 docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html 구문을 String formatString = "#,###,###,##0.00";참조하십시오.
Vulpo

1
"유럽 로케일을 사용할 수 있습니다". 글쎄요, 당신은 1.567,90이 아닌 Locale.UK반환 할 것이기 때문에 유럽의 어떤 지역도 사용할 수 없습니다1,567.90
Junior Mayhé

참고 : NumberFormat.getNumberInstance()일부 Android 7 기기에서는 비정상적으로 느리게 실행될 수 있습니다. 대안은String.format() 빠르게 실행됩니다. 참조 stackoverflow.com/questions/2379221/java-currency-number-format
씨-IDE

14

유럽은 꽤 큽니다. 그들이 같은 형식을 사용하는지 잘 모르겠습니다. 그러나 이것 또는 대답은 도움 될 것입니다.

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

즉 올바른 로케일을 사용하십시오.


1
참으로 선생님! 영국에서는 "£ 1,234.00"이 표시되는 반면 프랑스에서는 "1,234,00 €"가 예상됩니다 (그룹 구분 기호, 소수점 구분 기호, 통화 기호 및 통화 위치가 변경됨).
Vulpo

9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}

5

BigDecimal은 로케일 설정을 존중하지 않는 것 같습니다.

Locale.getDefault(); //returns sl_SI

슬로베니아어 로케일에는 10 진수 쉼표가 있어야합니다. 숫자에 관해 이상한 오해가 있었을 것 같아요.

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

사람의 실수 때문인 것으로 판명 된 이후로 의미가없는 메시지 부분을 편집했습니다 (데이터 커밋을 잊고 잘못된 것을보고있었습니다).

모든 Java .toString () 함수에 대해 BigDecimal과 동일하게 말할 수 있습니다. 나는 그것이 어떤면에서 좋은 것 같아요. 예 또는 디버깅을위한 직렬화 고유 한 문자열 표현이 있습니다.

또한 포맷터를 사용하여 언급 한 다른 사람들도 정상적으로 작동합니다. JSF 프론트 엔드와 동일한 포맷터를 사용하면 포맷터가 작업을 올바르게 수행하고 로케일을 인식합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.