基于不同区域设置的不同货币代码格式化数字,其中输出为基于区域设置格式化的货币符号

Formatting number based on the different currency code for different locale where output to be in the currency symbol formatted based on the locale

语言:Java 问题:我需要在 java 中手动设置货币代码。假设“USD”和区域设置可以是“fr-CA”或“en_US”,具体取决于登录的用户。我无法找到我们可以通过设置手动货币并在输出中显示带有数字的符号来进行数字格式的解决方案。请注意,货币代码与区域设置不同,反之亦然。

例如,如果我的货币是美元,那么根据不同的语言环境,数字应该被格式化并且输出应该如下所示。 $1,300,000.00 - 英语 1.300.000,00 $ - 德语 1 300 000,00 美元 - 葡萄牙语 1 300 000,00 $ 美国 - 法国 加拿大

尝试了以下但没有给出预期的输出:

Currency currencyInstance1 = Currency.getInstance("USD"); // This can change based on the user input on the UI.
NumberFormat numberFormat4 = NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH);
numberFormat4.setCurrency(currencyInstance1);
System.out.println(numberFormat4.format(amount4));

Actual output : 123 456,79 USD
**Expected output:**
For french canada:  1 300 000,00 $ US
For Portuguese : 1 300 000,00 US$
For Deutch : 1.300.000,00 $

Any help is appreciated.

Java 不支持跨区域设置的跨货币。

由于 java,国家/地区代码是重要的语言环境组成部分。 text.Format 日期、时间、数字和货币对象对此元素特别敏感。国家代码增加了区域设置的语言部分的精确度。例如,法国和加拿大都使用法语。但是,这两个国家的确切用法和惯用语有所不同。 这些差异可以用不同的地区指示符来捕捉,其中只有国家代码不同。例如,代码 fr_CA(加拿大法语区)不同于 fr_FR(法国法语区)。

因此,如果我们需要获取符号,那么我们需要创建一个包含语言环境和货币的地图。传递货币以获取符号,然后使用替换来添加它。

public static Map<Currency, Locale> currencyLocaleMap;

    static {
        currencyLocaleMap = new HashMap<>();
        List<Locale> availableLocales = 
        Arrays.asList(Locale.getAvailableLocales());

        List<Locale> supportedLocales = new ArrayList<>();
        supportedLocales.add(Locale.forLanguageTag("en-US"));

        List<Locale> filteredLocales = supportedLocales.stream().filter
                (eachLocale -> availableLocales.contains(eachLocale)).collect(Collectors.toList());
        System.out.println("UtilTemp : Locales supported : " + filteredLocales); 

        for (Locale locale : filteredLocales) {
            try {
                if(!locale.getCountry().isEmpty()){
                    Currency currency = Currency.getInstance(locale);
                    currencyLocaleMap.put(currency, locale); 
                }
            }
            catch (Exception e) {
            }
        }
    }

    public static String getCurrencySymbol(String currencyCode) {
        Currency currency = Currency.getInstance(currencyCode);
        System.out.println("UtilTemp :" +  currencyLocaleMap);
        return currency.getSymbol(currencyLocaleMap.get("USD"));
    }