2010-08-17 12 views
16

के लिए सबसे सुरुचिपूर्ण isNumeric() समाधान है, मैं अभी जावा पर PHP कोड का एक छोटा स्निपेट पोर्ट कर रहा हूं, और यह संख्या निर्धारित करने के लिए is_numeric($x) पर निर्भर था। जावा में एक समकक्ष कार्य प्रतीत नहीं होता है, और मैं अब तक पाए गए मौजूदा समाधानों से संतुष्ट नहीं हूं।जावा

मैं नियमित अभिव्यक्ति समाधान की ओर झुकाव रहा हूँ मिली: http://rosettacode.org/wiki/Determine_if_a_string_is_numeric

जो विधि का उपयोग करना चाहिए और क्यों?

+0

आप वास्तव में संख्यात्मक से क्या मतलब है? क्या आप वास्तव में PHP परिभाषा चाहते हैं? http://php.net/manual/en/function.is-numeric.php –

+0

बिल्कुल PHP परिभाषा से मेल नहीं खाता है, लेकिन यह तब अच्छा होगा जब से मुझे पता चल जाए कि मेरे एल्गोरिदम उस फ़ंक्शन के साथ काम करता है। – Doug

उत्तर

16

ध्यान दें कि PHP isNumeric() फ़ंक्शन सही ढंग से निर्धारित करेगा कि हेक्स और वैज्ञानिक नोटेशन संख्याएं हैं, जो आपके द्वारा लिंक किए गए रेगेक्स दृष्टिकोण नहीं होंगे।

एक विकल्प, विशेष रूप से यदि आप पहले से ही अपाचे कॉमन्स पुस्तकालयों का उपयोग कर रहे हैं, तो कॉमन्स-लैंग से NumberUtils.isNumber() का उपयोग करना है। यह वही मामलों को संभालेगा जो PHP फ़ंक्शन संभाल लेंगे।

+0

यह फ़ंक्शन ठीक वही करता है जो मैं चाहता हूं, लेकिन मैं अपाचे कॉमन्स लाइब्रेरी का उपयोग नहीं कर रहा हूं :( – Doug

+3

@ डॉग कॉमन्स लैंग हर जावा प्रोग्राम में काफी मौजूद है, यह * बहुत * तरीकों से मदद करता है। इसे डाउनलोड करें और जोड़ें यह आपके क्लासपाथ पर है, आपको खुशी होगी कि आपने – TheLQ

+2

किया था यह तय करना हमेशा मुश्किल होता है कि पुस्तकालय जोड़ने के लिए उचित है या नहीं, जब आपको केवल एक छोटे टुकड़े की आवश्यकता होती है। लेकिन संभव है कि, यदि आप इसे देखते हैं, तो आप पाएंगे अपाचे कॉमन्स लैंग आपको अन्य चीजें दे सकता है जो आप उपयोग करेंगे - यह मूल रूप से "सामान है जो जावा में बनाया जाना चाहिए लेकिन यह नहीं है"। मैं सामान्य जावा कूकबुक की सिफारिश करता हूं (http://www.discursive.com/ किताबें/cjcook/संदर्भ/book-cjcook.html) जो अपाचे लाइब्रेरी का उपयोग करने के लिए बहुत सारी युक्तियां देता है। –

1

क्या आपने Integer.parseInt() को आजमाया था? (मुझे विधि नाम के बारे में निश्चित नहीं है, लेकिन इंटीगर क्लास में एक विधि है जो स्ट्रिंग से इंटीजर ऑब्जेक्ट बनाता है)। या यदि आपको गैर-पूर्णांक संख्याओं को संभालने की आवश्यकता है, तो इसी तरह के तरीके डबल ऑब्जेक्ट्स के लिए भी उपलब्ध हैं। यदि ये विफल हो जाते हैं, तो एक अपवाद फेंक दिया जाता है।

यदि आपको बहुत बड़ी संख्या (int/double से बड़ा) पार्स करने की आवश्यकता है, और सटीक मान की आवश्यकता नहीं है, तो एक साधारण रेगेक्स आधारित विधि पर्याप्त हो सकती है।

+2

यदि आप स्ट्रिंग्स का उचित अनुपात होने की अपेक्षा करते हैं जो संख्यात्मक नहीं हैं, तो उन्हें खोजने के लिए एक अपवाद का उपयोग करके खराब अभ्यास (एक गैर-संख्यात्मक स्ट्रिंग "असाधारण" नहीं है) और प्रदर्शन समस्याओं का कारण बन सकता है। –

+0

सच है। यह उपयोग परिदृश्यों पर निर्भर करता है। –

2

आमतौर पर एक स्ट्रिंग में एक संख्या होने का बुरा विचार है। यदि आप इस नंबर का उपयोग करना चाहते हैं तो इसे पार्स करें और इसे संख्यात्मक के रूप में उपयोग करें। यदि यह संख्यात्मक है, तो आपको "चेक" करने की आवश्यकता नहीं है, या तो आप इसे संख्यात्मक के रूप में उपयोग करना चाहते हैं या नहीं।

आप इसे बदलने की आवश्यकता है, तो आप Integer.parseInt(String) से हर पार्सर BigDecimal(String)

को आप सिर्फ जांच करने के लिए है कि सामग्री एक अंकीय रूप में देखा जा सकता है तो आप नियमित अभिव्यक्ति के साथ भाग प्राप्त कर सकते हैं की जरूरत है उपयोग कर सकते हैं।

और यदि आपकी स्ट्रिंग में फ्लोट हो, तो parseInt का उपयोग न करें।

+0

आमतौर पर, यदि कोई व्यक्ति न्यूमेरिक विधि की तलाश में है, तो वे खूनी अच्छी तरह से खराब संख्या को स्ट्रिंग में नहीं डालते हैं;) – Jostikas

4

क्या आपने StringUtils library का उपयोग करने में देखा है? एक isNumeric() फ़ंक्शन है जो आप जो खोज रहे हैं वह हो सकता है। (ध्यान दें कि "" का मूल्यांकन सही होगा)

+0

कॉमन्स न्यूमेरिक फ़ंक्शन केवल पूर्णांक की तलाश में है - यह अस्वीकार कर देगा, उदाहरण के लिए, एक संख्या जिसमें दशमलव बिंदु, और निश्चित रूप से वैज्ञानिक नोटेशन स्वीकार नहीं करता है। एक अलग कॉमन्स फ़ंक्शन के लिए मेरा उत्तर देखें जो आप जो खोज रहे हैं उसके करीब लगता है। –

+0

@ जैकोबएम: वास्तव में, मैंने यह संख्या देखी और जब मैंने आपकी टिप्पणी देखी तो मेरा जवाब अपडेट करना चालू था। –

2

वैकल्पिक रूप से आप नियमित अभिव्यक्ति का भी उपयोग कर सकते हैं।

if (theString.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))) 
    return true; 

    return false; 
+0

उस अंतिम '+'? '"-7.0-4.2" के साथ क्या है, इस अभिव्यक्ति के लिए सही होगा। – Doug

0

दृढ़ता से टाइप की गई भाषा में, एक सामान्य है संख्यात्मक (स्ट्रिंग num) विधि बहुत उपयोगी नहीं है। 13214384348934918434441 संख्यात्मक है, लेकिन अधिकांश प्रकार में फिट नहीं होगा। फिट बैठने वालों में से कई एक ही मूल्य वापस नहीं करेंगे।

कॉलिन ने नोट किया है कि आवेदन के साथ स्ट्रिंग्स में संख्याएं ले जाने की अनुशंसा नहीं की जाती है। IsNumberic फ़ंक्शन केवल इंटरफ़ेस विधियों पर इनपुट डेटा के लिए लागू होना चाहिए। इन्हें संख्यात्मक से अधिक सटीक परिभाषा होनी चाहिए। अन्य ने विभिन्न समाधान प्रदान किए हैं। स्ट्रिंग लम्बाई समेत कई स्थितियों का परीक्षण करने के लिए नियमित अभिव्यक्तियों का उपयोग किया जा सकता है।

0

बस का उपयोग करता है, तो ((संख्या instanceof एक्स)

// अगर parsable संख्या भी

|| (के लिए जाँच एक्स स्ट्रिंग & instanceof & x.matches ("((- | \ +)? [0-9] + (\। सहित [0-9] +)?) + "))

) { ... }
// --- सभी सांख्यिक प्रकार BigDecimal का विस्तार संख्या