簡體   English   中英

如何確定文化的貨幣符號位置

[英]How to determine currency symbol position for a culture

我試圖確定給定文化的貨幣符號是否應出現在值的開頭或結尾。 我無法在.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”,但不適用於其他文化。 起初我以為是因為有些文化從右到左閱讀文本,而“開始”將是右側,但這種解釋並未證實。

有沒有人看到我的代碼中的缺陷,或者最好有一個更好的方法來確定貨幣符號位置?

您可以使用NumberFormatInfo類來確定該信息。 您可以讀取CurrencyPositive屬性的正值,它將返回一個重復該位置的int 來自MSDN

0  $n

1  n$

2  $ n

3  n $ 

您可以使用區域性的NumberFormat屬性的CurrencyPositivePattern來獲取信息。 主要的缺陷是文化是以從右到左(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 $

唉,這個方法有時候起作用; 在上面的例子中,它適用於“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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM