如何确定文化的货币符号位置

Dar*_*ryl 6 c# localization currency

我试图确定给定文化的货币符号是否应出现在值的开头或结尾.我无法在.Net CultureInfo中找到这些信息,所以我想我会尝试黑客攻击:

var cultures = new[] {"en-US", "ar-SA", "as-IN", "tr-TR"};
foreach ( var culture in cultures ) {
    var cultureInfo = CultureInfo.CreateSpecificCulture( culture );

    var currencyValue = 1.234.ToString( "C", cultureInfo );

    var rtl = cultureInfo.TextInfo.IsRightToLeft;

    var symbolAtBeginning = currencyValue.StartsWith( cultureInfo.NumberFormat.CurrencySymbol, false, cultureInfo );
}
Run Code Online (Sandbox Code Playgroud)

唉,这个方法有时候起作用; 在上面的例子中,它适用于"en-US",但不适用于其他文化.起初我认为这是因为有些文化从右到左阅读文本,而"开始"将是右侧,但这种解释并未证明.

有没有人看到我的代码中的缺陷,或者最好有一个更好的方法来确定货币符号位置?

key*_*rdP 10

您可以使用NumberFormatInfo类来确定该信息.您可以读取CurrencyPositive属性的正值,它将返回int重复的位置.来自MSDN:

0  $n

1  n$

2  $ n

3  n $ 
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 5

您可以使用CurrencyPositivePattern该的NumberFormat文化财产来获取信息.主要的缺陷是文化是以从右到左(RTL)的顺序编写的.然后你必须扭转逻辑.

我创建了这个扩展方法.

public static class CultureInfoExtensions
{
    public static bool StartsWithCurrencySymbol(this CultureInfo culture)
    {
        bool startsWithCurrencySymbol = 
            culture.NumberFormat.CurrencyPositivePattern == 0 ||
            culture.NumberFormat.CurrencyPositivePattern == 2;
        return culture.TextInfo.IsRightToLeft ? !startsWithCurrencySymbol : startsWithCurrencySymbol;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以这样使用它:

var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures)
    .Where(c => !c.IsNeutralCulture);
foreach (var ci in cultures)
{
    var currencyValue = 1.234.ToString("C", ci);
    if (ci.StartsWithCurrencySymbol())
        Console.WriteLine("Culture: {0} RTLF? {1} Format: {2}",
            ci, ci.TextInfo.IsRightToLeft, currencyValue);
}
Run Code Online (Sandbox Code Playgroud)

演示

MSDN:

Value    Associated pattern
0                $n
1                n$
2                $ n
3                n $
Run Code Online (Sandbox Code Playgroud)