NaN বা ইসনুমুরিকের সি # সমতুল্য কত?


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
}

ঘটনাক্রমে, জিইউইডিএসের বর্ণনামূলক ব্যতিক্রম সহ সমস্ত স্ট্যান্ডার্ড ডেটা টাইপ, ট্রাইপার্স সমর্থন করে।

আপডেট
সিক্রেটওয়েপ এনেছে যে "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 (@ স্ট্যাকনফায়ার থেকে নাল বা ফাঁকা স্ট্রিং মোকাবেলা করতে)

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; 
}

যদি প্রয়োজন হয়, আপনি উপরের কোডটিকে আরও কার্যকর উপযোগ পদ্ধতি হিসাবে পাবলিক স্ট্যাটিক বুল ইসআইন্টেগার (স্ট্রিং এস মায়াব্যানম্বার) হিসাবে মোড়তে পারেন
গিশু

@ গিশু: আপনারা যতটা যত্ন নিচ্ছেন সে সংখ্যাটি রূপান্তর করতে পারে কিনা তা আপনি ঠিক বলেছেন।
NotMe

2
Numberএটির সাথে জাভাস্ক্রিপ্টের একমাত্র সমস্যাটি হ'ল একটি ভাসা বা পূর্ণসংখ্যা, তাই দ্বিগুণ হয়ে গেছে। ট্রাইপার্সি আরও সঠিক সমতুল্য হবে
ক্রিস এস

7
আপনি "এনএএন" এবং "ইনফিনিটি" স্ট্রিংটিকে একটিতে পার্স করার কারণে এটি সম্পর্কে সতর্কতা অবলম্বন করতে চাইতে পারেন double, তবে অনেকে এগুলি সংখ্যাসূচক হিসাবে বিবেচনা করবেন না।
মাইক Zboray

1
নাল বা ফাঁকা স্ট্রিংয়ের সাথে মোকাবিলা করার জন্য একটি সংশোধিত উদাহরণ 1, যা অন্যথায় ইসনম্বারকে ভুল করে সত্যকে ফিরিয়ে আনতে বাধ্য করেছিল: 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 ইনট্রি ট্রাই পার্সির পরিবর্তে ট্রিপ পার্স করুন :)
জনক

এটি সম্ভবত স্পষ্টতই প্রায় একটি এক্সটেনশন পদ্ধতি।
অ্যান্টনি মাষ্ট্রেয়ান

19

পূর্ববর্তী সঠিক উত্তরগুলি ছাড়াও সম্ভবত এটি উল্লেখ করা মূল্যবান যে এর সাধারণ ব্যবহারে "নট নং নোট" (এনএএন) কোনও স্ট্রিংয়ের সমান নয় যা সংখ্যার মান হিসাবে মূল্যায়ন করা যায় না। NaN সাধারণত একটি "অসম্ভব" গণনার ফলাফলকে উপস্থাপন করতে ব্যবহৃত এমন একটি সংখ্যাসূচক মান হিসাবে বোঝা যায় - যেখানে ফলাফলটি অনির্ধারিত থাকে। এই বিষয়ে আমি বলব জাভাস্ক্রিপ্টের ব্যবহার সামান্য বিভ্রান্তিকর। সি # NaN এ একক এবং দ্বিগুণ সংখ্যার প্রকারের সম্পত্তি হিসাবে সংজ্ঞায়িত হয় এবং শূন্য দ্বারা ডাইভিংয়ের ফলাফলের জন্য স্পষ্টভাবে উল্লেখ করতে ব্যবহৃত হয়। অন্যান্য ভাষাগুলি এটি বিভিন্ন "অসম্ভব" মানকে উপস্থাপন করতে ব্যবহার করে।


11

আমি জানি এক্সটেনশন এবং ল্যাম্বদা উদাহরণ সহ এর বিভিন্ন দিক থেকে উত্তর দেওয়া হয়েছে, তবে সহজ সমাধানের জন্য উভয়ের সংমিশ্রণ।

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

অথবা আপনি যদি ভিজ্যুয়াল স্টুডিও 2015 (সি # 6.0 বা তার বেশি) ব্যবহার করছেন

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

এক লাইনে অসাধারণ সি # 6। অবশ্যই এটি সীমাবদ্ধ কারণ এটি কেবলমাত্র সংখ্যার অক্ষরের জন্য পরীক্ষা করে।

ব্যবহার করতে, কেবল একটি স্ট্রিং থাকুন এবং এটিতে পদ্ধতিটি কল করুন, যেমন:

bool IsaNumber = "123456".IsNumeric();

1
এক্সটেনশন পদ্ধতিগুলির সাথে অপরিচিত ব্যবহারকারীদের জন্য আরও কিছু তথ্য অন্তর্ভুক্ত করা উপকারী হতে পারে (বা কমপক্ষে আশেপাশের স্থির শ্রেণীর আরও একটি সম্পূর্ণ উদাহরণ সরবরাহ করার জন্য)।
johnnyRose

আমি এই সমাধানটি পছন্দ করি না কারণ এটি দশমিকের সাথে সংখ্যার জন্য মিথ্যা ফিরে আসবে। এটা তোলে পূর্ণসংখ্যার জন্য দরকারী হতে পারে, কিন্তু আপনি কি পদ্ধতি জন্য এটি ব্যবহার করতে চান যে নতুন নামকরণ করা উচিত IsInteger
technoman23

5

হ্যাঁ, ইসনুমারিক হল ভিবি। সাধারণত লোকে ট্রাইপার্স () পদ্ধতিটি ব্যবহার করে, যদিও এটি কিছুটা জটিল। আপনি প্রস্তাব হিসাবে, আপনি সর্বদা আপনার নিজের লিখতে পারেন।

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

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

  1. আপনার প্রকল্পে ডান ক্লিক করে এবং "রেফারেন্স যুক্ত করুন" নির্বাচন করে ভিজ্যুয়াল বেসিক লাইব্রেরিতে রেফারেন্স যুক্ত করুন:

এখানে চিত্র বর্ণনা লিখুন

  1. তারপরে এটি নীচে প্রদর্শিত হিসাবে আপনার ক্লাসে আমদানি করুন :

    মাইক্রোসফ্ট ব্যবহার করে। ভিজুয়ালবাসিক;

  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

ভিবি IsNumericফাংশন আছে। আপনি এটি উল্লেখ Microsoft.VisualBasic.dllএবং ব্যবহার করতে পারে।


আপনি কি কেবলমাত্র নেট এর 2.0 সংস্করণে এই ভিবি পদ্ধতিটি পেতে পারেন?
এড এস

@ চকড: এটি বিষয়গত। আপনি কি বাহ্যিক লাইব্রেরিগুলি উল্লেখ করেন যা জসনকে মোকাবেলা করে বা নিজের লেখার জন্য জেসসনকে পার্স করার জন্য লিখেছেন?
শাহকল্পেশ

@ চকডি: আমাকে চালকটি বাঁচিয়ে রাখুন এবং ব্যাখ্যা করুন কেন এটি ছাঁটাই। আমার জন্য, এটি অন্য একটি ডেল যা কিছু দরকারী শ্রেণি / ফাংশন ধারণ করে contains
শাহকাল্পেশ

@ চকড আমার মনে হয় আপনি এখানে অযৌক্তিক হয়ে উঠছেন। ফাংশনটি কাজ করে, এটি আমদানি করা সহজ এবং এটি কোনও চুক্তির মধ্যে এত বড় নয়।
বাগ

1
@ চকড আপনি ইসনুমারিকের জন্য ভিজুয়ালবাসিক.ডিল আমদানি করে শুরু করার পরিবর্তে গঠনমূলক সমালোচনা দিয়ে শুরু করতে চাইতে পারেন আপনাকে বরখাস্ত করা উচিত! যা স্পষ্টভাবে কারওরকম ব্যাক আপ পেতে চলেছে। উত্তর '09-এ ফিরে এসেছিল এবং এখন পর্যন্ত কিছু লোকের পক্ষে এটি কার্যকর।
বাগ 14

4

সাধারণ এক্সটেনশন:

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

যদি ইনপুট প্যারামিটারটি একটি স্ট্রিং হয় তবে কেন .TosString () ব্যবহার করবেন?
টেকনোমান 23

এই উত্তরটি ভাল তবে এটি ট্রাইপার্স পদ্ধতির জন্য প্রয়োজনীয় জাঙ্ক ভেরিয়েবলকে সরিয়ে দেয় যা 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

হতে পারে এটি একটি সি # 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। আমার ধারণা এটি ব্যবহারের আরও প্রশ্ন। অন্য কথায়, আপনি যদি কেবলমাত্র ত্রুটি না ছুঁড়ে মানটি একটি সংখ্যায় রূপান্তর করতে পারেন তা নিশ্চিত করতে চান তবে আমার মূল উত্তরটি ভাল। তবে, আপনি যদি আরও উদ্বিগ্ন হন যে স্ট্রিংয়ের মধ্যে থাকা সমস্ত চরিত্রই আসলে অঙ্কগুলি হয় তবে সম্পূর্ণ ভিন্ন পদ্ধতির প্রয়োজন
নটম

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 টি লাইনে ফিট করার জন্য পদ্ধতিটির বডিটি সংশোধন করেছি এবং অপ্রয়োজনীয় .ToString () বাস্তবায়ন সরিয়েছি। এক্সটেনশন পদ্ধতির সাথে পরিচিত নয় তাদের জন্য এখানে কীভাবে প্রয়োগ করা যায়:

এক্সটেনশনমিথডস নামে একটি শ্রেণি ফাইল তৈরি করুন । এই কোডে আটকান:

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 আপনার প্রকৃত নামস্থান সঙ্গে। পরিবর্তনগুলোর সংরক্ষন. এখন আপনি আপনার অ্যাপ্লিকেশনের যে কোনও জায়গায় এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন:

bool validInput = stringVariable.IsNumeric();

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.