【问题标题】:The Windows currency symbolWindows 货币符号
【发布时间】:2012-08-12 22:10:04
【问题描述】:

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

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

如果我只修改地区和语言 > 高级设置... > 货币中的货币符号,我想成为能够从 C# 程序访问该符号。如何做到这一点?

感谢您阅读我的帖子。

【问题讨论】:

    标签: c# .net windows-7 localization


    【解决方案1】:

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

    CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
    

    会起作用的。

    补充(接受答案后):

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

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

    【讨论】:

    • 感谢您的更新。看来您的结果与@André Christoffer Andersen 相似。我使用两个不同的项目测试了这两个答案(一个是我实际工作的项目,一个是我创建的只是为了测试结果);在这两种情况下,即使在对 Region and Language 设置进行多次更改后,您的回答也能准确地告诉我我所需要的。 RegionInfo 始终为我提供与运行线程的文化相关的正确货币符号,无论操作系统设置如何。
    • @Pooven 很有趣。您使用什么版本的 .NET Framework 和 Visual Studio?也许他们改变了一些东西。
    • 这是一个很好的观点。我正在使用 .NET 3.5 SP1 和 Visual Studio 2008 V9 SP。
    • 我使用了 VS2010 和 .NET 4 SP1。我想知道是不是这个原因。也许在某些情况下,运行时没有访问用户首选项的权限?我猜你在应用程序运行时没有更改设置?
    • RegionInfo 提供用户选择的区域设置确实有意义。 CurrentCulture 提供用户自定义的区域设置似乎更合理。如果我在应用程序运行时更改货币符号,CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol 不会返回更改;但这不一定是不受欢迎的。再次感谢您抽出时间对此进行测试 :)
    【解决方案2】:

    可以在RegionInfo.CurrencySymbol里面找到

    【讨论】:

    • 如果没有先获取实例,则不存在。
    • @HenkHolterman - 我链接了 MSDN 以获取此类详细信息。这应该可以正常工作。
    【解决方案3】:

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

    根据以下变化:

    RegionInfo.CurrentRegion.CurrencySymbol
    

    【讨论】:

    • 这很有趣;我的原始假设虽然基于文档,但也基于观察。我确实手动修改了 Windows 货币符号,RegionInfo.CurrencySymbol 没有相应更新。我不明白我们怎么会遇到不同的行为?感谢您抽出宝贵时间试用,感谢您的回复:)
    【解决方案4】:

    这是我今天学到的一些问题 - 我的代码验证我的发现如下。我将系统设置为西班牙 - 多米尼加共和国,并将货币符号从“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。

    我认为这很愚蠢,但如果有人知道这种行为背后的真正原因,请分享我的好奇心。

    这是repro的代码:

    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"
    

    【讨论】:

      【解决方案5】:
      //    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;
              }
      

      【讨论】:

        猜你喜欢
        • 2019-02-23
        • 2017-06-22
        • 2017-06-13
        • 1970-01-01
        • 2012-09-04
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多