我想獲取Windows使用的貨幣符號;可以使用控制面板上的區域和語言選項查看和修改此符號。Windows貨幣符號
RegionInfo.CurrentRegion
代表當前線程使用的語言的區域信息;因此不會與操作系統的用戶選擇的貨幣符號相匹配。
如果我修改只是區域和語言>高級設置的貨幣符號...>貨幣,我希望能夠從C#程序訪問該符號。如何才能做到這一點?
感謝您閱讀我的文章。
我想獲取Windows使用的貨幣符號;可以使用控制面板上的區域和語言選項查看和修改此符號。Windows貨幣符號
RegionInfo.CurrentRegion
代表當前線程使用的語言的區域信息;因此不會與操作系統的用戶選擇的貨幣符號相匹配。
如果我修改只是區域和語言>高級設置的貨幣符號...>貨幣,我希望能夠從C#程序訪問該符號。如何才能做到這一點?
感謝您閱讀我的文章。
的RegionInfo
不能反映用戶更改設置:當我按更改/編輯貨幣符號「區域和語言選項>其他設置>貨幣>貨幣符號」
下下面的變化。我覺得像
CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
將工作。
加成(答案被接受後):
我測試了一下,似乎在某些情況下,RegionInfo
並反映用戶的設置。儘管the spec說:與CultureInfo相反,RegionInfo並不代表用戶的偏好,也不依賴於用戶的語言或文化。
在我的Windows 7 PC,我得到這樣的結果:RegionInfo
確實反映了用戶設置,即使我構建的RegionInfo
一個new
實例(而不是使用CurrentRegion
吸氣)。所以現在我們很困惑。
不存在W/O首先得到一個實例。 – 2012-08-16 14:30:04
@HenkHolterman - 我將MSDN鏈接到了這些細節。這應該很好。 – 2012-08-16 14:39:47
裏面找到你確定你的原始假設是正確的?
RegionInfo.CurrentRegion.CurrencySymbol
'CurrencySymbol'已經是一個字符串了。 – 2012-08-16 14:41:16
這很有趣;我*最初的假設*雖然基於文件,但也是基於觀察。我手動修改了Windows貨幣符號,'RegionInfo.CurrencySymbol'沒有相應更新。我不明白我們會如何體驗不同的行爲?感謝您花時間嘗試一下,感謝您的回覆:) – Pooven 2012-08-16 14:56:10
@亨克Holterman;我刪除了ToString(),謝謝。 – 2012-08-17 08:29:01
以下是我今天學到的一些疑難問題 - 我的代碼驗證了我的發現,如下所示。我將系統設置爲西班牙語 - 多米尼加共和國,並將貨幣符號從「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"
// 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;
}
感謝您的更新。你看起來和@AndréChristoffer Andersen有類似的結果。我使用兩個不同的項目(我實際工作的一個和我創建的一個來測試結果)測試了兩個答案;在這兩種情況下,即使對「區域和語言」設置進行了多處更改,您的答案也能提供我所需的信息。無論操作系統設置如何,'RegionInfo'始終如一地爲我提供與運行線程文化相關的正確貨幣符號。 – Pooven 2012-08-16 19:01:54
@Pooven有趣。你使用什麼版本的.NET Framework和Visual Studio?也許他們改變了一些。 – 2012-08-17 05:29:14
這是一個很好的觀點。我在Visual Studio 2008 V9 SP中使用.NET 3.5 SP1。 – Pooven 2012-08-17 06:43:37