2010-02-15 4 views
6

मेरे पास स्ट्रिंग चर नामक स्ट्रिंग वैरिएबल को पार्स करने के लिए निम्न कोड है।संख्याफॉर्मैट जावा का अजीब व्यवहार

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

मैं अपवाद को पकड़ना चाहता हूं जब स्ट्रेट केवल इसे सत्यापित करने के लिए संख्या नहीं है। मेरी समस्या यह है कि यह हमेशा ParseException अपेक्षित फेंकता नहीं है। जब स्ट्रिंग स्ट्र एक संख्या से शुरू होता है लेकिन फिर वर्ण होते हैं तो ऐसा लगता है कि स्ट्रिंग के पहले अक्षर मिलते हैं और उन्हें एक संख्या के रूप में पार्स करते हैं।

उदाहरण के लिए:

  • अगर str = "A10" फिर एक ParseException फेंक दिया जाता है
  • अगर str = "10A" तो कोई अपवाद नहीं फेंक दिया और संख्या = 10

मैं उपयोग नहीं कर सकते Double.parseDouble (str) क्योंकि str में अल्पविराम और अंक 1000.98 हो सकते हैं और यह प्रारूप इस विधि से नहीं समझा जाता है।

ऐसा क्यों हो रहा है? क्या मैं इसे किसी अन्य तरीके से मान्य कर सकता हूं? धन्यवाद

+1

मेरा मतलब नहीं था कि NumberFormat के व्यवहार गलत था, लेकिन मैं एपीआई गलत समझा था। मैंने सोचा था कि स्थिति इंगित करना था जब तक कि मैं कौन सा चरित्र स्ट्रिंग को पार्स करना चाहता था। अब मैं समझता हूं कि यह इस तरह से क्यों डिजाइन किया गया है। आपके सभी एवरों के लिए धन्यवाद। – Javi

उत्तर

6

व्यवहार, अजीब नहीं है, यह देखते हुए स्ट्रिंग एक नंबर का उत्पादन करने की शुरुआत से तैयार किया गया

पार्स पाठ के रूप में है। विधि दिए गए स्ट्रिंग के पूरे पाठ का उपयोग नहीं कर सकती है।

आप इस तरह की स्थिति अवगत पार्स विधि का उपयोग कर सकते हैं:

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(); 
} 
+0

मेरे लिए उपयोगी: अगर आप एक पूर्णांक की अपेक्षा करते समय फ़्लोट पाते हैं तो अपवाद फेंकने के लिए 'setParseIntegerOnly (true)' का उपयोग करें – xdola

6

आप API को देखें, तो यह स्पष्ट रूप से कहते हैं: दिया स्ट्रिंग एक नंबर का उत्पादन करने की शुरुआत से

पार्स पाठ। विधि दिए गए स्ट्रिंग के के पूरे पाठ का उपयोग नहीं कर सकती है।

आप कितनी दूर पार्सर पार्स देखना चाहते हैं, तो आप other position-aware method उपयोग कर सकते हैं। इस तरह आप जांच सकते हैं कि आपके पास कोई पिछला निशान है या नहीं। आप सामान्य लैंग्स isAlpha उदाहरण के लिए अल्फान्यूमेरिक वर्णों के लिए पूरी स्ट्रिंग को भी देख सकते हैं।

+0

क्षमा करें sfussenegger, स्थिति को जागरूक विधि के साथ अपडेट करने से पहले आपकी पोस्ट नहीं देखी गई। –

+0

@ डिज़ाउन सबसे अधिक संभावना है क्योंकि आप मुझसे अधिक तेज हैं;) – sfussenegger