अपवाद, प्रवाह नियंत्रण के लिए नहीं किया जाना चाहिए, हालांकि जावा के लेखकों बना यह मुश्किल NumberFormatException
कि जिस तरह से उपयोग नहीं करने के लिए।
कक्षा java.util.Scanner
में hasNextDouble
एक विधि है ताकि यह जांच सके कि String
को डबल के रूप में पढ़ा जा सकता है या नहीं।
हुड के तहत Scanner
नियमित अभिव्यक्तियों (पूर्व-संकलित पैटर्न के माध्यम से) का उपयोग यह निर्धारित करने के लिए करता है कि String
को पूर्णांक या फ़्लोटिंग पॉइंट नंबर में परिवर्तित किया जा सकता है या नहीं। पैटर्न buildFloatAndDecimalPattern
विधि में संकलित किए गए हैं जिन्हें आप GrepCode here पर देख सकते हैं।
एक पूर्व-संकलित पैटर्न में प्रयास/पकड़ ब्लॉक का उपयोग करने से तेज़ होने का अतिरिक्त लाभ होता है।
यहाँ विधि ऊपर संदर्भित है, मामले में GrepCode एक दिन गायब हो जाता है:
private void buildFloatAndDecimalPattern() {
// \\p{javaDigit} may not be perfect, see above
String digit = "([0-9]|(\\p{javaDigit}))";
String exponent = "([eE][+-]?"+digit+"+)?";
String groupedNumeral = "("+non0Digit+digit+"?"+digit+"?("+
groupSeparator+digit+digit+digit+")+)";
// Once again digit++ is used for performance, as above
String numeral = "(("+digit+"++)|"+groupedNumeral+")";
String decimalNumeral = "("+numeral+"|"+numeral +
decimalSeparator + digit + "*+|"+ decimalSeparator +
digit + "++)";
String nonNumber = "(NaN|"+nanString+"|Infinity|"+
infinityString+")";
String positiveFloat = "(" + positivePrefix + decimalNumeral +
positiveSuffix + exponent + ")";
String negativeFloat = "(" + negativePrefix + decimalNumeral +
negativeSuffix + exponent + ")";
String decimal = "(([-+]?" + decimalNumeral + exponent + ")|"+
positiveFloat + "|" + negativeFloat + ")";
String hexFloat =
"[-+]?0[xX][0-9a-fA-F]*\\.[0-9a-fA-F]+([pP][-+]?[0-9]+)?";
String positiveNonNumber = "(" + positivePrefix + nonNumber +
positiveSuffix + ")";
String negativeNonNumber = "(" + negativePrefix + nonNumber +
negativeSuffix + ")";
String signedNonNumber = "(([-+]?"+nonNumber+")|" +
positiveNonNumber + "|" +
negativeNonNumber + ")";
floatPattern = Pattern.compile(decimal + "|" + hexFloat + "|" +
signedNonNumber);
decimalPattern = Pattern.compile(decimal);
}
AFAIK, उस पर एक डबल .parseDouble (स्ट्रिंग) करें और यह अपवाद फेंकता है अगर यह संख्याओं से शुरू नहीं होता है। (यहां सामान्यीकृत)। यदि आप regExs करना चाहते हैं और अग्रणी गैर-संख्या वर्णों को अलग करना चाहते हैं जो एक अलग कहानी है। – Rcunn87
खैर, AFAIK, कोशिश-पकड़ धीमा होने लगता है। – JHollanti
मैं regex विचार पर दूसरे Rcunn87 पर जा रहा हूं, लेकिन सुनिश्चित करें कि आप इसे संकलित करें और इसे स्थिर रूप से संग्रहीत करें ताकि आप इसे बार-बार उपयोग कर सकें। –