سؤال

هذا يقودني للجنون. لدي السلسلة التالية في صفحة Webform ASP.NET 2.0

string s = "0.009";

بسيطا بما فيه الكفاية. الآن، إذا كانت ثقافتي إسبانية - وهي "ES-ES" - وأحاول تحويل السلسلة إلى مضاعفة، فأنا أمتلك ما يلي:

double d = Double.Parse(s, new CultureInfo("es-ES"));

ما أتوقعه هو 0،009. بدلا من ذلك، أحصل على 9. أفهم أن .NET يعتقد أنه ألف فاصل، وهو في EN-US فاصلة، ولكن لا ينبغي أن تأخذ معلومات الثقافة التي أتخلى عن طريقة التحليل وتطبيق التنسيق الصحيح التحويل؟

إذا فعلت

double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));

منسق الآن 0،009. اي شخص؟

هل كانت مفيدة؟

المحلول

هو - هي يكون أخذ الثقافة التي قدمتها وتطبيق التنسيق الصحيح. لقد قدمت سلسلة من "0.009" وأخبرها أنها كانت إسبانية ... ثم تشكو من أنها تفسرها بشكل صحيح كما الإسبانية! لا تقل ذلك أن السلسلة إسبانية عندما تعرف أنها ليست كذلك.

يجب عليك اجتياز طريقة التحليل ثقافة السلسلة التي يتم تحليلها، والتي في هذه الحالة ستكون في هذه الحالة أو en-gb أو gbarytculture.

نصائح أخرى

ما يكتب جيس يعمل بالنسبة لي. فقط لأي شخص يحتاج إلى تجربة كيفية الحصول على "ثقافة ثابتة": يبدو هذا

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(أول وظيفة stackoverflow، لذلك نعم، هامشنوي إلى حد ما؛)

لديك إلى الوراء.

عندما تقول double d = Double.Parse(s, new CultureInfo("es-ES"));, ، أنت تسأل .NET لتحليل السلسلة الخاصة بك في ضعف، على افتراض أن السلسلة مكتوبة في ثقافة ES-ES.

في الثقافة الإسبانية، "." هو الفاصل الآلاف، لذلك "0.009" هو 9.

عند تحويله باستخدام ToString ()، في النهاية، فهو يقول تحويل 0.009 إلى سلسلة باستخدام الثقافة الإسبانية، لذلك يستخدم "،" كفاصل عشري، وحصلت على "0،009". السلوك صحيح.

تخميني هو أنك تريد استخدام Double.Parse مع الثقافة الثابتة، ومشاعر الثقافة الإسبانية، لذلك يصبح 0.009 0،009.

أعتقد أنك تفسرها بطريقة خاطئة، في ثقافة ES-ES 0.009 هي حقا مجرد طريق طويل لقول 9، كما "." ليس الفاصل العشري، لذلك إذا طلبت السلسلة "0.009" محظور مع ثقافة ES-ES، يجب أن تحصل في الواقع على Deouble 9.0. إذا طلبت ذلك تحليل "0،009" يجب أن تحصل على ضعف 0.009.

وبالمثل، إذا طلبت ذلك صيغة 0.009 مزدوج يجب أن تحصل على السلسلة "0،009" في ES-ES.

أنت تخطئ بالتحليل والتنسيق. تحصل على 9 بدلا من .009. تحتاج إلى تحليلها باستخدام أي ثقافة تم إنشاؤها باستخدامها ثم تنسيقها باستخدام أي ثقافة تريد عرضها.

double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));

في ES-ES Culture "،"، "هو Seporator عشري (وليس".)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top