Parsing mata uang dengan wilayah toko khusus

Garis besar masalah

Saya perlu mendapatkan nilai numerik untuk harga produk yang dibeli, untuk melakukannya saya perlu mengurai FormattedPrice yang diterima dari objek ProductListing yang saya terima, seperti yang didokumentasikan di sini.

Masalahnya di sini adalah saya perlu mempertimbangkan semua kasus edge, misalnya kasus di mana pengguna berada di negara asing, memiliki sistem yang berjalan dengan lokal tersebut tetapi menyiapkan toko untuk menerima konten dari wilayah asalnya.

Misalnya saat ini saya menyetel komputer saya (wilayah GB, bahasa sistem GB) untuk menerima konten dari toko Italia, jadi saya menerima harga dalam euro dan dengan koma sebagai pemisah desimal, tetapi ketika saya mencoba tentukan lokasi saya saat ini dengan CultureInfo.CurrentCulture atau RegionInfo.CurrentRegion itu selalu mengembalikan GB, sehingga akan selalu gagal untuk diurai karena akan menafsirkan harga Italia dengan pengaturan GB NumberFormat. Wilayah penyimpanan berbeda dari wilayah sistem sebenarnya

Karena saya perlu menginisialisasi objek CultureInfo yang terkait dengan wilayah toko, apakah ada cara untuk mengambil informasi ini melalui kode?

Terima kasih.


Hal-hal yang sudah saya coba

:


person Sergio Bonfiglio    schedule 12.05.2017    source sumber
comment
Saya tidak yakin saya mengerti dari pertanyaan Anda, apakah Anda memiliki nama budaya di mana harga diformat?   -  person Andrii Litvinov    schedule 12.05.2017
comment
Tidak, saya tidak dapat mengambil informasi apa pun tentang wilayah penyimpanan, sehingga saya tidak dapat menginisialisasi objek CultureInfo untuk wilayah tertentu.   -  person Sergio Bonfiglio    schedule 12.05.2017
comment
Sekadar memastikan, apakah Anda menjalankan kode ini di perangkat pengguna atau di server?   -  person Andrii Litvinov    schedule 12.05.2017
comment
Terlepas dari masalah formatnya, Anda harus mengingat nilai tukar antar mata uang; 1 pon mungkin sama atau tidak sama dengan 1 euro, dan itu berubah setiap hari   -  person Mad Myche    schedule 12.05.2017
comment
@andriiLitvinov Saya menjalankan ini di perangkat   -  person Sergio Bonfiglio    schedule 12.05.2017
comment
@MadMyche Saya tidak perlu melakukan konversi apa pun, saya hanya perlu mengurai beberapa string mata uang ke variabel float   -  person Sergio Bonfiglio    schedule 12.05.2017
comment
Wilayah Penyimpanan tidak diperlukan, dokumentasi tertaut Anda menunjukkan bahwa CurrencyCode adalah properti yang tersedia, dan sesuai dengan NumberFormatInfo sehingga Anda dapat menguraikannya.   -  person Mad Myche    schedule 12.05.2017
comment
Saya sudah mencoba menggunakan properti CurrencyCode, seperti yang saya katakan di bagian bawah. Saya sebenarnya telah menautkan pertanyaan lain di mana saya mencoba mencari alternatifnya, karena itu tidak berfungsi di bawah versi Windows10 tertentu.   -  person Sergio Bonfiglio    schedule 12.05.2017


Jawaban (1)


Itu masalah dengan kelas CultureInfo. Anda harus menggunakan API Win32 yaitu GetLocaleInfoEx untuk mendapatkan CultureInfo.

Anda dapat melakukan ini dari C++ lalu memanggilnya dari C# atau Anda dapat melakukannya dari C# dengan PINvoke karena sudah ada di file dll.

Tidak perlu mengulanginya dari awal karena situs web ini telah membuat CultureInfoHelper pembungkus untuk GetLocaleInfoEx API.

Anda menggunakannya seperti ini:

CultureInfo cultureInfo = CultureInfoHelper.GetCurrentCulture();

Skrip 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
Sayangnya masih mengembalikan en-GB. Wilayah tokonya masih Italia dan harga yang saya dapatkan masih dalam euro, jadi saya perlu mencari cara untuk mendapatkan referensi ke wilayah toko, bukan budaya sistemnya. - person Sergio Bonfiglio; 12.05.2017
comment
Saya pikir Anda ingin mendapatkan wilayah tersebut. Yang dilingkari merah di tangkapan layar Anda? - person Programmer; 12.05.2017
comment
Saya ingin mendapatkan wilayah itu, tetapi saya baru saja menerapkan solusi yang Anda berikan dan masih mengembalikan en-GB - person Sergio Bonfiglio; 12.05.2017
comment
Milik saya mengembalikan nilai yang benar dari pengaturan. Apa yang Anda harapkan akan kembali? Juga, properti/variabel apa dari CultureInfo yang Anda akses? - person Programmer; 12.05.2017
comment
Saya mencoba mendapatkan NumberFormat. Karena bidang Negara atau Wilayah saya disetel ke Italia, saya mengharapkan untuk mendapatkan IT, bukan GB. - person Sergio Bonfiglio; 12.05.2017
comment
Oke. Saya akan melihat apa lagi yang bisa saya lakukan - person Programmer; 12.05.2017
comment
Silakan coba CultureInfo.CurrentUICulture dan CultureInfo.InstalledUICulture.... Apakah masih memberikan en-GB? - person Programmer; 13.05.2017
comment
Jadi:CultureInfo.InstalledUICulture tidak tersedia di .Net Framework 4.5. CultureInfo.CurrentUICulture mengembalikan en-GB. Meskipun yang pertama tersedia, deskripsinya menunjukkan bahwa perilakunya bukanlah yang saya cari. - person Sergio Bonfiglio; 15.05.2017