पहचानें कि क्या एक स्ट्रिंग एक संख्या है


731

अगर मेरे पास ये तार हैं:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

क्या कोई कमांड, जैसे IsNumeric()या कुछ और है, जो पहचान सकता है कि क्या एक स्ट्रिंग एक वैध संख्या है?


79
उनके उदाहरणों से आप देख सकते हैं कि उनका अर्थ है कि यदि पूरी स्ट्रिंग एक संख्या का प्रतिनिधित्व करती है।
लुकास

47
वापसी str.All (Char.IsDigit);
मोहसिन

13
str.All (Char.IsDigit) "3.14" को असत्य और "-2" और "3E14" घोषित करेगा। नहीं की बात करने के लिए: "0x10"
हेराल्ड कोप्पुलसे

4
यह इस बात पर निर्भर करता है कि आप किस प्रकार की संख्या की जाँच कर रहे हैं। विभाजक के बिना पूर्णांक संख्याओं के लिए (यानी दशमलव अंकों के तार) यह चेक काम करता है, और स्वीकृत उत्तर और ओपी में निहित एक ही है।
एलेक्स माजारिओल

1
@ लुकास आपकी टिप्पणी के लिए धन्यवाद, आपके पास कोई विचार नहीं है कि मैं कितने समय से एक इंट के रूप में एक स्ट्रिंग डबल पार्स करने की कोशिश कर रहा हूं और सोच रहा
हूं

जवाबों:


1160
int n;
bool isNumeric = int.TryParse("123", out n);

C # 7 के अनुसार अपडेट करें :

var isNumeric = int.TryParse("123", out int n);

या यदि आपको नंबर की आवश्यकता नहीं है तो आप आउट पैरामीटर को छोड़ सकते हैं

var isNumeric = int.TryParse("123", out _);

वर रों उनके संबंधित प्रकार के द्वारा बदला जा सकता है!


126
हालाँकि, मैं double.TryParse का उपयोग करूँगा, क्योंकि हम जानना चाहते हैं कि क्या यह किसी संख्या का प्रतिनिधित्व करता है।
जॉन गिएट्ज़ेन

5
यदि मैं स्ट्रिंग को "-123" या "+123" के रूप में पास करता हूं तो फ़ंक्शन सही वापस आ जाएगा। मैं समझता हूं कि पूर्णांक में सकारात्मक और नकारात्मक मूल्य हैं। लेकिन यदि यह स्ट्रिंग उपयोगकर्ता द्वारा दर्ज किए गए टेक्स्टबॉक्स से आ रही है तो इसे गलत लौटना चाहिए।
user2323308

9
यह एक अच्छा समाधान है, जब तक कि कोई उपयोगकर्ता -2,147,483,648 से 2,147,483,647 से आगे मूल्य दर्ज नहीं करता है, और तब यह चुपचाप विफल हो जाता है
ब्लैकटाइगर एक्स

0,60 पार्स करने की कोशिश करें (यह एक अल्पविराम है!) यह एक अमान्य संख्या है, लेकिन 60 के रूप में पार्स किया जाएगा!
पॉल ज़हरा

2
मैं इस जाँच के लिए एक्सटेंशन विधि रखना पसंद करता हूँ: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
हामिद नईमी

350

यह सच है अगर inputसभी संख्याएँ हैं। अगर यह किसी से बेहतर है पता नहीं है TryParse, लेकिन यह काम करेगा।

Regex.IsMatch(input, @"^\d+$")

तुम सिर्फ अगर यह एक या अधिक संख्या पात्रों के साथ मिश्रित है पता करने के लिए, को बंद रखना होगा चाहते हैं ^ +और $

Regex.IsMatch(input, @"\d")

संपादित करें: वास्तव में मुझे लगता है कि यह TryParse से बेहतर है क्योंकि एक बहुत लंबी स्ट्रिंग संभावित रूप से TryParse को ओवरफ्लो कर सकती है।


2
एक बार और सभी के लिए रेगीज़ का निर्माण करना बहुत अधिक कुशल होगा, हालाँकि।
क्लेमेंट

2
@CFP +1 ... RegEx हमेशा सामान्य कार्यों से बेहतर होता है, जब लागू हो!
MAXE

19
@ मोम: मैं सहमत नहीं होगा। नियमित अभिव्यक्ति जांच काफी धीमी होती है, इसलिए अक्सर बेहतर समाधान होते हैं यदि प्रदर्शन विचाराधीन हो।
मिशाल बी।

7
संपादित करें: आप RegexOptions.Compiledएक पैरामीटर के रूप में जोड़ सकते हैं यदि आप संभावित गति में वृद्धि के लिए इनमें से हजारों चला रहे हैंRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
शमौन_वेर

9
भी नकारात्मक और चीजों के साथ विफल हो जाएगा.
Noctis

199

आप भी उपयोग कर सकते हैं:

stringTest.All(char.IsDigit);

यह trueसभी न्यूमेरिक अंकों (नहीं float) और falseयदि इनपुट स्ट्रिंग अल्फ़ान्यूमेरिक के किसी भी प्रकार के लिए वापस आ जाएगा ।

कृपया ध्यान दें : stringTestएक खाली स्ट्रिंग नहीं होना चाहिए क्योंकि यह संख्यात्मक होने की परीक्षा पास करेगा।


20
यह बहुत अच्छा है। हालांकि एक बात का ध्यान रखना चाहिए: एक खाली स्ट्रिंग उस टेस्ट को न्यूमेरिक मान लेगी।
डैन-जीएफ

2
@ दान-gph: मुझे खुशी है, आपको यह पसंद है। हाँ आप सही हैं। मैंने ऊपर नोट अपडेट किया है। धन्यवाद!
कुणाल गोयल

1
यह दशमलव मामलों के लिए भी काम नहीं करता है। सही परीक्षण स्ट्रिंग होगा। सभी (l => char.IsDigit (l) || '।' == l || '-' ==)
सलमान हसरत खान

आपके इनपुट सलमान के लिए धन्यवाद, विशेष रूप से एक स्ट्रिंग से दशमलव की जांच करने के लिए, आप जा सकते हैं - अगर (Decimal.TryParse (stringTest2, out value)) {/ * हां, दशमलव /} और {/ नहीं, नहीं एक दशमलव * / }
कुणाल गोयल

6
सलमान, यह इतना आसान नहीं है - यह ..--..--एक वैध संख्या के रूप में पारित होगा । स्पष्ट रूप से नहीं।
फ्लाईन 1179

133

मैंने कई बार इस फ़ंक्शन का उपयोग किया है:

public static bool IsNumeric(object Expression)
{
    double retNum;

    bool isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
    return isNum;
}

लेकिन तुम भी उपयोग कर सकते हो;

bool b1 = Microsoft.VisualBasic.Information.IsNumeric("1"); //true
bool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false

से बेंचमार्किंग IsNumeric विकल्प

वैकल्पिक शब्द
(स्रोत: aspalliance.com )

वैकल्पिक शब्द
(स्रोत: aspalliance.com )


80
C # ऐप से Microsoft.VisualBasic.dll का संदर्भ? eww: पी
लुकास

मुझे "IsNumeric" का उपयोग करने में कोई समस्या नहीं है यह अच्छा काम करता है। इसके अलावा आप देख सकते हैं कि TryParse और IsNumeric के बीच थोड़ा प्रभावकारिता अंतर है। याद रखें कि TryParse 2.0 में नया है और इससे पहले IsNumeric का उपयोग करने से बेहतर था कि कोई अन्य रणनीति।
नेल्सन मिरांडा 21:02

10
खैर, VB.NET की IsNumeric () आंतरिक रूप से दोहरे का उपयोग करती है। VP6 संगतता के लिए आवश्यक कई गाइरिंग्स (अन्य चीजों के बीच) के बाद, दोहराती है। यदि आपको संगतता की आवश्यकता नहीं है, तो Double.TryParse () का उपयोग करना सरल है, और यह आपकी प्रक्रिया में Microsoft.VisualBasic.dll को लोड करके आपको मेमोरी बर्बाद करने से बचाता है।
यूरो माइकेल

4
त्वरित नोट: यदि आप एक बार और सभी के लिए अंतर्निहित अंतर्निहित परिमित अवस्था मशीन का प्रबंधन करते हैं, तो एक नियमित अभिव्यक्ति का उपयोग करना बहुत तेज होगा। आमतौर पर, स्टेट मशीन के निर्माण में O (2 ^ n) लगता है, जहां n रेगेक्स की लंबाई है, जबकि रीडिंग O (k) है जहां k की खोज की जा रही स्ट्रिंग की लंबाई है। इसलिए हर बार पूर्वाग्रह का पुनर्निर्माण एक पूर्वाग्रह का परिचय देता है।
क्लेमेंट

2
@ लुकास वास्तव में, वहाँ एक पूर्ण सीएसवी पार्सर की तरह कुछ बहुत अच्छा सामान है। यदि यह वहां मौजूद है तो इसका उपयोग न करने का कोई कारण नहीं।
Nyerguds

32

यह शायद C # में सबसे अच्छा विकल्प है।

यदि आप जानना चाहते हैं कि क्या स्ट्रिंग में पूर्ण संख्या (पूर्णांक) है:

string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);

TryParse पद्धति स्ट्रिंग को एक संख्या (पूर्णांक) में बदलने का प्रयास करेगी और यदि यह सफल होता है तो यह सही लौटेगी और संबंधित संख्या को myInt में रखेगी। यदि ऐसा नहीं हो सकता है, तो यह गलत है।

int.Parse(someString)अन्य प्रतिक्रियाओं में दिखाए गए विकल्प का उपयोग करके समाधान काम करता है, लेकिन यह बहुत धीमा है क्योंकि अपवाद फेंकना बहुत महंगा है। TryParse(...)संस्करण 2 में C # भाषा में जोड़ा गया था, और तब तक आपके पास कोई विकल्प नहीं था। अब आप करते हैं: इसलिए आपको Parse()विकल्प से बचना चाहिए ।

यदि आप दशमलव संख्याओं को स्वीकार करना चाहते हैं, तो दशमलव वर्ग में एक .TryParse(...)विधि भी है । उपरोक्त चर्चा में int के साथ int बदलें, और वही सिद्धांत लागू होते हैं।


सभी वर्णों की पूर्णांक वर्णों की तुलना करने के लिए TryParse क्यों बेहतर है?
अरजंग

25

आप हमेशा कई डेटाटिप्स के लिए TryParse विधियों में निर्मित का उपयोग करके देख सकते हैं कि क्या प्रश्न में स्ट्रिंग पास हो जाएगी।

उदाहरण।

decimal myDec;
var Result = decimal.TryParse("123", out myDec);

परिणाम तब = सत्य होगा

decimal myDec;
var Result = decimal.TryParse("abc", out myDec);

परिणाम तब = गलत होगा


मुझे लगता है कि मैंने C # की तुलना में VB स्टाइल सिंटैक्स में अधिक किया हो सकता है, लेकिन वही नियम लागू होते हैं।
theTXI

22

यदि आप int.Parse या double.Parse का उपयोग नहीं करना चाहते हैं, तो आप कुछ इस तरह से अपना रोल कर सकते हैं:

public static class Extensions
{
    public static bool IsNumeric(this string s)
    {
        foreach (char c in s)
        {
            if (!char.IsDigit(c) && c != '.')
            {
                return false;
            }
        }

        return true;
    }
}

7
क्या होगा यदि उनका मतलब केवल पूर्णांक है? उन स्थानों के बारे में जहां '।' समूह विभाजक है, अल्पविराम नहीं (उदाहरण के लिए pt-Br)? नकारात्मक संख्याओं के बारे में क्या? समूह विभाजक (अंग्रेजी में अल्पविराम)? मुद्रा प्रतीक? TryParse () इन सभी को नंबरस्लेट्स और IFormatProvider का उपयोग करके आवश्यकतानुसार प्रबंधित कर सकता है।
लुकास

ऊह हां, मुझे ऑल वर्जन बेहतर लगता है। मैंने वास्तव में उस विस्तार विधि, अच्छी कॉल का उपयोग नहीं किया है। हालाँकि यह s.ToCharArray () होना चाहिए। सभी (..)। आपके दूसरे बिंदु के रूप में, मैं आपको सुनता हूं, यही वजह है कि अगर आप int.Parse का उपयोग नहीं करना चाहते हैं, तो मैं पूर्वनिर्धारित हूं .... (जो मैं मान रहा हूं कि अधिक ओवरहेड है ...)
BFree

11
1.3.3.8.5 वास्तव में एक संख्या नहीं है, हालांकि, 1.23E5 है।
क्लेमेंट

4
तर्क त्रुटिपूर्ण है। -1
रसेल यांग

1
@ लुकास मैं मानता हूं कि ट्रायपार्स अधिक संभालता है, लेकिन कभी-कभी इसकी आवश्यकता नहीं होती है। मुझे बस अपना क्रेडिट कार्ड नंबर बॉक्स (जिसमें केवल अंक हो सकते हैं) को मान्य करने की आवश्यकता है। यह समाधान कोशिश पारे की तुलना में लगभग निश्चित रूप से तेज है।
मिल्ली स्मिथ

14

यदि आप संख्याओं के व्यापक स्पेक्ट्रम को पकड़ना चाहते हैं, तो la PHP का is_numeric , आप निम्नलिखित का उपयोग कर सकते हैं:

// From PHP documentation for is_numeric
// (http://php.net/manual/en/function.is-numeric.php)

// Finds whether the given variable is numeric.

// Numeric strings consist of optional sign, any number of digits, optional decimal part and optional
// exponential part. Thus +0123.45e6 is a valid numeric value.

// Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but
// only without sign, decimal and exponential part.
static readonly Regex _isNumericRegex =
    new Regex(  "^(" +
                /*Hex*/ @"0x[0-9a-f]+"  + "|" +
                /*Bin*/ @"0b[01]+"      + "|" + 
                /*Oct*/ @"0[0-7]*"      + "|" +
                /*Dec*/ @"((?!0)|[-+]|(?=0+\.))(\d*\.)?\d+(e\d+)?" + 
                ")$" );
static bool IsNumeric( string value )
{
    return _isNumericRegex.IsMatch( value );
}

अध्याय परीक्षा:

static void IsNumericTest()
{
    string[] l_unitTests = new string[] { 
        "123",      /* TRUE */
        "abc",      /* FALSE */
        "12.3",     /* TRUE */
        "+12.3",    /* TRUE */
        "-12.3",    /* TRUE */
        "1.23e2",   /* TRUE */
        "-1e23",    /* TRUE */
        "1.2ef",    /* FALSE */
        "0x0",      /* TRUE */
        "0xfff",    /* TRUE */
        "0xf1f",    /* TRUE */
        "0xf1g",    /* FALSE */
        "0123",     /* TRUE */
        "0999",     /* FALSE (not octal) */
        "+0999",    /* TRUE (forced decimal) */
        "0b0101",   /* TRUE */
        "0b0102"    /* FALSE */
    };

    foreach ( string l_unitTest in l_unitTests )
        Console.WriteLine( l_unitTest + " => " + IsNumeric( l_unitTest ).ToString() );

    Console.ReadKey( true );
}

ध्यान रखें कि सिर्फ इसलिए कि कोई मूल्य संख्यात्मक है इसका मतलब यह नहीं है कि इसे संख्यात्मक प्रकार में परिवर्तित किया जा सकता है। उदाहरण के लिए, "999999999999999999999999999999.9999999999"एक पूर्ण मान्य मान्य संख्यात्मक मान है, लेकिन यह एक .NET संख्यात्मक प्रकार (मानक पुस्तकालय में परिभाषित नहीं है, जो है) में फिट नहीं होगा।


यहां स्मार्ट अलेक बनने की कोशिश नहीं की जा रही है, लेकिन यह स्ट्रिंग "0" के लिए विफल हो रहा है। मेरा रेगेक्स अस्तित्वहीन है। क्या इसके लिए एक साधारण ट्विक है? मुझे "0" और संभवतः "0.0" और यहां तक ​​कि "-0.0" के रूप में संभव मान्य अंकशास्त्र मिलता है।
स्टीव हिबर्ट

@SteveHibbert - सभी जानते हैं कि "0" नंबर नहीं है! गंभीरता से हालांकि ... रेगेक्स को मिलान करने के लिए समायोजित किया गया 0.
JDB अभी भी मोनिका

हम्म, क्या यह मुझे है, या "0" अभी भी संख्यात्मक के रूप में मान्यता प्राप्त नहीं है?
स्टीव हिबर्ट मार्क

1
आलसी, और regex-अज्ञानी होने के नाते, मैंने ऊपर दिए गए कोड को काट दिया, जो ऐसा लगता है कि इसमें "0.0" प्रकार का परिवर्तन शामिल है। मैंने यह जांचने के लिए एक परीक्षण चलाया कि एक स्ट्रिंग "0" चल रहा है ।IsNumeric (), और यह गलत है। मैं सोच रहा हूं कि ऑक्टल परीक्षण किसी भी चीज के लिए सही लौटेगा, जिसमें दो संख्यात्मक वर्ण हैं जहां पहला शून्य है (और दूसरा शून्य से सात है), लेकिन यह अपने आप में केवल एक बड़े वसा वाले शून्य के लिए गलत वापस आ जाएगा। यदि आप "0" का परीक्षण करते हैं, तो ऊपर दिए गए कोड के साथ, क्या आप गलत हैं? क्षमा याचना, अगर मुझे अधिक पता था कि मैं बेहतर प्रतिक्रिया दे पाऊंगा। जरूर पढ़े
स्टीव हिबर्ट

1
! रवींद्र! बस ऊपर अपनी टिप्पणी को फिर से पढ़ें, मुझे अतिरिक्त तारांकन याद आ गया था, मैंने केवल दशमलव रेखा को अपडेट किया था। उस जगह के साथ, आप सही हैं, "0" IsNumeric। के बारे में माफी के लिए माफी, और अद्यतन के लिए बहुत बहुत धन्यवाद, आशा है कि यह दूसरों को भी मदद करता है। बहुत आभारी।
स्टीव हिबर्ट ने

14

मुझे पता है कि यह एक पुराना धागा है, लेकिन किसी भी उत्तर ने वास्तव में मेरे लिए ऐसा नहीं किया है - या तो अक्षम है, या आसान दुरुपयोग के लिए समझाया नहीं है। मैं यह भी सुनिश्चित करना चाहता था कि यदि स्ट्रिंग खाली थी या अशक्त थी, तो वह झूठी लौट आएगी। TryParse इस मामले में सही है (एक खाली स्ट्रिंग संख्या के रूप में पार्स करते समय त्रुटि का कारण नहीं बनता है)। तो, यहाँ मेरा स्ट्रिंग विस्तार विधि है:

public static class Extensions
{
    /// <summary>
    /// Returns true if string is numeric and not empty or null or whitespace.
    /// Determines if string is numeric by parsing as Double
    /// </summary>
    /// <param name="str"></param>
    /// <param name="style">Optional style - defaults to NumberStyles.Number (leading and trailing whitespace, leading and trailing sign, decimal point and thousands separator) </param>
    /// <param name="culture">Optional CultureInfo - defaults to InvariantCulture</param>
    /// <returns></returns>
    public static bool IsNumeric(this string str, NumberStyles style = NumberStyles.Number,
        CultureInfo culture = null)
    {
        double num;
        if (culture == null) culture = CultureInfo.InvariantCulture;
        return Double.TryParse(str, style, culture, out num) && !String.IsNullOrWhiteSpace(str);
    }
}

उपयोग करने के लिए सरल:

var mystring = "1234.56789";
var test = mystring.IsNumeric();

या, यदि आप अन्य प्रकार की संख्या का परीक्षण करना चाहते हैं, तो आप 'शैली' को निर्दिष्ट कर सकते हैं। इसलिए, किसी संख्या को एक घातांक के साथ परिवर्तित करने के लिए, आप इसका उपयोग कर सकते हैं:

var mystring = "5.2453232E6";
var test = mystring.IsNumeric(style: NumberStyles.AllowExponent);

या एक संभावित हेक्स स्ट्रिंग का परीक्षण करने के लिए, आप उपयोग कर सकते हैं:

var mystring = "0xF67AB2";
var test = mystring.IsNumeric(style: NumberStyles.HexNumber)

वैकल्पिक 'संस्कृति' पैरामीटर का उपयोग उसी तरह से किया जा सकता है।

यह उन स्ट्रिंग्स को परिवर्तित करने में सक्षम नहीं है जो एक डबल में समाहित होने के लिए बहुत बड़े हैं, लेकिन यह एक सीमित आवश्यकता है और मुझे लगता है कि यदि आप इससे बड़े नंबरों के साथ काम कर रहे हैं, तो आपको संभवतः अतिरिक्त विशेष नंबर हैंडलिंग की आवश्यकता होगी वैसे भी काम करता है।


2
महान काम करता है, सिवाय इसके कि Double.TryParse NumberStyles.HexNumber का समर्थन नहीं करता है। MSDN Double.TryParse देखें। किसी भी कारण से आप IsNullOrWhiteSpace के लिए जाँच करने से पहले TryParse? यदि IsNullOrWhiteSpace यह नहीं करता है तो TryParse गलत रिटर्न देता है?
हेराल्ड कोप्पुलसे ने

10

यदि स्ट्रिंग एक पूर्णांक में पार्स की जा सकती है, यह निर्धारित करने के लिए आप TryParse का उपयोग कर सकते हैं।

int i;
bool bNum = int.TryParse(str, out i);

बूलियन आपको बताएगा कि यह काम किया या नहीं।


9

यदि आप जांचना चाहते हैं कि क्या एक स्ट्रिंग एक संख्या है (मैं मान रहा हूँ कि यह एक स्ट्रिंग है यदि यह एक संख्या है, तो, आप जानते हैं कि यह एक है)।

  • रेगेक्स के बिना और
  • जितना संभव हो माइक्रोसॉफ्ट के कोड का उपयोग करना

आप भी कर सकते हैं:

public static bool IsNumber(this string aNumber)
{
     BigInteger temp_big_int;
     var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
     return is_number;
}

यह सामान्य नास्तिकों का ख्याल रखेगा:

  • शुरुआत में माइनस (-) या प्लस (+)
  • जिसमें दशमलव वर्ण हैBigIntegers दशमलव अंकों के साथ संख्याओं को पार्स नहीं करेगा। (तो - BigInteger.Parse("3.3")एक अपवाद फेंक देंगे, और TryParseउसी के लिए गलत वापस आ जाएगा)
  • कोई मजाकिया गैर-अंक नहीं
  • उन मामलों को शामिल करता है जहां संख्या सामान्य उपयोग से बड़ी होती है Double.TryParse

आपको अपनी कक्षा के शीर्ष पर एक संदर्भ जोड़ना होगा System.Numericsऔर using System.Numerics;(ठीक है, दूसरा एक बोनस है जो मुझे लगता है :)


8

मुझे लगता है कि यह उत्तर अन्य सभी के बीच खो जाएगा, लेकिन वैसे भी, यहाँ जाता है।

मैं Google के माध्यम से इस सवाल पर समाप्त हुआ क्योंकि मैं यह देखना चाहता stringथा numericकि क्या ऐसा था ताकि मैं विधि के double.Parse("123")बजाय इसका उपयोग कर TryParse()सकूं।

क्यों? क्योंकि यह घोषित करने में कष्टप्रद है कि पार्स विफल होने या न होने outसे TryParse()पहले आपको परिणाम की जांच करनी चाहिए। मैं ternary operatorयह जांचने के लिए उपयोग करना चाहता हूं कि क्या stringहै numericalऔर फिर इसे पहले त्रैमासिक अभिव्यक्ति में पार्स करें या दूसरी त्रैमासिक अभिव्यक्ति में एक डिफ़ॉल्ट मान प्रदान करें।

ऐशे ही:

var doubleValue = IsNumeric(numberAsString) ? double.Parse(numberAsString) : 0;

यह केवल एक बहुत क्लीनर है:

var doubleValue = 0;
if (double.TryParse(numberAsString, out doubleValue)) {
    //whatever you want to do with doubleValue
}

मैंने extension methodsइन मामलों के लिए एक जोड़ी बनाई :


विस्तार विधि एक

public static bool IsParseableAs<TInput>(this string value) {
    var type = typeof(TInput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return false;

    var arguments = new[] { value, Activator.CreateInstance(type) };
    return (bool) tryParseMethod.Invoke(null, arguments);
}

उदाहरण:

"123".IsParseableAs<double>() ? double.Parse(sNumber) : 0;

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

विधि प्रतिबिंब का उपयोग करती है और आप TryParse()दो बार विधि को कॉल करते हैं , जो निश्चित रूप से कुशल नहीं है, लेकिन सब कुछ पूरी तरह से अनुकूलित नहीं किया जाना है, कभी-कभी सुविधा सिर्फ अधिक महत्वपूर्ण होती है।

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

var sNumbers = new[] {"10", "20", "30"};
var dValues = sNumbers.Select(s => s.IsParseableAs<double>() ? double.Parse(s) : 0);

विस्तार विधि दो

public static TOutput ParseAs<TOutput>(this string value, TOutput defaultValue) {
    var type = typeof(TOutput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return defaultValue;

    var arguments = new object[] { value, null };
    return ((bool) tryParseMethod.Invoke(null, arguments)) ? (TOutput) arguments[1] : defaultValue;
}

इस विस्तार के विधि आप एक पार्स की सुविधा देता है stringकिसी भी रूप में typeएक है कि TryParse()विधि और यह भी आप यदि रूपांतरण विफल रहता है वापस जाने के लिए कोई डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं।

यह ऊपर विस्तार विधि के साथ टर्नरी ऑपरेटर का उपयोग करने से बेहतर है क्योंकि यह केवल एक बार रूपांतरण करता है। यह अभी भी प्रतिबिंब का उपयोग करता है ...

उदाहरण:

"123".ParseAs<int>(10);
"abc".ParseAs<int>(25);
"123,78".ParseAs<double>(10);
"abc".ParseAs<double>(107.4);
"2014-10-28".ParseAs<DateTime>(DateTime.MinValue);
"monday".ParseAs<DateTime>(DateTime.MinValue);

आउटपुट:

123
25
123,78
107,4
28.10.2014 00:00:00
01.01.0001 00:00:00

4
मेरा मानना ​​है कि आपने अभी तक देखे गए सबसे अयोग्य तरीकों में से एक का आविष्कार किया होगा। न केवल आप स्ट्रिंग को दो बार पार्स कर रहे हैं (इस मामले में कि यह पार्स करने योग्य है), आप इसे करने के लिए कई बार प्रतिबिंब कार्यों को भी बुला रहे हैं । और, अंत में, आप एक्सटेंशन विधि का उपयोग करके किसी कीस्ट्रोक्स को भी नहीं बचाते हैं।
JDB को अभी भी

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

5
क्या आपने कोशिश की है var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
JDB अब भी

2
हाँ, और यह काम नहीं करता है। Argument 2 must be passed with the 'out' keywordऔर यदि आप के outरूप में अच्छी तरह से newआप के रूप में निर्दिष्ट करें A ref or out argument must be an assignable variable
हेन आंद्रे गर्नस्टैड

1
प्रदर्शन TryParse यहाँ उजागर सभी से बेहतर है। परिणाम: TryParse 8 Regex 20 PHP IsNumeric 30 प्रतिबिंब TryParse 31 टेस्ट कोड dotnetfiddle.net/x8GjAF
prampe

7

यदि आप जानना चाहते हैं कि क्या एक स्ट्रिंग एक संख्या है, तो आप हमेशा इसे पार्स करने का प्रयास कर सकते हैं:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

ध्यान दें कि TryParseएक रिटर्न bool, जिसे आप यह जांचने के लिए उपयोग कर सकते हैं कि आपका पार्सिंग सफल हुआ या नहीं।



4

कुणाल नोएल जवाब का अद्यतन

stringTest.All(char.IsDigit);
// This returns true if all characters of the string are digits.

लेकिन, इस मामले के लिए हमारे पास यह है कि खाली तार उस परीक्षा को पास करेंगे, इसलिए, आप कर सकते हैं:

if (!string.IsNullOrEmpty(stringTest) && stringTest.All(char.IsDigit)){
   // Do your logic here
}

4

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

public static bool IsNumeric(string strNumber)
    {
        if (string.IsNullOrEmpty(strNumber))
        {
            return false;
        }
        else
        {
            int numberOfChar = strNumber.Count();
            if (numberOfChar > 0)
            {
                bool r = strNumber.All(char.IsDigit);
                return r;
            }
            else
            {
                return false;
            }
        }
    }

2

सी # 7 के साथ आप इसे आउट चर को इनलाइन कर सकते हैं:

if(int.TryParse(str, out int v))
{
}

2

यदि स्ट्रिंग संख्यात्मक है और यदि स्ट्रिंग में केवल 0-9 अंक हैं, तो चेक के बीच स्पष्ट रूप से अंतर करने के लिए इन विस्तार विधियों का उपयोग करें

public static class ExtensionMethods
{
    /// <summary>
    /// Returns true if string could represent a valid number, including decimals and local culture symbols
    /// </summary>
    public static bool IsNumeric(this string s)
    {
        decimal d;
        return decimal.TryParse(s, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out d);
    }

    /// <summary>
    /// Returns true only if string is wholy comprised of numerical digits
    /// </summary>
    public static bool IsNumbersOnly(this string s)
    {
        if (s == null || s == string.Empty)
            return false;

        foreach (char c in s)
        {
            if (c < '0' || c > '9') // Avoid using .IsDigit or .IsNumeric as they will return true for other characters
                return false;
        }

        return true;
    }
}

2
public static bool IsNumeric(this string input)
{
    int n;
    if (!string.IsNullOrEmpty(input)) //.Replace('.',null).Replace(',',null)
    {
        foreach (var i in input)
        {
            if (!int.TryParse(i.ToString(), out n))
            {
                return false;
            }

        }
        return true;
    }
    return false;
}

1

उम्मीद है की यह मदद करेगा

string myString = "abc";
double num;
bool isNumber = double.TryParse(myString , out num);

if isNumber 
{
//string is number
}
else
{
//string is not a number
}

0

अपनी परियोजना में विज़ुअल बेसिक के संदर्भ में खींचें और इसकी Information.IsNumeric विधि का उपयोग करें जैसा कि नीचे दिखाया गया है और ऊपर दिए गए उत्तर के विपरीत फ्लोटर्स के साथ-साथ पूर्णांक को कैप्चर करने में सक्षम है, जो केवल ints को पकड़ता है।

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

    if (Information.IsNumeric(txt))
        Console.WriteLine ("Numeric");

IsNumeric("12.3"); // true
IsNumeric("1"); // true
IsNumeric("abc"); // false

इस दृष्टिकोण के साथ एक संभावित समस्या यह है कि IsNumericस्ट्रिंग का एक चरित्र विश्लेषण करता है। तो एक नंबर जैसा 9999999999999999999999999999999999999999999999999999999999.99999999999रजिस्टर होगा True, भले ही एक मानक संख्यात्मक प्रकार का उपयोग करके इस संख्या का प्रतिनिधित्व करने का कोई तरीका नहीं है।
JDB को अभी भी

0

नीचे रेज की कोशिश करो

new Regex(@"^\d{4}").IsMatch("6")    // false
new Regex(@"^\d{4}").IsMatch("68ab") // false
new Regex(@"^\d{4}").IsMatch("1111abcdefg") ```

0

सभी उत्तर उपयोगी हैं। लेकिन एक समाधान की खोज करते समय जहां न्यूमेरिक वैल्यू 12 अंकों या उससे अधिक है (मेरे मामले में), तो डीबगिंग करते समय, मैंने निम्नलिखित समाधान को उपयोगी पाया:

double tempInt = 0;
bool result = double.TryParse("Your_12_Digit_Or_more_StringValue", out tempInt);

गु परिणाम चर आपको सही या गलत देगा।



-7
//To my knowledge I did this in a simple way
static void Main(string[] args)
{
    string a, b;
    int f1, f2, x, y;
    Console.WriteLine("Enter two inputs");
    a = Convert.ToString(Console.ReadLine());
    b = Console.ReadLine();
    f1 = find(a);
    f2 = find(b);

    if (f1 == 0 && f2 == 0)
    {
        x = Convert.ToInt32(a);
        y = Convert.ToInt32(b);
        Console.WriteLine("Two inputs r number \n so that addition of these text box is= " + (x + y).ToString());
    }
    else
        Console.WriteLine("One or two inputs r string \n so that concatenation of these text box is = " + (a + b));
    Console.ReadKey();
}

static int find(string s)
{
    string s1 = "";
    int f;
    for (int i = 0; i < s.Length; i++)
       for (int j = 0; j <= 9; j++)
       {
           string c = j.ToString();
           if (c[0] == s[i])
           {
               s1 += c[0];
           }
       }

    if (s == s1)
        f = 0;
    else
        f = 1;

    return f;
}

1
चार डाउनवोट, लेकिन किसी ने भी क्यों नहीं कहा? मुझे लगता है कि क्योंकि TryParse / Parse एक बेहतर विकल्प होगा, लेकिन यहाँ आने वाले हर व्यक्ति को यह पता नहीं होगा।
njplumridge

2
आपने इसे इतना जटिल बना दिया कि यहां तक ​​कि सी प्रोग्रामर भी कहेंगे, "गोश, लिखने का एक आसान तरीका है कि"
चिशायर

1. कंसोल से TWO नंबर पढ़ने और उन्हें जोड़ने का कोई कारण नहीं है। जहां से स्ट्रिंग आती है वह अप्रासंगिक वैसे भी है, इसलिए कंसोल से कुछ भी पढ़ने का कोई कारण नहीं है।
अल्गोमन

2. च के लिए चर अनावश्यक है, आप सीधे 0 या 1 वापस कर सकते हैं - यदि आप एक ही रिटर्न चाहते हैं, तो आप उसके लिए टर्नरी ऑपरेटर का उपयोग कर सकते हैं। int भी खोजने के लिए गलत रिटर्न प्रकार है, यह बूल होना चाहिए और आप s == s1
अल्गोमन

3. आप s से s1 के अंकों की नकल करते हैं और फिर s से s1 की तुलना करते हैं। यह होने की आवश्यकता से बहुत धीमी है। इसके अलावा आप आंतरिक लूप को जारी क्यों रखते हैं भले ही c [0] == s [i] हुआ हो? क्या आपको उम्मीद है कि [i] अन्य अंकों के बराबर होगा?
अल्गोमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.