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

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

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

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



답변

로케일을 설정하거나 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();


답변

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

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);

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


답변

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


답변

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 프론트 엔드와 동일한 포맷터를 사용하면 포맷터가 작업을 올바르게 수행하고 로케일을 인식합니다.


답변

String money = output.replace(',', '.');


답변