2012-08-16 243 views
1

我想獲取Windows使用的貨幣符號;可以使用控制面板上的區域和語言選項查看和修改此符號。Windows貨幣符號

RegionInfo.CurrentRegion代表當前線程使用的語言的區域信息;因此不會與操作系統的用戶選擇的貨幣符號相匹配。

如果我修改只是區域和語言>高級設置的貨幣符號...>貨幣,我希望能夠從C#程序訪問該符號。如何才能做到這一點?

感謝您閱讀我的文章。

回答

3

RegionInfo不能反映用戶更改設置:當我按更改/編輯貨幣符號「區域和語言選項>其他設置>貨幣>貨幣符號」

下下面的變化。我覺得像

CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol 

將工作。

加成(答案被接受後):

我測試了一下,似乎在某些情況下,RegionInfo反映用戶的設置。儘管the spec說:與CultureInfo相反,RegionInfo並不代表用戶的偏好,也不依賴於用戶的語言或文化。

在我的Windows 7 PC,我得到這樣的結果:RegionInfo確實反映了用戶設置,即使我構建的RegionInfo一個new實例(而不是使用CurrentRegion吸氣)。所以現在我們很困惑。

+0

感謝您的更新。你看起來和@AndréChristoffer Andersen有類似的結果。我使用兩個不同的項目(我實際工作的一個和我創建的一個來測試結果)測試了兩個答案;在這兩種情況下,即使對「區域和語言」設置進行了多處更改,您的答案也能提供我所需的信息。無論操作系統設置如何,'RegionInfo'始終如一地爲我提供與運行線程文化相關的正確貨幣符號。 – Pooven 2012-08-16 19:01:54

+0

@Pooven有趣。你使用什麼版本的.NET Framework和Visual Studio?也許他們改變了一些。 – 2012-08-17 05:29:14

+0

這是一個很好的觀點。我在Visual Studio 2008 V9 SP中使用.NET 3.5 SP1。 – Pooven 2012-08-17 06:43:37

2
+0

不存在W/O首先得到一個實例。 – 2012-08-16 14:30:04

+0

@HenkHolterman - 我將MSDN鏈接到了這些細節。這應該很好。 – 2012-08-16 14:39:47

1

裏面找到你確定你的原始假設是正確的?

RegionInfo.CurrentRegion.CurrencySymbol 
+1

'CurrencySymbol'已經是一個字符串了。 – 2012-08-16 14:41:16

+1

這很有趣;我*最初的假設*雖然基於文件,但也是基於觀察。我手動修改了Windows貨幣符號,'RegionInfo.CurrencySymbol'沒有相應更新。我不明白我們會如何體驗不同的行爲?感謝您花時間嘗試一下,感謝您的回覆:) – Pooven 2012-08-16 14:56:10

+0

@亨克Holterman;我刪除了ToString(),謝謝。 – 2012-08-17 08:29:01

0

以下是我今天學到的一些疑難問題 - 我的代碼驗證了我的發現,如下所示。我將系統設置爲西班牙語 - 多米尼加共和國,並將貨幣符號從「RD $」更改爲「$」。然後,我將我的文化/ UI文化設置爲es-DO而不是en-US。

  • 使用number.ToString("C2")不跟隨用戶自定義設置。因此,如果您將System.Globalization.CultureInfo.CurrentCulture/CurrentUICulture設置爲es-DO並執行1.00M.ToString("C2"),則會返回RD $ 1.00。

  • 要實際使用用戶自定義設置,您必須具有var info = new CultureInfo("es-DO")變量,然後使用string.Format(info, "{0:C2}", 1.00M)獲得預期的$ 1.00,如上所述。

  • 您不能使用string.Format(CultureInfo.CurrentCulture, "{0:C2}", 1.00M),因爲它不會返回用戶定製 - 在這種情況下,它將返回RD $ 1.00。

我認爲這是愚蠢的,但如果有人在那裏知道背後的真正原因此行爲,請分享,因爲我很好奇。

下面的代碼爲攝製:

var esdo = new CultureInfo("en-US"); 
{en-US} 
esdo = new CultureInfo("es-DO"); 
{es-DO} 
var resdo = new RegionInfo("es-DO"); 
{es-DO} 
     CurrencyEnglishName: "Dominican Peso" 
     CurrencyNativeName: "Peso" 
     CurrencySymbol: "$" 
     DisplayName: "Dominican Republic" 
     EnglishName: "Dominican Republic" 
     GeoId: 65 
     IsMetric: true 
     ISOCurrencySymbol: "DOP" 
     Name: "es-DO" 
     NativeName: "República Dominicana" 
     ThreeLetterISORegionName: "DOM" 
     ThreeLetterWindowsRegionName: "DOM" 
     TwoLetterISORegionName: "DO" 
esdo.NumberFormat 
{System.Globalization.NumberFormatInfo} 
     CurrencyDecimalDigits: 2 
     CurrencyDecimalSeparator: "." 
     CurrencyGroupSeparator: "," 
     CurrencyGroupSizes: {int[1]} 
     CurrencyNegativePattern: 1 
     CurrencyPositivePattern: 0 
     CurrencySymbol: "$" 
     DigitSubstitution: None 
     IsReadOnly: false 
     NaNSymbol: "NeuN" 
     NativeDigits: {string[10]} 
     NegativeInfinitySymbol: "-Infinito" 
     NegativeSign: "-" 
     NumberDecimalDigits: 2 
     NumberDecimalSeparator: "." 
     NumberGroupSeparator: "," 
     NumberGroupSizes: {int[1]} 
     NumberNegativePattern: 1 
     PercentDecimalDigits: 2 
     PercentDecimalSeparator: "." 
     PercentGroupSeparator: "," 
     PercentGroupSizes: {int[1]} 
     PercentNegativePattern: 1 
     PercentPositivePattern: 1 
     PercentSymbol: "%" 
     PerMilleSymbol: "‰" 
     PositiveInfinitySymbol: "Infinito" 
     PositiveSign: "+" 
var dsa = 1.00M; 
string.Format(esdo,"{0:C2}",dsa) 
"$1.00" 
dsa.ToString("C2") 
"RD$1.00" 
string.Format(System.Globalization.CultureInfo.CurrentCulture,"{0:C2}",dsa) 
"RD$1.00" 
string.Format(System.Globalization.CultureInfo.CurrentUICulture,"{0:C2}",dsa) 
"RD$1.00" 
System.Globalization.CultureInfo.CurrentUICulture 
{es-DO} 
string.Format(esdo,"{0:C2}",dsa) 
"$1.00" 
-1
// Do something like that maybe 
public static string getSeparator() 
     { 
      string output = string.Empty; 
      try 
      { 
       RegistryKey reg = Registry.CurrentUser.OpenSubKey("Control Panel").OpenSubKey("International"); 
       output = reg.GetValue(EnumClass.String.sList.ToString(), output).ToString(); 

       reg.Dispose(); 
      }`enter code here` 
      catch (Exception ie) 
      { 
       // catch error 
      } 
      return output; 
     }