Парсинг валюты с настраиваемым регионом магазина

Схема проблемы

Мне нужно получить числовое значение цены приобретенного продукта, для этого мне нужно проанализировать FormattedPrice, полученный из объекта ProductListing, который я получаю, как описано здесь.

Проблема здесь в том, что мне нужно рассмотреть все крайние случаи, например случай, когда пользователь находится в другой стране, имеет систему, работающую с этой локалью, но настраивает магазин для получения контента из своего домашнего региона.

Например, в настоящее время я настроил свой компьютер (регион ГБ, язык системы ГБ) на получение контента из итальянского магазина, поэтому я получаю цены в евро и с запятой в качестве разделителя десятичных знаков, но когда я пытаюсь определить мое текущее местоположение с помощью CultureInfo.CurrentCulture или RegionInfo.CurrentRegion он всегда возвращает ГБ, поэтому он всегда не сможет выполнить синтаксический анализ, поскольку будет интерпретировать итальянские цены с настройкой GB NumberFormat. Регион магазина отличается от фактического региона системы

Поскольку мне нужно инициализировать объект CultureInfo, связанный с регионом магазина, есть ли способ получить эту информацию с помощью кода?

Спасибо.


Вещи, которые я уже пробовал

:


person Sergio Bonfiglio    schedule 12.05.2017    source источник
comment
Не уверен, что понял из вашего вопроса, есть ли у вас название культуры, в которой была отформатирована цена?   -  person Andrii Litvinov    schedule 12.05.2017
comment
Нет, я не могу получить информацию о регионе магазина, поэтому я не могу инициализировать объект CultureInfo для этого конкретного региона.   -  person Sergio Bonfiglio    schedule 12.05.2017
comment
Просто чтобы убедиться, вы запускаете этот код на пользовательском устройстве или на сервере?   -  person Andrii Litvinov    schedule 12.05.2017
comment
Независимо от проблемы с форматированием, вы должны помнить об обменном курсе между валютами; 1 фунт может равняться или не равняться 1 евро, и он меняется ежедневно   -  person Mad Myche    schedule 12.05.2017
comment
@andriiLitvinov Я запускаю это на устройстве   -  person Sergio Bonfiglio    schedule 12.05.2017
comment
@MadMyche Мне не нужно делать никаких преобразований, мне просто нужно преобразовать некоторую строку валюты в переменную с плавающей запятой   -  person Sergio Bonfiglio    schedule 12.05.2017
comment
Store Region не нужен, ваша связанная документация показывает, что CurrencyCode является доступным свойством и соответствует NumberFormatInfo, поэтому вы можете его проанализировать.   -  person Mad Myche    schedule 12.05.2017
comment
Я уже пытался использовать свойство CurrencyCode, как я сказал в нижней части. На самом деле я связал другой вопрос, где пытался найти ему альтернативу, потому что он не работает ниже определенной версии Windows10.   -  person Sergio Bonfiglio    schedule 12.05.2017


Ответы (1)


Это проблема с классом CultureInfo. Вы должны использовать Win32 API, который является GetLocaleInfoEx, чтобы получить CultureInfo.

Вы можете сделать это из C++, а затем вызвать его из C# или вы можете сделать это из C# с помощью PInvoke, поскольку он уже существует в файле dll.

Нет необходимости повторять это с нуля, потому что этот веб-сайт уже сделал CultureInfoHelper оболочку для GetLocaleInfoEx API.

Вы используете это так:

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;
    }
}
person Programmer    schedule 12.05.2017
comment
К сожалению, он по-прежнему возвращает en-GB. Регион магазина по-прежнему Италия, а цены, которые я получаю, по-прежнему указаны в евро, поэтому мне нужно найти способ получить ссылку на регион магазина, а не на культуру системы. - person Sergio Bonfiglio; 12.05.2017
comment
Я думал, ты хочешь получить регион. Тот, что обведен красным на скриншоте? - person Programmer; 12.05.2017
comment
Я хочу получить этот регион, но я только что применил предоставленное вами решение, и оно по-прежнему возвращает en-GB. - person Sergio Bonfiglio; 12.05.2017
comment
Мой возвращает правильное значение из настроек. Что вы ожидаете, что он вернется? Кроме того, к какому свойству/переменной из CultureInfo вы обращаетесь? - person Programmer; 12.05.2017
comment
Я пытаюсь получить NumberFormat. Поскольку в поле «Страна или регион» указано значение «Италия», я ожидаю получить ИТ вместо ГБ. - person Sergio Bonfiglio; 12.05.2017
comment
Ok. Я посмотрю, что еще я могу сделать - person Programmer; 12.05.2017
comment
Пожалуйста, попробуйте CultureInfo.CurrentUICulture и CultureInfo.InstalledUICulture.... Он все еще дает en-GB? - person Programmer; 13.05.2017
comment
Итак: CultureInfo.InstalledUICulture недоступно в .Net Framework 4.5. CultureInfo.CurrentUICulture возвращает en-GB. Даже если первый был доступен, его описание означает, что его поведение не то, что я ищу. - person Sergio Bonfiglio; 15.05.2017