2013-07-03 30 views
3

我試圖確定給定文化的貨幣符號是否應出現在值的開始或結尾。我一直沒能找到在.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」,但不適用於其他文化。起初我認爲這是因爲一些文化從右向左閱讀文本,「開始」將是正確的一面,但這種解釋沒有被證明。

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

+0

歐元前,葡萄牙語escudo($)的貨幣符號定位在小數點位置(123 $ 45表示123.45 ESC)。不確定任何當前貨幣是否具有此特徵。在這種情況下,我猜NumberFormatInfo.CurrencySymbol應該是一個空字符串,所以不能用於確定它的位置,而NumberFormatInfo.CurrencyDecimalSeparator應該是「$」。 – Joe

回答

5

您可以使用文化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); 
} 

Demo

MSDN:

Value Associated pattern 
0    $n 
1    n$ 
2    $ n 
3    n $ 
+0

恐怕這種方法在我的示例中並不適用於ar-SA,並且在您的演示輸出(http:// ideone。 com/yldaJ1),其他幾種文化也不起作用... – Darryl

+0

@Darryl:我必須承認,我不明白以下鏈接100%,但是,微軟告訴在「ar-EG」(與「ar -SA「)_」貨幣符號出現在數字的左側,即使我的代碼告訴不同的東西(甚至是ms輸出)。也許你明白這是什麼意思:http://www.microsoft.com/middleeast/msdn/arabicsupp.aspx(搜索_「格式化特定阿拉伯文化的數字數據」_) –

+0

Tim,感謝您的幫助。該鏈接似乎顯示了一個示例,然後與它相矛盾,並說它工作不正確,您應該使用解決方法(設置CultureInfo.NumberFormat.CurrencyPositivePattern)。我確實發現支持阿拉伯貨幣符號位於左側的說法:http://tinyurl.com/pwxpmhn。但是,如果這兩個都是正確的,這意味着Excel是錯誤的,就像您將單元格格式化爲貨幣並指定ar-SA一樣,它會將貨幣符號放在右側。現在完全混淆了。 – Darryl

0

唉,這種方法僅適用有時候;在上面的例子中,它適用於「en-US」,但不適用於其他文化。

你爲什麼這麼說?據我所知,它適用於所有文化。添加一些跟蹤,我得到以下內容,這正是我所期望的:symbolAtBeginning爲true 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 
+0

在我的測試中,as-IN currencyValue是「1.23 $」,失敗了。另外,tr-TR的symbolAtBeginning:True也失敗。 – Darryl

+0

我的測試是在Windows 8上,你在使用什麼操作系統? – Joe

+0

Windows 7,.Net Framework 4.5。 – Darryl