1

我想获取 Windows 使用的货币符号;可以使用控制面板中的区域和语言选项查看和修改此符号。

RegionInfo.CurrentRegion表示当前线程使用的语言的区域信息;RegionInfo.CurrentRegion.CurrencySymbol因此不一定与操作系统用户选择的货币符号相匹配。

如果我只修改Region and Language > Advanced settings... > Currency中的货币符号,我希望能够从 C# 程序中访问该符号。如何才能做到这一点?

感谢您阅读我的帖子。

4

5 回答 5

3

RegionInfo不反映用户更改的设置。我想像

CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol

将工作。

添加(在接受答案后):

我测试了一下,似乎在某些情况下RegionInfo 确实反映了用户设置。尽管规范说:与 CultureInfo 相比,RegionInfo 不代表用户的偏好,也不依赖于用户的语言或文化。

在我的 Windows 7 电脑上,我得到了这个结果:RegionInfo确实反映了用户设置,即使我构造了一个new实例RegionInfo(而不是使用CurrentRegiongetter)。所以现在我们很困惑。

于 2012-08-16T14:56:46.153 回答
2

它可以在RegionInfo.CurrencySymbol中找到

于 2012-08-16T14:24:19.250 回答
1

你确定你最初的假设是正确的吗?当我在“区域和语言 > 其他设置 > 货币 > 货币符号”下更改/编辑货币符号时

根据以下变化:

RegionInfo.CurrentRegion.CurrencySymbol
于 2012-08-16T14:28:04.750 回答
0

这是我今天学到的一些陷阱 - 我的代码验证我的发现如下。我将系统设置为西班牙语 - 多米尼加共和国,并将货币符号从“RD$”更改为“$”。然后我将我的文化/UI 文化设置为 es-DO 而不是 en-US。

  • 使用number.ToString("C2")不遵循用户自定义设置。因此,如果您将System.Globalization.CultureInfo.CurrentCulture/设置CurrentUICulture为 es-DO 和 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"
于 2014-09-04T18:05:38.133 回答
-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;
        }
于 2016-01-12T11:57:59.027 回答