NaNまたはIsNumericに相当するC#とは何ですか?


102

入力文字列に数値が含まれているかどうか(または逆に数値ではないかどうか)をテストする最も効率的な方法は何ですか?Double.Parseまたは正規表現(以下を参照)を使用できると思いますが、javascript NaN()IsNumeric()(VBだったか覚えていませんか?)

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
}

ちなみに、GUIDを除いて、すべての標準データ型はTryParseをサポートしています。

update
secretwepは、値「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からnullまたは空の文字列を処理するため)

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

必要であれば、あなたはIsInteger(文字列sMaybeANumber)ブール値のpublic staticのような、より便利ユーティリティメソッドに上記のコードをラップすることができます
Gishu

@Gishu:あなたが気にしているのは、数値が変換できるかどうかだけです。
NotMe 2009年

2
これに関する唯一の問題は、NumberJavaScript のオブジェクトが浮動小数点または整数であるため、doubleに変更することです。TryParseの方がより正確に同等です
Chris S

7
文字列 "NaN"と "Infinity"はに解析されるため、これには注意する必要がありますdoubleが、多くの場合、これらは数値ではないと見なされます。
Mike Zboray

1
IsNumberが誤ってtrueを返す原因となっていたnullまたは空の文字列を処理するように修正された例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; }
stackonfire

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
これまでのところ、Int.TryParseの代わりにDouble.TryParseを使用する唯一の人物であることを示す+1 :)
johnc 2009年

これも明らかに、ほぼ拡張メソッドです。
アンソニー・マストリアン

19

上記の正解に加えて、一般的な使用法における「非数」(NaN)は、数値として評価できない文字列と同等ではないことを指摘する価値があるでしょう。NaNは通常、「不可能な」計算の結果を表すために使用される数値として理解されます-結果は未定義です。この点で、Javascriptの使用は少し誤解を招くと言えます。C#では、NaNは、singleおよびdoubleの数値型のプロパティとして定義されており、0から0へのダイビングの結果を明示的に参照するために使用されます。他の言語はこれを使用して、さまざまな「不可能」な値を表現します。


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

1行の素晴らしいC#6。もちろん、これは数字のみをテストするだけなので、制限があります。

使用するには、次のように文字列を用意し、そのメソッドを呼び出します。

bool IsaNumber = "123456".IsNumeric();

1
拡張メソッドに慣れていないユーザーにとっては、さらに多くの情報(または、少なくともより完全な例を提供するために少なくとも周囲の静的クラス)を含めることが有益な場合があります。
johnnyRose 2016年

小数のある数値に対してfalseを返すため、このソリューションは好きではありません。整数の場合は便利ですが、それをメソッドで使用する場合は、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. プロジェクトを右クリックして[ 参照の追加 ]を選択し、Visual Basic Libraryへの参照を追加します。

ここに画像の説明を入力してください

  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
この方法はお勧めしません、正解です。なぜそれが反対票が投じられたのかわからない、そしてなぜそれも説明されなかったので、私はそれを打ち消すために反対票を投じた:-)
Abacus

4

VBにIsNumeric機能があります。参照Microsoft.VisualBasic.dllして使用できます。


あなたはそのVBメソッドを2.0以上の.netでしか取得できませんか?
Ed S.

@ChuckD:それは主観的です。jsonを処理する外部ライブラリを参照するか、それを記述してjsonを自分で解析しますか?
shahkalpesh

@ChuckD:私をやわらげて、それがくだらない理由を説明してください。私にとって、それはいくつかの便利なクラス/関数を含んでいる別のdllです。
shahkalpesh

@ChuckD私はここで無理をしていると思います。関数は仕事をします、インポートするのは簡単で、それほど大したことではありません。
バグ

1
@ChuckDは、IsNumericのVisualBasic.dllのインポートから始めるのではなく、建設的な批評から始めることをお勧めします。これは明らかに誰かを回復させるでしょう。その答えは'09年に遡り、今でも一部の人にとっては役立つと思われます。
バグ

4

単純な拡張:

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

入力パラメータが文字列の場合、なぜ.ToString()を使用するのですか?
technoman23

この回答は、NER1808のソリューションなどの回答で使用されるTryParseメソッドに必要なジャンク変数を排除するため、良い回答です。
technoman23

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

私は、1年か2年のGishuの提案のように、bool関数にカプセル化されたChris Livelyのスニペット(選択した回答)を使用していました。さらに処理を進める前に、特定のクエリ文字列が数値のみであることを確認するために使用しました。特に、「3645」のような数値の後にカンマが渡されたとき(trueが返されたとき)は、マークされた回答が処理していなかったいくつかの誤ったクエリ文字列を取得し始めました。これが結果のmodです。

   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)
Sam Harwell 2013年

0

私は数を返すわずかに異なるバージョンを持っています。ほとんどの場合、文字列をテストした後は数値を使用したいと思います。

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

0

これは、Siir氏によって提案されたソリューションの修正バージョンです。拡張メソッドを追加することは、呼び出しメソッドの再利用と単純化のための最良のソリューションであることがわかりました。

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

2行に収まるようにメソッド本体を変更し、不要な.ToString()実装を削除しました。拡張メソッドに慣れていない人のために、ここに実装する方法があります:

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();

注:このメソッドは整数と小数の場合はtrueを返しますが、文字列にカンマが含まれている場合はfalseを返します。「$」のようなコンマまたは記号を使用した入力を受け入れる場合は、最初にそれらの文字を削除するメソッドを実装してから、IsNumericかどうかをテストすることをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.