10

我正在尝试确定给定文化的货币符号是否应该出现在值的开头或结尾。我无法在 .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 );
}

唉,这种方法只在某些时候有效;在上面的示例中,它适用于“en-US”,但不适用于其他文化。起初我认为这是因为某些文化从右到左阅读文本,而“开始”将是右侧,但这种解释并没有得到证实。

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

4

3 回答 3

13

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

0  $n

1  n$

2  $ n

3  n $ 
于 2013-07-03T23:10:28.633 回答
8

您可以使用文化CurrencyPositivePatternNumberFormat属性来获取信息。主要的缺陷是有些文化的文本以从右到左 (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;
    }
}

你可以这样使用它:

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

演示

MSDN

Value    Associated pattern
0                $n
1                n$
2                $ n
3                n $
于 2013-07-03T23:14:18.147 回答
0

唉,这种方法只在某些时候有效;在上面的示例中,它适用于“en-US”,但不适用于其他文化。

你为什么这么说?据我所知,它适用于所有文化。添加一些跟踪,我得到以下信息,这正是我所期望的:symbolAtBeginning 为真 IFF 货币符号在 LTR 文化的左侧和 RTL 文化的右侧。

culture:en-US currencyValue:$1.23 rtl:False symbolAtBeginning:True
culture:ar-SA currencyValue:ر.س.‏ 1.23 rtl:True symbolAtBeginning:True
culture:as-IN currencyValue:₹ 1.23 rtl:False symbolAtBeginning:True
culture:tr-TR currencyValue:1,23 ₺ rtl:False symbolAtBeginning:False
于 2013-07-04T20:31:47.213 回答