Подтвердить что ты не робот

Форматирование валют в иностранных языках на Java

Я делаю все возможное, чтобы найти способ форматировать иностранные валюты в разных локалях, которые не используются по умолчанию для этой валюты, используя Java. Я нашел java.util.Currency, который может представлять собой правильный символ для использования в разных локалях. То есть, для доллара США, он предоставляет мне символ $в США и доллары США или доллары США в других странах. Кроме того, я нашел java.text.NumberFormat, который будет форматировать валюту для определенной локали. Моя проблема - util.Currency предоставит правильные символы и коды для отображения валют в своих нестандартных локалях, но не будет форматировать валюту по любому языковому признаку. NumberFormat предполагает, что число, которое я передаю, с языковым курсом, является валютой этого региона, а не иностранной валютой.

Например, если я использую getCurrencyInstance (Locale.GERMANY), а затем формат (1000), он предполагает, что я форматирую 1000 евро. На самом деле мне может понадобиться правильное представление на немецком языке (правильный десятичный разделитель и разделитель тысяч, будь то символ до или после суммы) для доллара США, или йены или любой другой валюты. Лучшее, что мне удалось получить до сих пор, - это форматирование числа с помощью NumberFormat, а затем поиск вывода для нецифровых символов и замена их символами, полученными из util.Currency. Однако это очень хрупкое и, вероятно, недостаточно надежное для моих целей. Идеи? Буду признателен за любую оказанную помощь.

4b9b3361

Ответ 1

Попробуйте использовать setCurrency в экземпляре, возвращаемом getCurrencyInstance (Locale.GERMANY)

Сломанный

java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
System.out.println(format.format(23));

Выход: 23,00 €

Fixed

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

Ответ 2

Я бы добавил к ответу от les2 fooobar.com/questions/286414/..., что, по-моему, количество цифр цифр не берется из валюты, оно должно быть установлено вручную, иначе if Клиент (NumberFormat) имеет языковой стандарт JAPAN, а Currency - EURO или en_US, тогда сумма отображается "a la 'yen" без цифр цифр, но это не так, как ожидалось, так как в десятизначных числах евро имеют значение, также для японского;-).

Итак, пример les2 можно было бы улучшить, добавив format.setMaximumFractionDigits(usd.getDefaultFractionDigits());, что в этом конкретном случае пример не имеет значения, но он становится актуальным, используя число с десятичными знаками и Locale.JAPAN как локаль для 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 code что-то подобное делается для начальной/дефолтной валюты формата, вызывающего метода DecimalFormat # adjustForCurrencyDefaultFractionDigits. Эта операция не выполняется, когда валюта изменяется после NumberFormat.setCurrency

Ответ 3

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));
    }
}

Ответ 4

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);

Ответ 5

Лучший способ - просто импортировать java.util.Locale.

Затем используйте метод как это:

NumberFormat.getCurrencyInstance(Locale.theCountryYouWant);

например, NumberFormat.getCurrencyInstance(Locale.US);

Ответ 6

Код ниже, Ref Java Locale:

Scanner scanner = new Scanner(System.in);
double payment = scanner.nextDouble();
scanner.close();

// Write your code here.
String china = NumberFormat.getCurrencyInstance(new Locale("zh", "CN")).format(payment);
String india = NumberFormat.getCurrencyInstance(new Locale("en", "IN")).format(payment);
String us = NumberFormat.getCurrencyInstance(Locale.US).format(payment);
String france = NumberFormat.getCurrencyInstance(Locale.FRANCE).format(payment);

System.out.println("US: " + us);
System.out.println("India: " + india);
System.out.println("China: " + china);
System.out.println("France: " + france);