2014-06-05 7 views
0

현재 로캘에 따라 숫자 서식을 가져 오려고하는데 통화 기호에 문제가 있습니다.통화 기호 국제화 Java

import java.util.Locale; 
import java.text.NumberFormat; 

public void i18nCurrency(Locale currentLocale) { 
    Double price = 9876543.21; 
    NumberFormat currencyFormatter = 
      NumberFormat.getCurrencyInstance(currentLocale); 
    System.out.println(currencyFormatter.format(price)); 
} 

그것은 인쇄 : 독일어 ¤ 9 876 영국에 대한 543,21 및 ¤9.876.543,21

이 내 방법입니다. 숫자 형식은 정확하지만 통화 기호도 가져와야합니다. 왜 나는 상징을 얻을 수 없습니까?

+2

출력 콘솔이 해당 기호를 표시합니까? –

답변

2

기호는 보편적 인 통화 자리 표시 자입니다. 통화를 알 수 없을 때 표시됩니다.
왜 그것이 모르는 지 궁금 할 것입니다. 글쎄, 당신의 설명에서 당신은 단순히 Locale.GERMAN 같은 것을 넘기는 메소드를 호출했다. 당신이 한 경우 때문에, 어떤 통화 사용에 알 수있는 방법이 없다 :

  • 유로는 독일과 오스트리아의 통화는
  • 스위스 프랭크 (. SFR)는
스위스의 통화이다

이들 국가는 공식 언어 중 적어도 하나가 독일어입니다. 문제를 해결하려면 항상 국가를 지나야합니다. 즉, Locale.GERMANY의 메소드를 매개 변수로 호출하십시오.

이제 더 세게. 데스크톱 응용 프로그램으로 작업 할 때는 매우 쉽습니다.

Locale currentLocale = Locale.getDefault(LocaleCategory.FORMAT); 

그러나이 방법은 웹 응용 프로그램에서는 작동하지 않습니다. 나는 이것이 사실이라고 생각한다. 글쎄, 웹 브라우저가 제공하는 로케일은 국가 정보가 부족하기 때문에 통화 서식을 지정하는 데 적합하지 않을 수 있습니다.
이 문제를 해결하는 권장 방법은 사용자 프로필을 만들고 사용자에게 로캘을 선택하도록 요청하는 것입니다 (UI 번역 및 형식 지정을 위해 별도로).

중요한 문제를 지적해야합니다. 문제가 발생하지 않기를 바랍니다. 애플리케이션에 금전적 가치가있는 경우 (보통 BigDecimal 클래스의 인스턴스 여야합니다. double은이 용도로 적합하지 않음) 특정 통화의 일부 값을 나타냅니다. 유로, 영국 파운드 또는 달러가 되겠지만 값은 구체적입니다. 특정 국가 통화에 대해이 값을 형식화하는 것은 의미가 없습니다. 먼저 금액을 변경해야합니다 (귀하가 그 이유를 이해한다고 생각합니다).
대신에 통화 기호 또는 통화 코드을 사용자의 통화와 일치하도록 재정의해야합니다. 형식과 기호 배치는 분명히 그대로 유지되어야합니다.

Currency dollar = Currency.getInstance("USD"); 
NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.GERMANY); //this gets € as currency symbol 
BigDecimal monetaryAmount = BigDecimal.valueOf(12.34d); 
String originalEuros = fmt.format(monetaryAmount); 
System.out.println(originalEuros); 

fmt.setCurrency(dollar); // change the currency symbol to $ 
String modifiedDollars = fmt.format(monetaryAmount); 
System.out.println(modifiedDollars); 

이 인쇄 :

12,34 €
12,34 USD

대기, 왜

이 예제를 고려하시기 바랍니다?귀하의 질문에 대한 답변이 미묘한 코드에있다 :

System.out.println(currency.getSymbol(Locale.GERMANY)); 
System.out.println(currency.getSymbol(Locale.US)); 

결과 : 인쇄됩니다 무엇

USD
$

는 로케일에 따라 달라집니다. 아마도이 방법이 더 좋을 것입니다 ...
인터넷 환전 응용 프로그램을 만들지 않는다면 제 예제에 충실해야한다고 생각합니다.