سؤال

ما هي أفضل طريقة لتحليل التعويم في CSharp؟أعرف شيئًا عن TryParse، لكن ما أتساءل عنه بشكل خاص هو النقاط والفواصل وما إلى ذلك.

أواجه مشاكل مع موقع الويب الخاص بي.على خادم DEV الخاص بي ، "،" مخصص للعشريات ، "." للفاصل.على الرغم من ذلك، على خادم همز، هو العكس.كيف يمكنني التقاط هذا بشكل أفضل؟

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

المحلول

يعتمد على المكان الذي يأتي منه الإدخال.

إذا كانت مدخلاتك تأتي من المستخدم، فيجب عليك استخدام CultureInfo الذي يستخدمه المستخدم/الصفحة (Thread.CurrentThread.CurrentUICulture).

يمكنك الحصول على ومؤشر على ثقافة المستخدم، من خلال النظر في HttpRequest.UserLanguages ملكية.(ليس صحيحًا بنسبة 100%، ولكني وجدته تخمينًا أوليًا جيدًا جدًا) باستخدام هذه المعلومات، يمكنك تعيين Thread.CurrentThread.CurrentUICulture في بداية الصفحة.

إذا كانت مدخلاتك تأتي من مصدر داخلي، فيمكنك استخدام الثقافة الثابتة لتحليل السلسلة.

تعد طريقة Parse أسهل في الاستخدام إلى حد ما، إذا كانت مدخلاتك من مصدر متحكم فيه.أي أنك قمت بالفعل بالتحقق من صحة السلسلة.يلقي التحليل استثناءً (بطيئًا) في حالة فشله.

إذا كان الإدخال غير متحكم فيه، (من المستخدم، أو مصدر إنترنت آخر)، فسيتم حاول التحليل يبدو أفضل بالنسبة لي.

نصائح أخرى

أنا أتفق مع رد ليبي.لوضع ذلك من حيث الكود:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);

يمكنك دائمًا استخدام التحميل الزائد لـ تحليل والتي تشمل الثقافة لاستخدامها؟

على سبيل المثال:

double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting

إذا كان لديك القدرة على التحكم في جميع بياناتك، فيجب عليك استخدام "CultureInfo.InvariantCulture" في جميع التعليمات البرمجية الخاصة بك.

إذا كنت تريد استمرار القيم (الأرقام والتاريخ والوقت وما إلى ذلك ...) لغرض داخلي.في كل مرة استخدم "InvariantCulture" لتنسيق القيم وتحليلها."InvariantCulture" هو نفسه على كل جهاز كمبيوتر، وكل نظام تشغيل مع ثقافة/لغة أي مستخدم/إلخ...

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo);
float numFloat  = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat);
string strNow   = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo);
DateTime now    = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow);

استخدم ثقافة محايدة (أو ثقافة تعرفها) عند التحليل باستخدام Try/Parse.

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

على سبيل المثال للتأكد من أن "". تم التعامل مع الحرف كمؤشر عشري يمكنك أن تمرر في CultureInfo.InvariantCulture (عادةً ما يكون هذا الشخص مفيدًا جدًا في تطبيقات الخادم حيث تميل إلى أن تكون الأمور هي نفسها بغض النظر عن ثقافة البيئة).

حاول تجنب float.Parse، واستخدم TryParse بدلاً من ذلك لأنه يؤدي أداءً أفضل كثيرًا ولكنه يقوم بنفس المهمة.ينطبق هذا أيضًا على double وDateTime وما إلى ذلك...

(تقدم بعض الأنواع أيضًا TryParseExact والذي يعمل أيضًا بشكل أفضل!)

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

وهذا من شأنه أيضًا أن يمنحني ثقافة الخادم الذي يعمل عليه حاليًا، ولكن بما أنه شبكة الويب العالمية، يمكن للمستخدم أن يكون من أي مكان...

يمكنك معرفة Cuklture الحالي لخادمك ببيان بسيط:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

لاحظ أن هناك معرف خاصية CurrentUICulture، ولكن يتم استخدام UICulture من تطبيقات متعددة اللغات من نموذج ResourceMeanager.لتنسيق الأرقام، يجب عليك مراعاة CurrentCulture.

آمل أن يكون هذا سيساعدك

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

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