programing

DecimalFormat의 소수점 구분 기호를 쉼표에서 점/점으로 변경하는 방법

newsource 2022. 8. 3. 23:17

DecimalFormat의 소수점 구분 기호를 쉼표에서 점/점으로 변경하는 방법

저는 Big Decimal 값을 읽기 쉬운 문자열로 변환하는 이 작은 미친 방법을 가지고 있습니다.

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 클래스를 사용하여 포맷 방식으로 생성되는 포맷된 숫자에 나타나는 기호를 변경할 수 있습니다.이러한 기호에는 소수점 구분 기호, 그룹 구분 기호, 빼기 기호 및 백분율 기호가 포함됩니다.

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

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

Locale.getDefault(); //returns sl_SI

슬로베니아 로케일은 소수점 콤마를 사용해야 합니다.내가 숫자에 대해 이상한 오해를 했던 것 같아.

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

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

저는 제 메시지의 일부가 인위적인 실수(데이터 커밋을 잊어버리고 잘못된 것을 보고 있었기 때문에)로 인해 의미가 없는 부분을 수정했습니다.

모든 Java .toString() 함수에 대해 BigDecimal과 동일하게 말할 수 있습니다.그건 어떤 면에서는 좋은 것 같아요.시리얼라이제이션(예: 디버깅).고유한 문자열 표현이 있습니다.

또한 다른 사람이 언급한 것처럼 포메터를 사용하는 것도 문제 없습니다.JSF 프런트엔드와 마찬가지로 포메터를 사용하면 포메터는 작업을 적절하게 수행하고 로케일을 인식할 수 있습니다.

내 경우에는 이 방법이 효과가 있었다.

DecimalFormat df2 = new DecimalFormat("#.##");           
df2.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
String money = output.replace(',', '.');

메서드의 문자열을 반환하기 전에 치환 함수를 사용할 수 있습니다.

return df.format(bd).replace(",", ".")

이건 나한테 효과가 있었어...

    double num = 10025000;
    new DecimalFormat("#,###.##");
    DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
    System.out.println(df.format(num));

언급URL : https://stackoverflow.com/questions/5054132/how-to-change-the-decimal-separator-of-decimalformat-from-comma-to-dot-point