Форматирование валют в иностранных языках в Java
Я делаю все возможное, чтобы найти способ форматирования иностранных валют в разных местах, которые не являются по умолчанию для этой валюты, используя Java. Я нашел java.утиль.Валюта, которая может представлять собой правильный символ для использования в различных локалях. То есть для USD он предоставляет мне символ $ в США, а US$ или USD в других странах. Кроме того, я нашел java.текст.NumberFormat, который будет форматировать валюту для определенной локали. Моя проблема - утиль.Валюта обеспечит надлежащие символы и коды для представления валют в нестандартных местах, но не формат валюты в любой локали способом. NumberFormat предполагает, что число, которое я передаю ему, с локали, является валютой этой локали, не иностранная валюта.
например, если я использую getCurrencyInstance (Locale.Германия), а затем формат (1000) предполагает, что я форматирую 1000 евро. На самом деле мне может понадобиться правильное немецкое локализованное представление (правильный десятичный и тысячный разделитель, ставить ли символ до или после суммы) для USD, или иены, или любой другой валюты. Лучшее, что я смог получить до сих пор,-это форматировать число с помощью NumberFormat, затем искать выходные данные для незначных символов и заменять их символами, полученными из util.Валюта. Однако это очень хрупкое и, вероятно, недостаточно надежное для моих целей. Идеи? Любая помощь очень ценится.
5 ответов
попробуйте использовать setCurrency на экземпляре, возвращаемом getCurrencyInstance (Locale.Германия)
сломанные:
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
System.out.println(format.format(23));
выход: €23,00
основные:
java.util.Currency usd = java.util.Currency.getInstance("USD");
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
format.setCurrency(usd);
System.out.println(format.format(23));
выход: 23,00 USD
Я хотел добавить к ответу от les2 https://stackoverflow.com/a/7828512/1536382 что я считаю, что количество цифр дробной части числа не берется с валюту, он должен быть установлен вручную, в противном случае, если клиент (NumberFormat) Япония язык и валюта-евро или en_US, то сумма отображается 'а-ля' Йен', без цифр после запятой, но это не ожидаемого, так как в евро десятичные дроби являются актуальными, также по-японски ;-).
таким образом, пример les2 может быть улучшен добавление format.setMaximumFractionDigits(usd.getDefaultFractionDigits());
, что в этом конкретном случае примера не имеет значения, но становится актуальным с использованием числа с десятичными знаками и локали.Япония как локаль для NumberFormat.
java.util.Currency usd = java.util.Currency.getInstance("USD");
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(
java.util.Locale.JAPAN);
format.setCurrency(usd);
System.out.println(format.format(23.23));
format.setMaximumFractionDigits(usd.getDefaultFractionDigits());
System.out.println(format.format(23.23));
вывод:
USD23
USD23.23
на NumberFormat код что-то подобное делается для начальной/валюты по умолчанию формата, вызывая метод DecimalFormat adjustForCurrencyDefaultFractiondigits#. Эта операция не выполняется при изменении валюты потом с NumberFormat.setCurrency
import java.util.*;
import java.text.*;
public class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double payment = scanner.nextDouble();
scanner.close();
NumberFormat lp; //Local Payment
lp = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println("US: " + lp.format(payment));
lp = NumberFormat.getCurrencyInstance(new Locale("en", "in"));
System.out.println("India: " + lp.format(payment));
lp = NumberFormat.getCurrencyInstance(Locale.CHINA);
System.out.println("China: " + lp.format(payment));
lp = NumberFormat.getCurrencyInstance(Locale.FRANCE);
System.out.println("France: " + lp.format(payment));
}
}
Scanner scanner = new Scanner(System.in);
double payment = scanner.nextDouble();
scanner.close();
java.text.NumberFormat formatUS = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US);
String us=formatUS.format(payment);
java.text.NumberFormat formatIn = java.text.NumberFormat.getCurrencyInstance(new java.util.Locale("en","in"));
String india=formatIn.format(payment);
java.text.NumberFormat formatChina = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.CHINA);
String china=formatChina.format(payment);
java.text.NumberFormat formatFrance = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.FRANCE);
String france=formatFrance.format(payment);
System.out.println("US: " + us);
System.out.println("India: " + india);
System.out.println("China: " + china);
System.out.println("France: " + france);
лучший способ-просто импортировать java.утиль.Локаль
затем используйте такой метод:
NumberFormat.getCurrencyInstance (Locale.theCountryYouWant);
например, NumberFormat.getCurrencyInstance (Locale.Нас);