【问题标题】:Parse currency with custom store region使用自定义商店区域解析货币
【发布时间】:2017-05-15 21:44:19
【问题描述】:

问题大纲

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

这里的问题是我需要考虑所有的边缘情况,例如,用户位于国外,系统在该语言环境下运行,但将商店设置为从他家接收内容地区。

例如,我目前将我的电脑(GB 地区,GB 系统语言)设置为 从意大利商店接收内容,所以我收到的价格为欧元,并以逗号作为小数的分隔符,但当我尝试使用CultureInfo.CurrentCultureRegionInfo.CurrentRegion 来确定我的当前位置它总是返回GB,因此它总是无法解析,因为它会使用GB NumberFormat 设置来解释意大利价格。

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

谢谢。


我已经尝试过的事情

【问题讨论】:

  • 不确定我是否理解您的问题,您是否知道价格格式所在的文化名称?
  • 不,我无法检索有关商店区域的任何信息,因此我无法为该特定区域初始化 CultureInfo 对象。
  • 只是为了确定,您是在用户设备上还是在服务器上运行此代码?
  • 无论格式问题,您必须牢记货币之间的汇率; 1 英镑可能等于也可能不等于 1 欧元,而且每天都在变化
  • @andriiLitvinov 我在设备上运行这个

标签: c# uwp windows-10-universal


【解决方案1】:

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

您可以从 C++ 执行此操作,然后从 C# 调用它,或者您可以使用 PInvoke 从 C# 执行此操作,因为它已经存在于dll文件。

无需从头开始重新执行此操作,因为this 网站已经为GetLocaleInfoEx API 制作了CultureInfoHelper 包装器。

你可以这样使用它:

CultureInfo cultureInfo = CultureInfoHelper.GetCurrentCulture();

CultureInfoHelper 脚本:

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;
    }
}

【讨论】:

  • 不幸的是它仍然返回 en-GB。商店区域仍然是意大利,我得到的价格仍然是欧元,所以我需要找到一种方法来获取商店区域的参考,而不是系统文化。
  • 我以为你想获得该地区。屏幕截图中用红色圈出的那个?
  • 我确实想获得那个区域,但我刚刚实施了您提供的解决方案,它仍然返回 en-GB
  • 我的从设置中返回正确的值。你期望它返回什么?另外,您正在访问来自CultureInfo 的哪些属性/变量?
  • 好的。我会看看我还能做什么
猜你喜欢
  • 2021-02-26
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多