2016-09-12 4 views
1

На Android я пытаюсь отформатировать некоторую валюту с определенным номером формата.Валютный формат для валюты, отличной от Locale

Мой номер должны быть отформатированы с французского форматирования (9 876 543,21), но символ валюты должен быть помещен в зависимости от валюты:

  • 9 876 543,21 € для
  • EUR
  • $9 876 543,21 для
  • USD

Вот мой код прямо сейчас (здесь используются классы java.util, но результат тот же с пакетом android.icu):

final Double of = Double.valueOf("9876543.21"); 
final Currency usd = Currency.getInstance("USD"); 
final NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.FRANCE); 
currencyInstance.setCurrency(usd); 
Log.d("test", currencyInstance.format(amount)); 

И выход 9 876 543,21 $US, потому что для моего NumberFormat используется французский язык.

Примечание: Язык должен быть ФРАНЦИЕЙ (или FRENCH) для хорошего форматирования чисел, и я действительно не знаю код валюты (например, EUR, USD или GBP), это будет просто строка из веб-сервис.

Есть ли способ сообщить форматированию, что я хочу форматирование французского номера, но что ему нужно уважать размещение валюты для символа?

+0

Вы уверены, что о желании символа в соответствии с валютой? Из быстрого просмотра сети размещение символа, по-видимому, определяется локалью отображения, а не валютой (так что трейлинг $ будет казаться правильным во французском языке). – TripeHound

+0

Вот что я узнал из чтения по сети. Но мне только что сказали реализовать форматирование валюты, как это, и мне было интересно, можно ли это сделать с помощью стандартного NumberFormatter. Вероятно, я должен начать лоббирование с «бизнес-парнями», чтобы просто форматировать валюты с нормализованным форматом ... – pdegand59

ответ

1

это прекрасно работает, я думаю, это то, что вы Тринг для достижения

final Double of = Double.valueOf("9876543.21"); 

    NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("EUR")); 
    Log.d("test", currencyInstance.format(of)); 
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("GBP")); 
    Log.d("test", currencyInstance.format(of)); 
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("SEK")); 
    Log.d("test", currencyInstance.format(of)); 
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("USD")); 
    Log.d("test", currencyInstance.format(of)); 

private Locale getLocalFromISO(String iso4217code){ 
    Locale toReturn = null; 
    for (Locale locale : NumberFormat.getAvailableLocales()) { 
     String code = NumberFormat.getCurrencyInstance(locale). 
       getCurrency().getCurrencyCode(); 
     if (iso4217code.equals(code)) { 
      toReturn = locale; 
      break; 
     } 
    } 
    return toReturn; 
} 
//Prints 
//9.876.543,21 € 
//£9,876,543.21 
// 9 876 543,21 kr 
//US$9,876,543.21 
+0

Привет, моя проблема в том, что я не знаю валюту в коде. Я получаю код ISO (USD, EUR, GBP) от webservice, поэтому я не могу использовать правильную локаль для NumberFormat. И в вашем примере вывод для доллара США должен быть в моем случае $ 9 876 543,21' (французский форматирование с символом валюты перед номером). – pdegand59

+0

Я вижу, вы не можете просто использовать переключатель или вложенный оператор if? если вы получаете USD с сервера, вы устанавливаете 'currencyInstance' в США, если вы получаете EUR, вы выбираете любую страну евро, например, Францию, так как у вас есть только несколько, я думаю, что это не должно быть проблемой. –

+0

Поскольку это банковское приложение, я теоретически может получить любой код валюты, такой как EUR, USD, SEK, DKK, CAD и т. д. ... – pdegand59

Смежные вопросы