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(',', '.');