NaN या IsNumeric का C # समतुल्य है?


103

एक इनपुट स्ट्रिंग के परीक्षण का सबसे कुशल तरीका क्या है जिसमें इसमें एक संख्यात्मक मान (या इसके विपरीत एक संख्या नहीं है)? मुझे लगता है कि मैं उपयोग कर सकता हूं Double.Parseया एक रेगेक्स (नीचे देखें) लेकिन मैं सोच रहा था कि क्या ऐसा करने के लिए कुछ तरीके से बनाया गया है, जैसे कि जावास्क्रिप्ट NaN()या IsNumeric()(क्या यह वीबी, मुझे याद नहीं है?)।

public static bool IsNumeric(this string value)
{
    return Regex.IsMatch(value, "^\\d+$");
}

जवाबों:


176

यह रेगेक्स ओवरहेड नहीं है

double myNum = 0;
String testVar = "Not A Number";

if (Double.TryParse(testVar, out myNum)) {
  // it is a number
} else {
  // it is not a number
}

संयोग से, सभी मानक डेटा प्रकार, GUIDs के आकर्षक अपवाद के साथ, TryParse का समर्थन करते हैं।

अपडेट
सीकवैप लाया गया कि मान "2345", उपरोक्त परीक्षण को एक संख्या के रूप में पारित करेगा। हालांकि, यदि आपको यह सुनिश्चित करने की आवश्यकता है कि स्ट्रिंग के भीतर सभी वर्ण अंक हैं, तो एक और दृष्टिकोण लिया जाना चाहिए।

उदाहरण 1 :

public Boolean IsNumber(String s) {
  Boolean value = true;
  foreach(Char c in s.ToCharArray()) {
    value = value && Char.IsDigit(c);
  }

  return value;
}

या यदि आप एक छोटे से अधिक फैंसी बनना चाहते हैं

public Boolean IsNumber(String value) {
  return value.All(Char.IsDigit);
}

अपडेट 2 (शून्य या खाली तारों से निपटने के लिए @stackonfire से)

public Boolean IsNumber(String s) { 
    Boolean value = true; 
    if (s == String.Empty || s == null) { 
        value=false; 
    } else { 
        foreach(Char c in s.ToCharArray()) { 
            value = value && Char.IsDigit(c); 
        } 
    } return value; 
}

यदि आवश्यक हो, आप सार्वजनिक स्थैतिक bool IsInteger (स्ट्रिंग sMaybeANumber) की तरह एक और अधिक उपयोगी उपयोगिता विधि में उपरोक्त कोड लपेट कर सकते हैं
Gishu

@ गिशु: आप सही हैं अगर आप इस बात की परवाह करते हैं कि नंबर कन्वर्ट हो सकता है या नहीं।
NotMe

2
इसके साथ एकमात्र मुद्दा Numberजावास्क्रिप्ट में ऑब्जेक्ट फ्लोट या पूर्णांक है, इसलिए डबल में बदलना। ट्रायपार्स एक अधिक सटीक समकक्ष होगा
क्रिस एस

7
आप इसे "NaN" और "Infinity" पार्स ए जैसे तार के साथ सावधान रहना चाह सकते हैं double, लेकिन कई उन्हें संख्यात्मक नहीं मानेंगे।
माइक जोबरे

1
अशक्त या खाली तारों से निपटने के लिए एक सही उदाहरण 1, जो अन्यथा IsNumber को गलत तरीके से वापस करने का कारण बन रहा था: public Boolean IsNumber(String s) { Boolean value = true; if (s == String.Empty || s == null) { value=false; } else { foreach(Char c in s.ToCharArray()) { value = value && Char.IsDigit(c); } } return value; }
स्टैकनफायर

41

मैं कुछ इस तरह से पसंद करता हूं, यह आपको यह तय NumberStyleकरने की अनुमति देता है कि किसके लिए परीक्षण करना है।

public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
    Double temp;
    Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
    return result;
}

7
+1। अब तक एकमात्र व्यक्ति होने के लिए Intry। के बजाय Double.TryParse के लिए। :)
जॉन्क

यह भी, जाहिर है, लगभग एक विस्तार विधि है।
एंथनी मस्तरीन

19

पिछले सही उत्तरों के अलावा, यह संभवतः इंगित करने के लायक है कि "सामान्य संख्या में नहीं" (NaN) इसके सामान्य उपयोग में एक स्ट्रिंग के बराबर नहीं है जो कि संख्यात्मक मान के रूप में मूल्यांकन नहीं किया जा सकता है। NaN को आमतौर पर "असंभव" गणना के परिणाम को दर्शाने के लिए उपयोग किए जाने वाले संख्यात्मक मान के रूप में समझा जाता है - जहां परिणाम अपरिभाषित होता है। इस संबंध में मैं कहूंगा कि जावास्क्रिप्ट का उपयोग थोड़ा भ्रामक है। C # NaN में एकल और दोहरे संख्यात्मक प्रकारों की संपत्ति के रूप में परिभाषित किया गया है और इसका उपयोग शून्य से डाइविंग शून्य के परिणाम को स्पष्ट रूप से संदर्भित करने के लिए किया जाता है। अन्य भाषाएं इसका उपयोग विभिन्न "असंभव" मूल्यों का प्रतिनिधित्व करने के लिए करती हैं।


11

मुझे पता है कि यह कई अलग-अलग तरीकों से उत्तर दिया गया है, एक्सटेंशन और लैम्ब्डा उदाहरणों के साथ, लेकिन सबसे सरल समाधान के लिए दोनों का संयोजन।

public static bool IsNumeric(this String s)
{
    return s.All(Char.IsDigit);
}

या यदि आप Visual Studio 2015 (C # 6.0 या अधिक) का उपयोग कर रहे हैं तो

public static bool IsNumeric(this String s) => s.All(Char.IsDigit);

एक लाइन पर भयानक सी # 6। बेशक यह सीमित है क्योंकि यह केवल संख्यात्मक पात्रों के लिए परीक्षण करता है।

उपयोग करने के लिए, बस एक स्ट्रिंग है और उस पर विधि को कॉल करें, जैसे:

bool IsaNumber = "123456".IsNumeric();

1
एक्सटेंशन के तरीकों से अपरिचित उपयोगकर्ताओं के लिए, कुछ और जानकारी (या कम से कम आसपास के स्थिर वर्ग को एक और अधिक उदाहरण प्रदान करने के लिए) को शामिल करना फायदेमंद हो सकता है।
जॉनीरोज

मुझे यह समाधान पसंद नहीं है क्योंकि यह दशमलव के साथ संख्याओं के लिए गलत होगा। यह पूर्णांक के लिए उपयोगी हो सकता है, लेकिन क्या आप विधि के लिए इसका उपयोग करना चाहते है कि के नाम दिया जाना चाहिए अगर IsInteger
technoman23

5

हाँ, IsNumeric VB है। आमतौर पर लोग TryParse () पद्धति का उपयोग करते हैं, हालांकि यह थोड़ा क्लंकी है। जैसा कि आपने सुझाव दिया था, आप हमेशा अपना लिख ​​सकते हैं।

int i;
if (int.TryParse(string, out i))
{

}

5

मुझे एक्सटेंशन विधि पसंद है, लेकिन यदि संभव हो तो अपवादों को फेंकना पसंद नहीं है। मैंने 2 उत्तरों में से सर्वश्रेष्ठ उत्तर देने के लिए एक विस्तार विधि का विकल्प चुना।

    /// <summary>
    /// Extension method that works out if a string is numeric or not
    /// </summary>
    /// <param name="str">string that may be a number</param>
    /// <returns>true if numeric, false if not</returns>
    public static bool IsNumeric(this String str)
    {
        double myNum = 0;
        if (Double.TryParse(str, out myNum))
        {
            return true;
        }
        return false;
    }

4

आप अभी भी C # में Visual Basic फ़ंक्शन का उपयोग कर सकते हैं। केवल एक चीज जो आपको करनी है, वह नीचे दिखाए गए मेरे निर्देशों का पालन करें:

  1. अपने प्रोजेक्ट पर राइट क्लिक करके और "संदर्भ जोड़ें" का चयन करके विज़ुअल बेसिक लाइब्रेरी का संदर्भ जोड़ें:

यहां छवि विवरण दर्ज करें

  1. फिर इसे अपनी कक्षा में आयात करें जैसा कि नीचे दिखाया गया है:

    Microsoft.VisualBasic का उपयोग करना;

  2. अगला इसका इस्तेमाल भी आप चाहते हैं के रूप में नीचे दिखाया गया है:

                if (!Information.IsNumeric(softwareVersion))
            {
                throw new DataException(string.Format("[{0}] is an invalid App Version!  Only numeric values are supported at this time.", softwareVersion));
            }

उम्मीद है इससे मदद मिलेगी और सौभाग्यशाली हो!


2
जब मैं इस विधि की सिफारिश नहीं होगा, यह है एक सही जवाब। निश्चित नहीं है कि इसे क्यों उतारा गया था, और चूंकि यह नहीं बताया गया था कि या तो, मैंने इसका प्रतिकार करने के लिए मतदान किया था :-)
अबेकस

4

VB का IsNumericकार्य है। आप इसका संदर्भ Microsoft.VisualBasic.dllऔर उपयोग कर सकते हैं।


क्या आप केवल .net के 2.0 संस्करणों में उस VB विधि को प्राप्त कर सकते हैं?
एड एस।

@ChuckD: यह व्यक्तिपरक है। क्या आप बाहरी पुस्तकालयों का उल्लेख करते हैं जो कि json के साथ काम करते हैं या खुद को json को पार्स करने के लिए यह सब लिखते हैं?
शालकपेश

@ChuckD: मुझे ड्राइवल दो और समझा दो कि यह बकवास क्यों है। मेरे लिए, यह सिर्फ एक और dll है जिसमें कुछ उपयोगी वर्ग / कार्य शामिल हैं।
शाहकलेश

@ChuckD मुझे लगता है कि आप यहाँ अनुचित हैं। यह कार्य कार्य करता है, इसे आयात करना आसान है और यह एक सौदे का बड़ा हिस्सा नहीं है।
कीड़े

1
@ChuckD आप शुरू कर सकते हैं रचनात्मक आलोचना के साथ शुरू करने के बजाय VisualBasic.dll के साथ आयात करना IsNumeric के लिए आपको निकाल दिया जाना चाहिए! जो स्पष्ट रूप से किसी को वापस लाने जा रहा है। जवाब '09 में वापस आ गया था और अब भी कुछ लोगों के लिए उपयोगी है।
कीड़े

4

सरल विस्तार:

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}

यदि इनपुट पैरामीटर एक स्ट्रिंग है, तो उपयोग क्यों करें .ToString ()?
Technoman23

यह उत्तर अच्छा है, क्योंकि यह ट्रायपर्स विधि के लिए आवश्यक जंक चर को समाप्त करता है, जिसका उपयोग NER1808 के समाधान जैसे उत्तरों में किया जाता है।
टेकमैन 23

3
public static bool IsNumeric(string anyString)
{
    if (anyString == null)
    {
        anyString = "";
    }

    if (anyString.Length > 0)
    {
        double dummyOut = new double();
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US", true);
        return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut);
    }
    else
    {
        return false;
    }
}

3

हो सकता है कि यह C # 3 फीचर है, लेकिन आप इसका इस्तेमाल कर सकते हैं double.NaN



2

मैं क्रिस लिली के स्निपेट (चयनित उत्तर) का उपयोग कर रहा था, जो एक या दो साल के लिए गिशु के सुझाव जैसे एक बूल फ़ंक्शन में संलग्न था। मैंने यह सुनिश्चित करने के लिए इसका इस्तेमाल किया कि आगे की प्रक्रिया के साथ आगे बढ़ने से पहले कुछ निश्चित तार केवल संख्यात्मक थे। मुझे कुछ गलत प्रश्नपत्र मिलने लगे, जो चिह्नित उत्तर को संभाल नहीं रहा था, विशेष रूप से, जब भी "3645," जैसी संख्या के बाद एक अल्पविराम पारित किया गया (सच लौटा)। यह परिणामी मॉड है:

   static public bool IsNumeric(string s)
   {
      double myNum = 0;
      if (Double.TryParse(s, out myNum))
      {
         if (s.Contains(",")) return false;
         return true;
      }
      else
      {
         return false;
      }
   }

दिलचस्प होने के लिए +1। मुझे लगता है कि यह एक उपयोग प्रश्न से अधिक है। दूसरे शब्दों में, यदि आप केवल यह सुनिश्चित करना चाहते हैं कि मूल्य को बिना किसी त्रुटि के एक संख्या में परिवर्तित किया जा सकता है तो मेरा मूल उत्तर अच्छा है। हालाँकि, यदि आप अधिक चिंतित हैं कि स्ट्रिंग के भीतर सभी वर्ण वास्तव में अंक हैं तो पूरी तरह से अलग दृष्टिकोण की आवश्यकता है
NotMe

Double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out myNum)
सैम हरवेल

0

मेरे पास थोड़ा अलग संस्करण है जो नंबर लौटाता है। मुझे लगता है कि ज्यादातर मामलों में स्ट्रिंग का परीक्षण करने के बाद आप संख्या का उपयोग करना चाहेंगे।

public bool IsNumeric(string numericString, out Double numericValue)
{
    if (Double.TryParse(numericString, out numericValue))
        return true;
    else
        return false;
}

0

यह श्री सीर द्वारा प्रस्तावित समाधान का एक संशोधित संस्करण है। मुझे लगता है कि कॉलिंग विधि में पुन: उपयोग और सरलता के लिए एक विस्तार विधि जोड़ना सबसे अच्छा समाधान है।

public static bool IsNumeric(this String s)
{
    try { double.Parse(s); return true; }
    catch (Exception) { return false; }
}

मैंने 2 बॉडी पर फिट होने के लिए मेथड बॉडी को संशोधित किया और अनावश्यक .TString () कार्यान्वयन को हटा दिया। विस्तार विधियों से परिचित न होने वालों के लिए यह है:

ExtensionMethods नामक एक वर्ग फ़ाइल बनाएँ । इस कोड में पेस्ट करें:

using System;
using System.Collections.Generic;
using System.Text;

namespace YourNameSpaceHere
{
    public static class ExtensionMethods
    {
        public static bool IsNumeric(this String s)
        {
            try { double.Parse(s); return true; }
            catch (Exception) { return false; }
        }
    }
}

YourNameSpaceHere को अपने वास्तविक NameSpace के साथ बदलें । परिवर्तनों को सुरक्षित करें। अब आप अपने ऐप में एक्सटेंशन विधि का उपयोग कर सकते हैं:

bool validInput = stringVariable.IsNumeric();

नोट: यह विधि पूर्णांक और दशमलव के लिए सही लौटेगी, लेकिन यदि स्ट्रिंग में अल्पविराम समाहित है, तो यह गलत हो जाएगा। यदि आप अल्पविराम या "$" जैसे प्रतीकों के साथ इनपुट स्वीकार करना चाहते हैं, तो मैं उन वर्णों को हटाने के लिए पहले एक विधि लागू करने का सुझाव दूंगा यदि IsNareric।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.