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
'programing' 카테고리의 다른 글
Vuex4 - 정의되지 않은 속성을 읽을 수 없음('상태' 읽기) (0) | 2022.08.03 |
---|---|
C의 >>>= 연산자는 무엇입니까? (0) | 2022.08.03 |
Vuejs & Vuetify : vuetify (v-slot dynamic)에서 데이터 테이블을 사용하여 템플릿을 루프하는 방법이 있습니까? (0) | 2022.08.03 |
Vue-google-map 자동 완성 양방향 바인딩이 작동하지 않음 (0) | 2022.08.03 |
VueX/Vue다른 파일로부터의 콜 변환 (0) | 2022.08.03 |