web-dev-qa-db-ja.com

文字列が数字かどうかを識別する

これらの文字列がある場合:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

文字列が有効な数字かどうかを識別できるコマンド(IsNumeric()など)はありますか?

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

更新 C#7現在:

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

var sはそれぞれの型に置き換えることができます。

1005
mqp

inputがすべて数字の場合、これはtrueを返します。それがTryParseより優れているかどうかはわかりませんが、うまくいきます。

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

1つ以上の数字が文字と混在しているかどうかを知りたいだけの場合は、^+、および$を省略します。

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

編集: 実際には、非常に長い文字列がTryParseをオーバーフローさせる可能性があるのでTryParseよりも優れていると思います。

334
John M Gant

また使用することができます:

stringTest.All(char.IsDigit);

trueではなく)すべての数値桁に対してfloatを返し、入力文字列が何らかの英数字の場合はfalseを返します。

注意してください stringTestは数値であるというテストに合格するため、空の文字列にしないでください。

157
Kunal Goel

私はこの機能を数回使用しました:

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

From ベンチマークIsNumericオプション

alt text
(出典: aspalliance.com

alt text
(出典: aspalliance.com

120
Nelson Miranda

これはおそらくC#の最善の選択肢です。

文字列に整数(整数)が含まれているかどうかを知りたい場合は、

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

TryParseメソッドは文字列を数値(整数)に変換しようとします。それが成功するとtrueを返し、対応する番号をmyIntに入れます。できない場合はfalseを返します。

他の応答で示されているint.Parse(someString)という選択肢を使用した解決策は機能しますが、例外をスローすることは非常に高価なため、はるかに遅くなります。 TryParse(...)はバージョン2でC#言語に追加されましたが、それまでは選択肢がありませんでした。今、あなたはそうします:それゆえParse()という選択肢は避けるべきです。

10進数を受け入れたい場合、decimalクラスには.TryParse(...)メソッドもあります。上記の説明でintをdecimalに置き換えてください。同じ原則が適用されます。

32
Euro Micelli

問題の文字列が渡されるかどうかを確認するために、多くのデータ型に対して組み込みのTryParseメソッドをいつでも使用できます。

例です。

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

結果はTrueになります

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

結果は= Falseになります

25
TheTXI

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

私はこれが古いスレッドであることを知っています、しかし答えのどれも実際に私のためにそれをしませんでした - 効率が悪い、または簡単に再利用するためにカプセル化されない。また、文字列が空またはnullの場合にfalseが返されるようにしたかったのです。この場合、TryParseはtrueを返します(数値として解析するときに空の文字列でエラーが発生することはありません)。だから、これは私の文字列拡張メソッドです:

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

あるいは、他の種類の数値をテストしたい場合は、 'style'を指定できます。したがって、指数を使って数値を変換するには、次のようにします。

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

あるいは、潜在的なHex文字列をテストするには、次のようにします。

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

オプションの 'culture'パラメータは、ほぼ同じ方法で使用できます。

大きすぎる文字列をdoubleに含めるには変換できないという制限がありますが、これは限られた要件であり、これより大きい数値を扱う場合は、おそらく追加の特殊な数値処理が必要になります。とにかく機能します。

14
cyberspy

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数値型(標準ライブラリで定義されているものではありません)には収まりません。

12
JDB

あなたが文字列が数字であるかどうかをチェックしたいのなら(私はそれが文字列だと思っているので、ああ、あなたはそれが一つだと知っています)。

  • 正規表現なしで
  • microsoftのコードを可能な限り使用する

あなたもすることができます:

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はfalseを返します)
  • 面白い非数字なし
  • 数値が通常のDouble.TryParseの使用よりも大きい場合をカバーしています

あなたはSystem.Numericsへの参照を追加し、あなたのクラスの上にusing System.Numerics;を持つ必要があります(まあ、2番目は私が推測するボーナスです)。

9
Noctis

TryParseを使用して、文字列を整数に解析できるかどうかを判断できます。

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

それがうまくいったかどうか、ブール値が教えてくれます。

8
Craig

私はこの答えは他のすべてのものの間で失われていくと思いますが、とにかく、ここに行きます。

double.Parse("123")メソッドの代わりにTryParse()を使うことができるようにstringnumericであるかどうかを調べたかったので、私はグーグルを通してこの質問に行き着きました。

どうして?解析が失敗したかどうかを知る前に、out変数を宣言してTryParse()の結果をチェックしなければならないのは面倒です。私はstringnumericalであるかどうかをチェックするためにternary operatorを使用し、それから最初の三項式でそれをパースするか、あるいは二番目の三項式でデフォルト値を提供したいです。

このような:

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を作りました:


延長方法1

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()は、文字列が "数値"であるかどうかを単にチェックするのではなく、適切な型として文字列を解析しようとするので、かなり安全なはずです。 DateTimeのようにTryParse()メソッドを持つ非数値型にも使えます。

このメソッドではリフレクションを使用しているため、TryParse()メソッドを2回呼び出すことになります。もちろん、これは効率的ではありませんが、すべてを完全に最適化する必要はありません。

このメソッドは、例外をキャッチすることなく、数値文字列のリストをデフォルト値を持つdoubleまたはその他の型のリストに簡単に解析するためにも使用できます。

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

延長方法2

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

この拡張メソッドを使用すると、stringTryParse()メソッドを持つ任意のtypeとして解析できます。また、変換が失敗した場合に返すデフォルト値を指定することもできます。

これは変換を1回しか実行しないため、上記の拡張方法で三項演算子を使用するよりも優れています。それでも反射を使用しています...

例:

"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

Double.TryParse

bool Double.TryParse(string s, out double result)
6
John Pirie

文字列が数値かどうかを知りたい場合は、いつでも解析できます。

var numberString = "123";
int number;

int.TryParse(numberString , out number);

TryParseboolを返すので、解析が成功したかどうかを確認するために使用できます。

5
Gabriel Florit

Kunal Noel Answerのアップデート

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
}
3
dayanrr91

これらの拡張メソッドを使用して、文字列が 数値 であるかどうかと、文字列 only が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
userSteve

C#7では、out変数をオンラインにすることができます。

if(int.TryParse(str, out int v))
{
}
2
Chad Kuehn
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;
}
2
OMANSAK

お役に立てれば

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

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

.net組み込み関数を使用した最も柔軟なソリューションは、 - char.IsDigitです。それは無制限の長い番号で動作します。各文字が数値の場合にのみtrueを返します。私はそれを問題なくそして私が今まで見つけたはるかに簡単にきれいな解決策でそれを何度も使った。メソッドの例を作りました。そのまま使用できます。さらに、nullと空の入力に対する検証を追加しました。そのため、この方法は完全に防弾です。

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;
            }
        }
    }
1
Liakat Hossain

プロジェクトでVisual Basicへの参照を取得し、次に示すようなInformation.IsNumericメソッドを使用して、整数だけでなく上記の回答とは異なり、浮動小数点数や整数をキャプチャすることができます。

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

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

IsNumeric("12.3"); // true
IsNumeric("1"); // true
IsNumeric("abc"); // false
0
ΩmegaMan

すべての回答は有用です。しかし、数値が12桁以上であるソリューションを検索しているとき(私の場合)、デバッグ中に次のソリューションが有用であることがわかりました:

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

結果変数はtrueまたはfalseを返します。

0
Nayan_07

以下のregesを試してください

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