2013-09-25 2 views
0

내가 다른 로케일로 자바의 DecimalFormatter를 사용할 때 나는 이상한 행동을보고 있어요 사이에 다른 행동. 숫자가 1,255,000,000의 값을 가진 double 인 경우 (디버거에서 1.255E9로 표시됨) Locale을 사용하여 DecimalFormatter에 전달합니다. 로케일이 해제로 설정되어있는 경우자바 DecimalFormatter - 로케일 DE 및 로케일 미국

는 | DE, 그것은 1.255E13에 수를 변환합니다. 로케일은 실내가 설정되어있는 경우

는 | 미국, 그것은 1.255E9에 수를 (제대로)로 변환합니다.

왜 독일 로케일이 잘못을하고있다?

여기 내 코드의 ...

// number comes from JSP 
// usually in form of "1.255E9" 
String text = request.parameter("number"); 
NumberFormat numFormatter = NumberFormat.getInstance(formatLocale); 
DecimalFormat formatter = (DecimalFormatter)numFormatter; 
formatter.applyPattern("#,###"); 
return formatter.parse(text.trim()).doubleValue(); 

** 내가 위에서 그것을 설명으로 더 명확하게하기 위해 편집 **

문자열은 서버 측 코드로 전달하기가 정확히, "1.255E9 ". JSP 페이지에, 나는 단순히 (독일 포함) 일부 유럽 국가들은 그룹화 구분 (1000 개 단위 구분)로

<input type="hidden" name="number" value="<%=price%>"> 
+0

작은 재현 가능한 예를 게시 할 수 있습니까? –

+0

'DecimalFormatter' 메서드는 무엇을 사용하고 있습니까? DE에서는 ","가 소수점이고 숫자에 두 개의 소수점이 없기 때문에 메소드에 따라'ParseException' 또는 "1.255"를 예상했을 것입니다. '이후 예상대로 (나를 위해,'NumberFormat.getInstance는 (새 로케일 ("DE는")). == NumberFormat.getInstance (새 로케일 ('DE', '("1255000000")'리턴'을 1.255' 분석 ")). getDecimalFormatSymbols는(). getDecimalSeparator()'.) – Jeremy

답변

2

처럼 소수 구분 기호로 ,.를 HTML을 사용하고 있어요.

12,345.678 (US) 
12.345,678 (Germany) 

당신은이 같은 소수 구분 및 그룹화 구분 확인할 수 있습니다 : 그래서, 같은 수의 12345.678 다른 표현을 가질 수 이러한 이유로

Locale[] locales = Locale.getAvailableLocales(); 
for(Locale l : locales) { 
    DecimalFormatSymbols s = ((DecimalFormat)DecimalFormat.getInstance(l)) 
    .getDecimalFormatSymbols(); 
    System.out.printf("%s:\t%s\t%s\n", 
    l.getDisplayCountry(), 
    s.getGroupingSeparator(), 
    s.getDecimalSeparator()); 
} 

을 문자열 1,255,000,000는에 1255000000에 구문 분석 미국 로켈, DE (독일) 로켈의 1.255

+0

는 어떻게 이런 일이 영업 이익에 주목하는'1.255E13'을 설명 하는가? –

+0

'1.255E13' 결과를 재현 할 수 있는지 확실하지 않습니다. OP가 언급하지 않은 것이 있습니다. –

+0

더 명확하게 질문을 편집했습니다. 파싱되는 문자열은 "1.255E9"입니다. – bluedevil2k