একটি স্ট্রিং সংখ্যা হলে চিহ্নিত করুন


730

যদি আমার কাছে এই স্ট্রিং থাকে:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

একটি কমান্ড, মত IsNumeric()বা অন্য কিছু আছে কি এটি সনাক্ত করতে পারে যে স্ট্রিংটি একটি বৈধ সংখ্যা?


79
তাদের উদাহরণ থেকে আপনি দেখতে পাচ্ছেন যে তারা বোঝায় যে পুরো স্ট্রিং কোনও সংখ্যাকে উপস্থাপন করে।
লুকাস

47
রিটার্ন str.All (Char.IsDigit);
মহেসেন

13
str.All (Char.IsDigit) "3.2" কে "-2" এবং "3E14" হিসাবে মিথ্যা ঘোষণা করবে। কথা বলার জন্য নয়: "0x10"
হ্যারাল্ড কোপপুলিস

4
এটি নির্ভর করে আপনি কোন ধরণের সংখ্যাটি যাচাই করার চেষ্টা করছেন। বিভাজক ছাড়াই পূর্ণসংখ্যার সংখ্যার জন্য (অর্থাত্ দশমিক অঙ্কের স্ট্রিং) এই চেকটি কাজ করে, এবং স্বীকৃত উত্তর এবং ওপিতে উল্লিখিত একটির মতো।
অ্যালেক্স মাজারিওল

1
@ লুকাস আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ, আপনি কতক্ষণ বুঝতে পারছেন না আমি কতদিন ধরে কোন স্ট্রিকে দ্বিখণ্ডিত করার চেষ্টা করছিলাম এবং কেন এটি ব্যর্থ হচ্ছে তা ভাবছেন ...
নোভাস্টর্ম

উত্তর:


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

সি # 7 হিসাবে আপডেট করুন :

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

অথবা যদি আপনার নম্বর না লাগে তবে আপনি আউট প্যারামিটারটি বাতিল করতে পারেন

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

Var গুলি তাদের নিজ নিজ ধরনের দ্বারা প্রতিস্থাপিত করা যেতে পারে!


126
যদিও, আমি ডাবলটি ব্যবহার করব ry ট্রাইপার্স, যেহেতু আমরা জানতে চাই যে এটি কোনও সংখ্যাকে উপস্থাপন করে কিনা।
জন গিয়েজেন

5
আমি যদি "-123" বা "+123" হিসাবে স্ট্রিংটি পাস করি তবে ফাংশনটি সত্য হবে। আমি বুঝতে পারি যে পূর্ণসংখ্যার ইতিবাচক এবং নেতিবাচক মান রয়েছে। তবে যদি এই স্ট্রিংটি ব্যবহারকারী প্রবেশ করা পাঠ্যবক্স থেকে আসে তবে এটি মিথ্যা ফিরতে হবে।
ব্যবহারকারী 2323308

9
ব্যবহারকারী এটি -2,147,483,648 ছাড়িয়ে 2,147,483,647 ছাড়িয়ে কোনও মান প্রবেশ না করা পর্যন্ত এটি একটি ভাল সমাধান, এবং তারপরে এটি নিঃশব্দে ব্যর্থ হয়
ব্ল্যাকটাইজারএক্স

0,60 পার্স করার চেষ্টা করুন (এটি একটি কমা!) এটি একটি অবৈধ সংখ্যা তবে 60 হিসাবে পার্স করা হবে!
পল জহরা 12

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")

সম্পাদনা: আসলে আমি মনে করি এটি ট্রাই পার্সির চেয়ে ভাল কারণ একটি খুব দীর্ঘ স্ট্রিং সম্ভবত ট্রাই পার্সিকে ওভারফ্লো করতে পারে।


2
যদিও একবার এবং সবার জন্য রেজেক্স তৈরি করা অনেক বেশি দক্ষ হবে।
ক্লাইমেন্ট

2
@ সিএফপি +1 ... প্রযোজ্য হলে RegEx সর্বদা স্বাভাবিক ফাংশনগুলির চেয়ে ভাল!
ম্যাক্স

19
@ ম্যাক্স: আমি সম্মত হব না। নিয়মিত এক্সপ্রেশন চেকগুলি বেশ ধীর হয়, তাই পারফরম্যান্স বিবেচনায় থাকলে প্রায়শই আরও ভাল সমাধান পাওয়া যায়।
মিশাল বি।

7
সম্পাদনা করুন: আপনি RegexOptions.Compiledযদি সম্ভাব্য গতি বাড়ানোর জন্য হাজার হাজার চালাচ্ছেন তবে আপনি প্যারামিটার হিসাবে যুক্ত করতে পারেনRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
সাইমন_উইভার

9
নেতিবাচক এবং এর সাথে জিনিসগুলিতেও ব্যর্থ হবে.
Noctis

199

আপনি এটি ব্যবহার করতে পারেন:

stringTest.All(char.IsDigit);

এটি trueসমস্ত সংখ্যার অঙ্কের জন্য (না float) এবং ফিরে আসবেfalse যদি ইনপুট স্ট্রিংটি কোনও ধরণের আলফানিউমেরিক হয়।

দয়া করে নোট করুন : stringTestখালি স্ট্রিং হওয়া উচিত নয় কারণ এটি সংখ্যার হওয়ার পরীক্ষায় উত্তীর্ণ হবে।


20
এটা খুব দুর্দান্ত। তবে সচেতন হওয়ার জন্য একটি বিষয়: একটি খালি স্ট্রিং সেই পরীক্ষাকে সংখ্যাসূচক বলে পাস করবে।
ড্যান-জিএফ

2
@ ড্যান-জিএফ: আমি আনন্দিত, আপনি এটি পছন্দ করেছেন। হ্যাঁ আপনি সঠিক. আমি উপরের আপডেট নোট আছে। ধন্যবাদ!
কুণাল গোয়েল

1
এটি দশমিক ক্ষেত্রেও কাজ করে না। ডান পরীক্ষাটি স্ট্রিংটেষ্ট হবে ll সমস্ত (l => চর.আইডিজিট (l) || '' '== l ||' - '== l);
সালমান হাসরাত খান

আপনার ইনপুট সালমানের জন্য ধন্যবাদ, একটি স্ট্রিংয়ের বাইরে বিশেষত দশমিক পরীক্ষা করতে আপনি যেতে পারেন - যদি (ডেসিমাল।TryParse (স্ট্রিংটেষ্ট 2, আউট মান)) {/ * হ্যাঁ, দশমিক / / অন্য {/ না, দশমিক নয় / }
কুণাল গোয়েল

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
সি # অ্যাপ থেকে মাইক্রোসফ্ট.ভিউজুয়ালবাসিক.ডিল রেফারেন্স করছেন? eww: পি
লুকাস

"ইসনুমারিক" এটি ভাল কাজ করে আমার কোনও সমস্যা নেই। এছাড়াও আপনি দেখতে পাচ্ছেন যে ট্রাইপার্স এবং ইসনুমেরিকের মধ্যে দক্ষতার পার্থক্য খুব কম। মনে রাখবেন ট্রাইপার্স ২.০-তে নতুন এবং তার আগে ইসনুমুরিক ব্যবহার করা আরও ভাল ছিল যে অন্য কোনও কৌশল।
নেলসন মিরান্ডা

10
ওয়েল, ভিবি.এনইটি-র ইসনুমারিক () অভ্যন্তরীণভাবে ডাবল ব্যবহার করে। ট্রাই পার্সে (), ভিবি 6 সামঞ্জস্যের জন্য প্রয়োজনীয় অন্যান্য সংখ্যক গিরিশনগুলির পরে। আপনার যদি সামঞ্জস্যের প্রয়োজন না হয় তবে ডাবল T ট্রাইপার্স () ব্যবহার করা ঠিক তত সহজ এবং এটি আপনার প্রক্রিয়াতে মাইক্রোসফ্ট.ভিজুয়ালবাসিক.ডিল লোড করে মেমরি নষ্ট করা থেকে বাঁচায়।
ইউরো মিশেলি

4
দ্রুত দ্রষ্টব্য: আপনি অন্তর্নিহিত সসীম-রাষ্ট্রীয় মেশিনটি একবার এবং সকলের জন্য তৈরি করতে পরিচালিত হলে একটি নিয়মিত এক্সপ্রেশন ব্যবহার করা আরও দ্রুত হবে। সাধারণত, রাষ্ট্রীয় মেশিনটি তৈরি করতে O (2 ^ n) লাগে যেখানে n হল রেজেক্সের দৈর্ঘ্য, অন্যদিকে পাঠ্য ও (কে) যেখানে কে স্ট্রিংটির দৈর্ঘ্য অনুসন্ধান করা হচ্ছে। সুতরাং প্রতিবার পুনর্নির্মাণ পুনর্গঠন একটি পক্ষপাতিত্ব পরিচয় করিয়ে দেয়।
ক্লিমেট

2
@ লুকাস আসলে, সেখানে পুরো সিএসভি পার্সারের মতো কিছু দুর্দান্ত জিনিস রয়েছে। এটি সেখানে উপস্থিত থাকলে এটি ব্যবহার না করার কোনও কারণ নেই।
নায়ারগডস

32

এটি সম্ভবত সি # এর সেরা বিকল্প।

আপনি যদি জানতে চান যে স্ট্রিংটিতে একটি পুরো সংখ্যা রয়েছে (পূর্ণসংখ্যা):

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

ট্রাইপার্স পদ্ধতিটি স্ট্রিংটিকে একটি সংখ্যায় (পূর্ণসংখ্যার) রূপান্তরিত করার চেষ্টা করবে এবং এটি সফল হলে এটি সত্য ফিরে আসবে এবং মাই আইএনটেতে সংশ্লিষ্ট নম্বরটি রাখবে। যদি এটি না পারে তবে এটি মিথ্যা প্রত্যাবর্তন করবে।

int.Parse(someString)অন্যান্য প্রতিক্রিয়াগুলিতে প্রদর্শিত বিকল্প ব্যবহার করে সমাধানগুলি কাজ করে তবে এটি অনেক ধীর কারণ ব্যতিক্রম ছোঁড়া খুব ব্যয়বহুল। TryParse(...)সংস্করণ 2-তে সি # ভাষায় যুক্ত করা হয়েছিল এবং তারপরেও আপনার কোনও পছন্দ ছিল না। এখন আপনি করেন: সুতরাং আপনার এড়ানো উচিতParse() বিকল্পটি ।

আপনি যদি দশমিক সংখ্যা গ্রহণ করতে চান, দশমিক শ্রেণীর একটি .TryParse(...)পদ্ধতিও রয়েছে। উপরের আলোচনায় দশমিকের সাথে পূর্ণ প্রতিস্থাপন করুন এবং একই নীতিগুলি প্রয়োগ হয়।


সমস্ত অক্ষরের সাথে পূর্ণসংখ্যার চরিত্রের তুলনা করার চেয়ে ট্রিপপার্স কেন ভাল?
আরজং

25

প্রশ্নে থাকা স্ট্রিংটি পাস হবে কিনা তা দেখতে আপনি অনেকগুলি ডেটাটাইপগুলির জন্য সর্বদা বিল্ট ট্রাইপার্স পদ্ধতি ব্যবহার করতে পারেন।

উদাহরণ।

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

ফলাফল তখন = সত্য

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

ফলাফল তখন = মিথ্যা


আমি মনে করি যে আমি সি # এর চেয়ে বেশি ভিবি স্টাইল সিনট্যাক্সে এটি করতে পেরেছি, তবে একই বিধি প্রযোজ্য।
TheTXI

21

আপনি যদি ইন্টি পার্স বা ডাবল. পার্স ব্যবহার করতে না চান তবে আপনি এই জাতীয় কিছু দিয়ে নিজের রোল করতে পারেন:

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
যদি তারা কেবল পূর্ণসংখ্যা বোঝায়? কোথায় লোকাল সম্পর্কে '।' গ্রুপ বিভাজক, কমা নয় (যেমন পিটি-বিআর)? নেতিবাচক সংখ্যা সম্পর্কে কি? গ্রুপ বিভাজক (ইংরেজিতে কমা)? প্রতীক চিহ্ন? ট্রাই পার্সে () নাম্বার স্টাইলস এবং আইফোর্মেটপ্রোভিডার ব্যবহার করে এগুলি সমস্ত পরিচালনা করতে পারে।
লুকাস

ওহ হ্যাঁ, আমি সমস্ত সংস্করণটি আরও পছন্দ করি। আমি আসলে কখনই সেই এক্সটেনশন পদ্ধতিটি ব্যবহার করি নি, ভাল কল। যদিও এটি s.ToCharArray () হওয়া উচিত All সমস্ত (..)। আপনার দ্বিতীয় দফার জন্য, আমি হ্যাঁ শুনি, এ কারণেই আপনি যদি int.Parse ব্যবহার করতে না চান তবে আমি পূর্বেরূপে .... (যা আমি ধরে নিচ্ছি যে আরও ওভারহেড রয়েছে ...)
বিফ্রি

11
1.3.3.8.5 আসলেই একটি সংখ্যা নয়, যদিও 1.23E5 হয় is
ক্লিমেট

4
যুক্তি ত্রুটিযুক্ত। -1
রাসেল ইয়াং

1
@ লুকাস আমি সম্মত হই যে ট্রাইপার্সে আরও পরিচালনা করে তবে কখনও কখনও এটির প্রয়োজন হয় না। আমার কেবলমাত্র আমার ক্রেডিট কার্ড নম্বর বাক্সগুলি যাচাই করা দরকার (যাতে কেবলমাত্র অঙ্ক থাকতে পারে)। এই সমাধানটি পার্স করার চেয়ে প্রায় স্পষ্টভাবে দ্রুত।
মিলি স্মিথ

14

যদি আপনি সংখ্যার বিস্তৃত বর্ণালী ধরতে চান তবে পিএইচপি'র এই_সংখ্যক , আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

// 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"একটি নিখুঁত বৈধ সংখ্যাযুক্ত মান, তবে এটি। নেট নেট সংখ্যাযুক্ত (মানক লাইব্রেরিতে সংজ্ঞায়িত নয়, এটি) এর সাথে খাপ খায় না।


এখানে স্মার্ট অ্যালেক হওয়ার চেষ্টা করছেন না, তবে এটি "0" স্ট্রিংয়ের জন্য ব্যর্থ বলে মনে হচ্ছে। আমার রেজেক্স অস্তিত্বহীন। তার জন্য কি কোনও সহজ ঝাঁকুনি আছে? আমি "0" এবং সম্ভবত "0.0" এবং এমনকি "-0.0" সম্ভাব্য বৈধ সংখ্যা হিসাবে পেয়েছি।
স্টিভ হিবার্ট

@ স্টিভ হিবার্ট - সবাই জানেন যে "0" একটি সংখ্যা নয়! সিরিয়াসলি যদিও ... রেগেক্সকে ম্যাচের সাথে সামঞ্জস্য করেছেন 0
জেডিবি এখনও মনিকা

হুঁ, এটি কি আমি, বা "0" এখনও অঙ্ক হিসাবে স্বীকৃত নয়?
স্টিভ হিবার্ট

1
অলস, এবং রেজেক্স-অজ্ঞ, আমি উপরের কোডটি কাটা করেছি, যা দেখে মনে হচ্ছে এটিতে "0.0" টাইপ পরিবর্তন রয়েছে। "0" একটি স্ট্রিং চলছে কিনা তা পরীক্ষা করার জন্য আমি একটি পরীক্ষা চালিয়েছি .সৌনিক (), এবং এটি মিথ্যা প্রত্যাবর্তন করে। আমি ভাবছি যে অটটাল পরীক্ষাটি এমন দুটি সংখ্যার অক্ষর যেখানে সত্যই প্রথম শূন্য (এবং দ্বিতীয়টি শূন্য থেকে সাত) থাকে তার পক্ষে সত্য ফিরে আসবে, তবে এটি কেবলমাত্র একটি বড় চর্বিযুক্ত নিঃসঙ্গ শূন্যের জন্য মিথ্যা ফিরে আসবে। যদি আপনি উপরের কোডটি দিয়ে "0" পরীক্ষা করেন তবে আপনি কি মিথ্যা বলছেন? দুঃখিত, আমি যদি আরও রেজেক্স জানতাম তবে আমি আরও ভাল প্রতিক্রিয়া জানাতে সক্ষম হব। পড়তে হবে।
স্টিভ হিবার্ট

1
! ডোহ! কেবলমাত্র উপরে আপনার মন্তব্যটি পুনরায় পড়ুন, আমি অতিরিক্ত নক্ষত্রটি মিস করেছি, আমি কেবল দশমিক লাইনটি আপডেট করেছি। সেই জায়গায় এটি ঠিক আছে, "0" ইসনুমারিক। ত্রুটিযুক্ত সম্পর্কে ক্ষমা এবং আপডেটের জন্য আপনাকে অনেক ধন্যবাদ, আশা করি এটি অন্যকেও সহায়তা করবে। অনেক কৃতজ্ঞ.
স্টিভ হিবার্ট

14

আমি জানি এটি একটি পুরানো থ্রেড, তবে উত্তরের কোনও উত্তরই আমার পক্ষে সত্যই হয়নি - হয় অদক্ষ, না সহজে পুনরায় ব্যবহারের জন্য এনক্যাপসুলেটেড। আমি এটিও নিশ্চিত করতে চেয়েছিলাম যে স্ট্রিংটি খালি বা শূন্য থাকলে এটি মিথ্যা ফিরে এসেছে। ট্রাইপার্স এক্ষেত্রে সত্য ফিরে আসে (একটি নম্বর হিসাবে পার্স করার সময় একটি খালি স্ট্রিং ত্রুটি ঘটায় না)। সুতরাং, এখানে আমার স্ট্রিং এক্সটেনশন পদ্ধতি:

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)

Cultureচ্ছিক 'সংস্কৃতি' প্যারামিটারটি একইভাবে ব্যবহার করা যেতে পারে।

এটি ডাবলটিতে থাকা বড় স্ট্রিংগুলিকে রূপান্তর করতে সক্ষম না হয়ে এটি সীমাবদ্ধ, তবে এটি একটি সীমাবদ্ধ প্রয়োজনীয়তা এবং আমি মনে করি আপনি যদি এর চেয়েও বড় সংখ্যার সাথে কাজ করে থাকেন তবে আপনার সম্ভবত অতিরিক্ত বিশেষ সংখ্যার হ্যান্ডলিংয়ের প্রয়োজন হবে যাইহোক ফাংশন।


2
ডাবল ব্যতীত দুর্দান্ত কাজ করে। ট্রাইপার্স সংখ্যা নম্বর স্টাইলস.হেক্সবার্বার সমর্থন করে না। এমএসডিএন ডাবল.ট্রি পার্স দেখুন। ইসনুলআরওহাইটস্পেসে পরীক্ষা করার আগে আপনি ট্রাইপার্স করার কোনও কারণ? ট্রাইপর্স যদি মিথ্যা প্রত্যাবর্তন করে ইসনুলআরওহাইটস্পেস এটি না করে?
হ্যারাল্ড কপুলস

10

স্ট্রিংটিকে পূর্ণসংখ্যায় পার্স করা যায় কিনা তা নির্ধারণ করতে আপনি ট্রাইপার্স ব্যবহার করতে পারেন।

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
আমি বিশ্বাস করি যে আপনি এখনও সর্বাধিক অদৃশ্য পন্থাগুলি আবিষ্কার করেছেন। আপনি কেবল দু'বার স্ট্রিংটি পার্স করছেন না (এটি পার্সেবলের ক্ষেত্রে), আপনি এটি করার জন্য প্রতিচ্ছবি ফাংশনগুলিকে একাধিকবার কলও করছেন । এবং শেষ পর্যন্ত, আপনি এক্সটেনশন পদ্ধতিটি ব্যবহার করে কোনও কীস্ট্রোক সংরক্ষণও করেন না।
জেডিবি এখনও

দ্বিতীয় থেকে শেষ অনুচ্ছেদে আমি যা লিখেছি কেবল তা পুনরুক্ত করার জন্য আপনাকে ধন্যবাদ। এছাড়াও আপনি যদি আমার সর্বশেষ উদাহরণটি অ্যাকাউন্টে নেন তবে আপনি অবশ্যই এই এক্সটেনশন পদ্ধতিটি ব্যবহার করে কীস্ট্রোকগুলি সংরক্ষণ করবেন। এই উত্তরটি কোনও সমস্যার যাদুর এক ধরণের সমাধান বলে দাবি করে না, এটি কেবল একটি কোড উদাহরণ। এটি ব্যবহার করুন, বা এটি ব্যবহার করবেন না। আমি সঠিকভাবে ব্যবহার করার সময় এটি সুবিধাজনক বলে মনে করি। এবং এটিতে উভয়ই এক্সটেনশন পদ্ধতি এবং প্রতিবিম্বের উদাহরণ অন্তর্ভুক্ত রয়েছে, সম্ভবত কেউ এ থেকে শিখতে পারেন।
হেইন আন্দ্রে গ্রেনস্টেড

5
আপনি চেষ্টা করেছেন var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
জেডিবি এখনও 14:

2
হ্যাঁ, এবং এটি কাজ করে না। Argument 2 must be passed with the 'out' keywordএবং যদি আপনি outপাশাপাশি উল্লেখ করেন তবে newপাবেন A ref or out argument must be an assignable variable
হেইন আন্দ্রে গ্রেনস্টেড

1
পারফরম্যান্স ট্রাই পার্সে এখানে প্রকাশিত সমস্ত তুলনায় ভাল। ফলাফল: ট্রাইপার্সে 8 রেজেজ 20 পিএইচপি ইসনুমারিক 30 রিফ্লেকশন ট্রাইপার্স 31 টেস্ট কোড ডটনেটফিডেল.এন.এক্স 8 জিজেএএফ
প্রম্পে

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 সঙ্গে সেরা নমনীয় সমাধান বিল্ট-ইন ফাংশন called- char.IsDigit। এটি সীমাহীন দীর্ঘ সংখ্যার সাথে কাজ করে। প্রতিটি অক্ষর যদি একটি সংখ্যাসূচক হয় তবে এটি সত্য হবে। আমি এটি বহুবার ব্যবহার করেছি কোন সমস্যা এবং খুব সহজেই ক্লিনার সমাধান আমি খুঁজে পেয়েছি। আমি একটি উদাহরণ পদ্ধতি তৈরি করেছি I এটি ব্যবহারের জন্য প্রস্তুত। এছাড়াও আমি নাল এবং খালি ইনপুটটির জন্য বৈধতা যুক্ত করেছি। সুতরাং পদ্ধতিটি এখন সম্পূর্ণ বুলেটপ্রুফ

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

আপনার প্রকল্পে ভিজ্যুয়াল বেসিকের একটি রেফারেন্স এ টানুন এবং এর তথ্য ব্যবহার করুন belowIs সংখ্যাসূচক পদ্ধতি যেমন নীচে দেখানো হয়েছে এবং উপরের উত্তরটির বিপরীতে পূর্ণসংখ্যার পাশাপাশি পূর্ণসংখ্যার ক্যাপচার করতে সক্ষম হবেন যা কেবল ইনটস করে ches

    // 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
জেডিবি এখনও মনিকা

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
চারটি ডাউনভোট, কিন্তু কেউ কেন বলেনি? আমার ধারণা এটি এর কারণ ট্রাইপার্স / পার্স আরও ভাল বিকল্প হবে তবে এখানে যারা আসছেন তারা সকলেই তা জানবে না।
njplumridge

2
আপনি এটিকে এত জটিল করে তুলেছেন যে সি প্রোগ্রামার এমনকি বলবে "গোশ, সেই লেখার আরও সহজ উপায় থাকতে হবে"
Ch3shire

1. কনসোল থেকে দুটি নম্বর পড়ার এবং এগুলি যুক্ত করার কোনও কারণ নেই। স্ট্রিংটি যেভাবেই আসে তা অপ্রাসঙ্গিক, সুতরাং কনসোল থেকে কিছু পড়ার কোনও কারণ নেই।
অ্যালগোম্যান

২. এফের জন্য চলক অপ্রয়োজনীয়, আপনি সরাসরি 0 বা 1 ফিরতে পারেন - আপনি যদি একক রিটার্ন চান, আপনি তার জন্য টের্নারি অপারেটরটি ব্যবহার করতে পারেন। ইনট অনুসন্ধানের জন্যও প্রত্যাবর্তনের ভুল টাইপ, এটি দুর্দান্ত হওয়া উচিত এবং আপনি এস == এস 1
আলগোম্যান

৩. আপনি s এর অঙ্কগুলিকে এস 1 এ অনুলিপি করেন এবং তারপরে s এর সাথে তুলনা করুন। এটি হওয়া দরকারের তুলনায় এটি অনেক ধীর। এছাড়াও সি [0] == এস [আমি] ঘটেছে এমনকি কেন আপনি অভ্যন্তরীণ লুপটি চালিয়ে যান? আপনি কি [i] অন্যান্য সংখ্যার সমান হওয়ার আশা করছেন?
অ্যালগোম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.