C# 使用自定义存储区域分析货币 问题大纲

C# 使用自定义存储区域分析货币 问题大纲,c#,uwp,windows-10-universal,C#,Uwp,Windows 10 Universal,我需要获取购买产品价格的数值,为此,我需要解析从我接收的ProductListing对象接收的FormattedPrice 这里的问题是,我需要考虑所有的边缘情况,例如用户位于国外的情况,系统运行在该区域,但设置存储区以接收来自其家乡区域的内容。p> 例如,我目前将我的电脑(GB地区,GB系统语言)设置为从意大利商店接收内容,因此我收到的价格以欧元为单位,并以逗号作为小数分隔符,但是,当我尝试使用CultureInfo.CurrentCulture或RegionInfo.CurrentRegio

我需要获取购买产品价格的数值,为此,我需要解析从我接收的
ProductListing
对象接收的
FormattedPrice

这里的问题是,我需要考虑所有的边缘情况,例如用户位于国外的情况,系统运行在该区域,但设置存储区以接收来自其家乡区域的内容。p> 例如,我目前将我的电脑(GB地区,GB系统语言)设置为从意大利商店接收内容,因此我收到的价格以欧元为单位,并以逗号作为小数分隔符,但是,当我尝试使用

CultureInfo.CurrentCulture
RegionInfo.CurrentRegion
确定当前位置时,它总是返回GB,因此它总是无法解析,因为它将使用GB数字格式设置解释意大利价格。

由于我需要初始化与存储区域相关的CultureInfo对象,有没有办法通过代码检索此信息

谢谢


我已经尝试过的事情 :

  • 使用
    CultureInfo.CurrentCulture
    ,无论发生什么情况,它都返回GB
  • 使用
    CultureInfo.CurrentUICulture
    ,无论发生什么情况,它都返回GB
  • 使用
    RegionInfo.CurrentRegion
    ,无论发生什么情况,它都返回GB

    • 这是
      CultureInfo
      类的一个问题。您应该使用Win32 API来获取
      CultureInfo

      你可以从C++中调用这个代码,然后从C++调用它,或者你可以从PInvoke用C语言来做它,因为它已经存在于DLL文件中。 无需从头开始重新执行此操作,因为网站已经为API制作了

      CultureInfoHelper
      wrapper

      您可以这样使用它:

      CultureInfo cultureInfo = CultureInfoHelper.GetCurrentCulture();
      
      CultureInfo助手
      脚本:

      public class CultureInfoHelper
      {
          [DllImport("api-ms-win-core-localization-l1-2-0.dll", CharSet = CharSet.Unicode)]
          private static extern int GetLocaleInfoEx(string lpLocaleName, uint LCType, StringBuilder lpLCData, int cchData);
      
          private const uint LOCALE_SNAME = 0x0000005c;
          private const string LOCALE_NAME_USER_DEFAULT = null;
          private const string LOCALE_NAME_SYSTEM_DEFAULT = "!x-sys-default-locale";
      
          private const int BUFFER_SIZE = 530;
      
          public static CultureInfo GetCurrentCulture()
          {
              var name = InvokeGetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SNAME);
      
              if (name == null)
              {
                  name = InvokeGetLocaleInfoEx(LOCALE_NAME_SYSTEM_DEFAULT, LOCALE_SNAME);
      
                  if (name == null)
                  {
                      // If system default doesn't work, use invariant
                      return CultureInfo.InvariantCulture;
                  }
              }
      
              return new CultureInfo(name);
          }
      
          private static string InvokeGetLocaleInfoEx(string lpLocaleName, uint LCType)
          {
              var buffer = new StringBuilder(BUFFER_SIZE);
      
              var resultCode = GetLocaleInfoEx(lpLocaleName, LCType, buffer, BUFFER_SIZE);
      
              if (resultCode > 0)
              {
                  return buffer.ToString();
              }
      
              return null;
          }
      }
      

      我不确定从您的问题中是否理解,您是否有格式化price的区域性名称?不,我无法检索有关存储区域的任何信息,因此我无法初始化该特定区域的CultureInfo对象。只是为了确保,您是在用户设备上还是在服务器上运行此代码?无论格式化问题如何,你必须记住两种货币之间的汇率;1英镑可能等于1欧元,也可能不等于1欧元,而且会发生变化daily@andriiLitvinov我在设备上运行这个,不幸的是它仍然返回en GB。店面区域仍然是意大利,我得到的价格仍然是欧元,所以我需要找到一种方法来获得店面区域的参考,而不是系统文化。我以为你想要得到这个区域。在您的屏幕截图中用红色圈出的那个?我确实想得到那个区域,但我刚刚实现了您提供的解决方案,它仍然返回en GBMine,并从设置中返回正确的值。你希望它会回来什么?另外,您正在访问
      CultureInfo
      中的哪些属性/变量?确定。我看看还能做些什么