النقطة العائمة عدد إعراب:هل هناك قبض على جميع الخوارزمية ؟

StackOverflow https://stackoverflow.com/questions/192

سؤال

واحدة من المرح أجزاء متعددة الثقافات البرمجة هو عدد الأشكال.

  • استخدام الأميركيين 10,000.50
  • الألمان استخدام 10.000,50
  • الفرنسية استخدام 10 000,50

أول النهج إلى اتخاذ سلسلة, تحليل للخلف حتى لقاء فاصل استخدام هذا الفاصل العشري.هناك عيب واضح في ذلك:10.000 يعني 10.

نهج آخر:إذا كانت السلسلة تحتوي على 2 مختلفة أحرف غير رقمية ، استخدام آخر واحد فاصل العلامة العشرية و تجاهل الآخرين.إذا كنت لا تملك إلا واحدة ، تحقق مما إذا كان يحدث أكثر من مرة و يتجاهل ذلك إذا كان كذلك.إذا لم يظهر إلا مرة واحدة ، تحقق مما إذا كان قد 3 ارقام بعد ذلك.إذا كان الجواب نعم, تخلص منه, وإلا استخدامه كفاصل عشري.

واضح "أفضل حل" سيكون للكشف عن ثقافة المستخدم أو المتصفح, ولكن هذا لا يعمل إذا كان لديك الفرنسي باستخدام en-US Windows/المتصفح.

لا .net Framework تحتوي على بعض الأسطورية السحر الأسود النقطة العائمة محلل أفضل من Double.(Try)Parse() في محاولة لصناعة السيارات في الكشف عن عدد تنسيق ؟

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

المحلول

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

نصائح أخرى

أنا لا أعرف ASP.NET جانب من المشكلة ولكن .صافي لديه قوية جدا الدرجة: النظام.العولمة.CultureInfo.يمكنك استخدام التعليمات البرمجية التالية إلى تحليل سلسلة التي تحتوي على قيمة مزدوجة:

double d = double.Parse("100.20", CultureInfo.CurrentCulture);
//  -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

إذا ASP.NET بطريقة أو بأخرى (أيباستخدام طلب HTTP headers) يمر المستخدم الحالي CultureInfo إما CultureInfo.CurrentCulture أو CultureInfo.CurrentUICulture هذه سوف تعمل بشكل جيد.

لا يمكنك إرضاء الجميع.إذا دخلت العشر كما 10.000 شخص يدخل عشرة آلاف كما 10.000 لا يمكنك التعامل مع ذلك دون بعض المعرفة ثقافة الإدخال.الكشف عن الثقافة بطريقة أو بأخرى (المتصفح, نظام تحديد ما هو استخدام القضية ؟ ASP ؟ الداخلية التطبيق, أو مفتوحة إلى العالم؟), أو تقديم مثال من المتوقع التنسيق ، واستخدام أكثر تساهلا محلل يمكنك.ربما شيء من هذا القبيل:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);

الفرق بين 12.345 في الفرنسية و الإنجليزية هو عامل من 1000.إذا كنت العرض النطاق المتوقع حيث ماكس < 1000*دقيقة, يمكنك تخمين بسهولة.

خذ على سبيل المثال ارتفاع شخص (بما في ذلك الرضع والأطفال) في مم.

باستخدام مجموعة من 200-3000 ، الإدخال من 1.800 أو 1800 يمكن بشكل لا لبس فيه أن يفسر 1 متر و 80 سم ، في حين مدخلا 912.300 أو 912,300 يمكن بشكل لا لبس فيه أن تفسر على أنها 91 سم و 2.3 ملم.

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