根据不同语言环境的不同货币代码格式化数字,其中输出为基于语言环境格式化的货币符号

问题描述

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

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

在下面尝试过,但没有给出预期的输出

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.lang.日期、时间、数字和货币的 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"));
    }