แยกวิเคราะห์สกุลเงินด้วยภูมิภาคร้านค้าที่กำหนดเอง

โครงร่างปัญหา

ฉันต้องได้รับค่าตัวเลขสำหรับราคาของผลิตภัณฑ์ที่ซื้อ เพื่อดำเนินการดังกล่าว ฉันต้องแยกวิเคราะห์ FormattedPrice ที่ได้รับจากออบเจ็กต์ ProductListing ที่ฉันได้รับ ตามที่ระบุไว้ในเอกสารที่นี่

ปัญหาคือต้องพิจารณา Edge Case ทั้งหมด เช่น กรณีที่ผู้ใช้อยู่ต่างประเทศ มีระบบทำงานด้วย Locale นั้น แต่ตั้งค่า Store ให้รับเนื้อหาจากภูมิภาคบ้านเกิด

ตัวอย่างเช่น ขณะนี้ฉันตั้งค่าพีซีของฉัน (ภูมิภาค GB, ภาษาของระบบ GB) ให้ รับเนื้อหาจากร้านค้าในอิตาลี ดังนั้นฉันจึงได้รับราคาเป็นสกุลเงินยูโรและมีเครื่องหมายจุลภาคเป็นตัวคั่นทศนิยม แต่เมื่อฉันพยายาม ระบุตำแหน่งปัจจุบันของฉันด้วย CultureInfo.CurrentCulture หรือ RegionInfo.CurrentRegion จะส่งกลับ GB เสมอ ดังนั้นจึงไม่สามารถแยกวิเคราะห์ได้เสมอ เนื่องจากจะตีความราคาอิตาลีด้วยการตั้งค่า 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
ไม่จำเป็นต้องใช้ภูมิภาคของร้านค้า เอกสารที่เชื่อมโยงของคุณแสดงว่า 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# ด้วย PInpoke เนื่องจากมีอยู่แล้วในไฟล์ dll

ไม่จำเป็นต้องทำซ้ำตั้งแต่ต้นเพราะ นี้ เว็บไซต์ได้สร้าง CultureInfoHelper wrapper สำหรับ 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
Mine ส่งกลับค่าที่ถูกต้องจากการตั้งค่า คุณคาดหวังว่ามันจะกลับมา? นอกจากนี้ คุณกำลังเข้าถึงคุณสมบัติ/ตัวแปรใดจาก CultureInfo - person Programmer; 12.05.2017
comment
ฉันกำลังพยายามหา NumberFormat เนื่องจากฟิลด์ประเทศหรือภูมิภาคของฉันถูกตั้งค่าเป็นอิตาลี ฉันคาดว่าจะได้รับไอทีแทนที่จะเป็น GB - person Sergio Bonfiglio; 12.05.2017
comment
ตกลง. ฉันจะดูว่าฉันสามารถทำอะไรได้อีก - 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