Форматирование валют в иностранных локалях на Java
Я стараюсь найти способ форматировать иностранные валюты для различных регионов, которые не являются стандартными для этой валюты, используя Java. Я нашел класс java.util.Currency, который может представлять правильный символ для различных регионов. Например, для USD он предоставляет символ $ в США и US$ или USD в других странах. Также я нашел класс java.text.NumberFormat, который форматирует валюту для конкретного региона.
Моя проблема заключается в том, что util.Currency предоставляет правильные символы и коды для представления валют в их нестандартных локалях, но не форматирует валюту специфическим образом для конкретной локали. NumberFormat предполагает, что число, которое я ему передаю с указанием локали, является валютой этой локали, а не иностранной валютой.
Например, если я использую getCurrencyInstance(Locale.GERMANY) и затем форматирую (1000), он предполагает, что я форматирую 1000 евро. На самом деле, мне может потребоваться правильно локализованное представление (правильный разделитель десятичных и тысячных, а также размещение символа до или после суммы) для USD, иены или любой другой валюты. Лучшее, что мне удалось сделать до сих пор, это отформатировать число с помощью NumberFormat, затем искать в выводе недобуквенные символы и заменять их символами, полученными из util.Currency. Однако этот подход очень ненадежен и, вероятно, недостаточно точен для моих целей.
Есть ли идеи по этому поводу? Буду благодарен за любую помощь.
5 ответ(ов)
Вы можете использовать следующий код для форматирования суммы платежа в формате валюты для различных стран:
import java.util.Scanner;
public class CurrencyFormatter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Введите сумму платежа: ");
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);
System.out.println("Индия: " + india);
System.out.println("Китай: " + china);
System.out.println("Франция: " + france);
}
}
Этот код создает Scanner
для считывания суммы платежа с консоли. Далее он использует NumberFormat
для форматирования числового значения в соответствии с валютными стандартами США, Индии, Китая и Франции. Каждый форматированный результат выводится на экран. Так вы сможете увидеть, как одна и та же сумма выглядит в разных валютах.
Вы можете использовать следующий код для форматирования денежного значения в разных валютах в зависимости от локали. Пример на языке Java:
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; // Локальный формат денег
lp = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println("США: " + lp.format(payment));
lp = NumberFormat.getCurrencyInstance(new Locale("en", "in"));
System.out.println("Индия: " + lp.format(payment));
lp = NumberFormat.getCurrencyInstance(Locale.CHINA);
System.out.println("Китай: " + lp.format(payment));
lp = NumberFormat.getCurrencyInstance(Locale.FRANCE);
System.out.println("Франция: " + lp.format(payment));
}
}
Объяснение кода:
- Импорт библиотек: Мы импортируем необходимые классы из пакетов
java.util
иjava.text
. - Создание класса Solution: Основной класс, содержащий метод
main
. - Чтение значения: Мы используем
Scanner
для чтения значенияpayment
(платежа) из ввода пользователя. - Форматирование и вывод:
- Для каждой локали (США, Индия, Китай, Франция) создается экземпляр
NumberFormat
, который формирует денежный формат для соответствующей валюты. - Затем, с помощью
System.out.println()
, мы выводим отформатированное значение на экран.
- Для каждой локали (США, Индия, Китай, Франция) создается экземпляр
Запустив этот код, вы сможете увидеть, как одно и то же значение платёжной суммы отображается в разных форматах валюты для указанных стран.
Лучший способ — просто импортировать java.util.Locale
.
Затем используйте метод следующим образом:
NumberFormat.getCurrencyInstance(Locale.theCountryYouWant);
Например, NumberFormat.getCurrencyInstance(Locale.US);
Попробую ответить на ваш вопрос о коде Java для конвертации валюты.
Ваш код выглядит хорошо и выполняет конвертацию вводимой суммы в разные валюты, включая индийскую, американскую, китайскую и французскую. Давайте я объясню, как он работает шаг за шагом:
Импорт библиотек:
import java.util.*; import java.text.*;
Вы импортируете необходимые пакеты для работы со сканером и форматированием чисел.
Основной класс:
public class CurrencyConvertor {
Определяете класс
CurrencyConvertor
, в котором будет располагаться ваша логика.Метод main:
public static void main(String[] args) {
В этом методе вы запускаете программу.
Чтение входных данных:
Scanner scanner = new Scanner(System.in); double curr= scanner.nextDouble();
Здесь создается объект
Scanner
для чтения ввода пользователя, и вы ожидаете, что он введет число, представляющее сумму в валюте.Закрытие сканера:
scanner.close();
Закрываете сканер после получения данных, что является хорошей практикой.
Проверка диапазона:
if(curr>=0 && curr<=1000000000){
Программа проверяет, находится ли введенная сумма в допустимых пределах (от 0 до 1 миллиарда).
Форматирование валюты:
NumberFormat france = NumberFormat.getCurrencyInstance(Locale.FRANCE); NumberFormat us = NumberFormat.getCurrencyInstance(Locale.US); NumberFormat china = NumberFormat.getCurrencyInstance(Locale.CHINA); NumberFormat india = NumberFormat.getCurrencyInstance(Locale.ENGLISH);
Здесь вы создаете экземпляры
NumberFormat
для разных локалей, чтобы форматировать сумму в соответствующих валютах.Вывод результатов:
System.out.println("India: "+NumberFormat.getCurrencyInstance(new Locale("en","IN")).format(curr)); System.out.println("US: " + us.format(curr)); System.out.println("China: "+ china.format(curr)); System.out.println("France: " + france.format(curr));
Наконец, программа выводит отформатированные значения для каждой локали.
Если вводимое значение не попадает в указанный диапазон, программа просто ничего не выведет.
Если у вас есть другие вопросы или пожелания на доработку, пожалуйста, дайте знать!
Вы можете использовать класс Locale
для получения валюты, привязанной к определенной стране. Вот пример кода, который демонстрирует, как это сделать:
Locale currentLocale = Locale.GERMANY;
Double currencyAmount = new Double(9876543.21);
Currency currentCurrency = Currency.getInstance(currentLocale);
NumberFormat currencyFormatter =
NumberFormat.getCurrencyInstance(currentLocale);
System.out.println(
currentLocale.getDisplayName() + ", " +
currentCurrency.getDisplayName() + ": " +
currencyFormatter.format(currencyAmount));
Вывод: German (Germany), Euro: 9.876.543,21 €
В этом примере мы задаем локаль для Германии, получаем связанную с ней валюту (евро) и форматируем сумму с учетом немецкого формата отображения валюты.
Как красиво форматировать числа с плавающей запятой в строку без лишних нулей после запятой
Что значит 'synchronized'?
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Какие проблемы следует учитывать при переопределении equals и hashCode в Java?