2012-07-16 2 views
2

통화 금액을 구문 분석하고 BigDecimal 값으로 저장하려고합니다. 문제의 통화 로케일이 주어지며 대부분의 경우 제대로 작동하지만 통화가 코스타리카 콜론 일 때 예기치 않은 결과가 나타납니다.통화 : 예기치 않게 소수 자릿수가 0입니다.

코스타리카 고객의 일반적인 통화 금액은 1.508.534,16이고 ,16은 소수 부분 (소수점 둘째 자리) 인 것으로 통보됩니다. 그러나 Currency.getDefaultFractionDigits()을 호출하면 2 대신 0이 소수 자릿수로 반환됩니다. 결과적으로 계산중인 값이 잘못 잘라졌습니다.

코드는 다음과 같다 :

// currencyLocale is "es_CR" 
Currency currency = Currency.getInstance(currencyLocale); 
int scale = currency.getDefaultFractionDigits(); 
// scale is 0 instead of 2 

BigDecimal v = new BigDecimal("12.34") 
          .setScale(scale, BigDecimal.ROUND_HALF_DOWN); 
// gives 12 instead of 12.34 

참고 것을 최종 사용자에게 표시 양은 정확하게 소수 구분로서 ,와 로케일 포맷되지만, 여기서 표준 값을 제공하는 데이터 소스 십진수는 1234.56입니다.

내가 뭘 잘못하고 있니? 좀 더 연구를하고 후


UPDATE

reporting the issue to Google, 나는이 안드로이드 버그 지금 확신합니다. 영향을받는 통화는 전체 숫자 배수 (최소 동전은 5 colón)에서만 사용할 수 있기 때문에 Google의 응답은 의도 한대로 작동한다는 것입니다.

구글의 반응 등이 매우 합법적으로 송금,이자 계산의 결과로하지만, 귀하의 은행 계좌에서 분수 금액을 가질 수 있다는 사실, 답변 정말

+0

실제 장치와 에뮬레이터에서 같은 결과를 얻었습니까? 로케일 문제가 에뮬레이터에서 예상했던 것과 다른 것으로 설정되었습니다. – Kennet

+0

예, 에뮬레이터에서 동일한 결과가 나타납니다. –

답변

1

되지 않음을 무시하지만,이 (2를 인쇄 Java JDK, Android가 아님) :

public static void main(String[] args) { 
    Locale currencyLocale = new Locale("es","CR"); 
    Currency currency = Currency.getInstance(currencyLocale); 
    System.out.println(currency.getDefaultFractionDigits()); 
} 
+1

또한 Java JDK에서 나를 위해 2를 인쇄하지만 Android의 동일한 코드는 0을 반환합니다. Android 버그인지 또는 특정 통화가 유럽 장치에서 완전히 지원 될 것으로 예상되지는 않지만 버그를 Google에 신고 한 모든 이벤트 : http://code.google.com/p/android/issues/detail?id=35057&thanks=35057&ts=1342478572 –

+1

Google은 행동이 JDK와 다르다는 점을 인정했지만 그것에 대해 아무 것도 할 생각이 없다. 오 잘. –

관련 문제