格式化数字时如何确定货币符号的放置位置?

nim*_*imi 4 java localization internationalization currency-formatting

我不确定其他人是否问过同样的问题。到目前为止,我还没有在 stackoverflow 中看到这个问题,因此发布了相同的问题。

我有一个要求,我需要根据货币格式化数字。

在此处输入图片说明

让我解释一下上表,让您了解我的问题的更多背景。对于美国,数字格式为USD976,543.21,这里的货币符号是 USD,它位于数字前面。这对于 fr-FR 语言环境几乎没有什么不同,这里符号放在数字之后。

我所有的格式化都发生在前端而不是后端。我将# 形式的格式提供给 FE,然后我们自己开发的代码将数字格式化为该格式。例如,对于美国,我提供 USD###、###、###.####。在这里,我需要让前端知道以下信息,以便前端快速格式化相同的信息。 我的问题是: 有什么方法可以在后端获取以下信息:

  1. 在哪里放置货币,数字的开头或结尾?
  2. 数字和符号之间有空格吗?看看 USD976,543.21 和 976 543,21 € 。欧元的货币符号和数字之间有空格,但美元没有。

我正在使用 java.util.Currency。

smi*_*ty1 7

我在寻找一种方法来确定是否应将货币符号放置在特定语言环境的货币的开头或结尾时发现了这个问题。对于可能正在寻找类似内容的其他人,我最终创建了以下类来测试:

public class Test {   

    private static Locale[] locales = Locale.getAvailableLocales();
    static double decimal = 789456123.098;

    public static void main(String[] args) {

        for(Locale locale : locales){
            DecimalFormat decimalFormatter = (DecimalFormat)NumberFormat.getInstance(locale);
            NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale);
            DecimalFormatSymbols symbols = decimalFormatter.getDecimalFormatSymbols();
            String currencySymbol = symbols.getCurrencySymbol();
            String formattedCurrency = currencyFormatter.format(decimal);
            System.out.print(formattedCurrency + ";" + locale.getDisplayCountry() + ";" + locale.getDisplayLanguage() );
            System.out.println(";" + currencySymbol + ";" + currencySymbolAtStart(currencySymbol, formattedCurrency, true));
        }

    }

    private static boolean currencySymbolAtStart(String currencySymbol, String formattedCurrency, boolean defaultAtStart){

        if(formattedCurrency.startsWith(currencySymbol)){
            return true;
        }else if(formattedCurrency.endsWith(currencySymbol)){
            return false;
        }else{
            return defaultAtStart;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

将结果粘贴到电子表格中看起来像这样:

Java 货币符号起始位置

这里有一个警告需要注意。对于从右到左阅读的语言,货币符号可能会出现在格式化文本的右侧,但从技术上讲,由于您是从右到左阅读,货币仍然“以”货币符号“开头”,因此结果将返回“真的”。在上面的屏幕截图中查看埃及-阿拉伯语...


Nee*_*ain 0

您可以使用Globalizejs满足您的要求

\n\n
\n

用于国际化和本地化的 JavaScript 库,利用官方 Unicode CLDR JSON 数据

\n
\n\n

开始非常容易,您不必担心将货币代码放在前面或后面,库将根据区域设置和货币代码进行处理。

\n\n

例子:

\n\n
var formatter;\n\nGlobalize.locale( "en" );\nformatter = Globalize.currencyFormatter( "USD" );\n\nformatter( 9.99 );\n// > "$9.99"\n
Run Code Online (Sandbox Code Playgroud)\n\n

在不同的语言环境中:

\n\n
var deFormatter = Globalize( "de" ).currencyFormatter( "EUR" );\ndeFormatter( 9.99 );\n// > "9,99 \xe2\x82\xac"\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n