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对象,有没有办法通过代码检索此信息
谢谢
我已经尝试过的事情 :
- 使用
,无论发生什么情况,它都返回GBCultureInfo.CurrentCulture
- 使用
,无论发生什么情况,它都返回GBCultureInfo.CurrentUICulture
- 使用
,无论发生什么情况,它都返回GBRegionInfo.CurrentRegion
- 这是
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
中的哪些属性/变量?确定。我看看还能做些什么