سؤال

لدي الكود التالي لتحليل متغير سلسلة يسمى str.

NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);

أريد الحصول على الاستثناء الذي تم طرحه عندما لا يكون str رقمًا فقط للتحقق من صحته.المشكلة التي أواجهها هي أنها لا تطرح دائمًا ParseException المتوقع.عندما تبدأ سلسلة String برقم ولكن بعد ذلك تكون أحرفًا، يبدو أنها تحصل على الأحرف الأولى من السلسلة وتقوم بتحليلها كرقم.

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

  • إذا كان str = "a10" فسيتم طرح ParseException
  • إذا كانت str = "10a" فلن يتم طرح أي استثناء ويكون الرقم = 10

لا يمكنني استخدام Double.parseDouble(str) لأن str يمكن أن تحتوي على فواصل ونقاط مثل 1,000.98 وهذا التنسيق غير مفهوم بهذه الطريقة.

لماذا يحدث هذا؟هل يمكنني التحقق من صحتها بأي طريقة أخرى؟شكرًا

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

المحلول

السلوك ليس غريبًا، إنه مصمم

يوزع النص من بداية السلسلة المحددة لإنتاج رقم.قد لا تستخدم الطريقة النص الكامل للسلسلة المحددة.

يمكنك استخدام طريقة التحليل المدرك للموضع كما يلي:

public static double parse(String str) throws ParseException {
  NumberFormat formatter = NumberFormat.getInstance();
  ParsePosition position = new ParsePosition(0);
  Number number = formatter.parse(str, position);
  if (position.getIndex() != str.length()) {
    throw new ParseException("failed to parse entire string: " + str, position.getIndex());
  }
  return number.doubleValue();
} 

نصائح أخرى

إذا نظرت إلى واجهة برمجة التطبيقات, ، يقول بوضوح:

يخلع النص من بداية السلسلة المحددة لإنتاج رقم.قد لا تستخدم الطريقة النص الكامل للسلسلة المحددة.

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

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