これらの文字列がある場合:
"abc"
= false
"123"
= true
"ab2"
= false
文字列が有効な数字かどうかを識別できるコマンド(IsNumeric()
など)はありますか?
int n;
bool isNumeric = int.TryParse("123", out n);
更新 C#7現在:
var isNumeric = int.TryParse("123", out int n);
var sはそれぞれの型に置き換えることができます。
input
がすべて数字の場合、これはtrueを返します。それがTryParse
より優れているかどうかはわかりませんが、うまくいきます。
Regex.IsMatch(input, @"^\d+$")
1つ以上の数字が文字と混在しているかどうかを知りたいだけの場合は、^
、+
、および$
を省略します。
Regex.IsMatch(input, @"\d")
編集: 実際には、非常に長い文字列がTryParseをオーバーフローさせる可能性があるのでTryParseよりも優れていると思います。
また使用することができます:
stringTest.All(char.IsDigit);
(true
ではなく)すべての数値桁に対してfloat
を返し、入力文字列が何らかの英数字の場合はfalse
を返します。
注意してください :stringTest
は数値であるというテストに合格するため、空の文字列にしないでください。
私はこの機能を数回使用しました:
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オプション
(出典: aspalliance.com )
(出典: aspalliance.com )
これはおそらく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に置き換えてください。同じ原則が適用されます。
問題の文字列が渡されるかどうかを確認するために、多くのデータ型に対して組み込みのTryParseメソッドをいつでも使用できます。
例です。
decimal myDec;
var Result = decimal.TryParse("123", out myDec);
結果はTrueになります
decimal myDec;
var Result = decimal.TryParse("abc", out myDec);
結果は= Falseになります
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;
}
}
私はこれが古いスレッドであることを知っています、しかし答えのどれも実際に私のためにそれをしませんでした - 効率が悪い、または簡単に再利用するためにカプセル化されない。また、文字列が空または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に含めるには変換できないという制限がありますが、これは限られた要件であり、これより大きい数値を扱う場合は、おそらく追加の特殊な数値処理が必要になります。とにかく機能します。
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数値型(標準ライブラリで定義されているものではありません)には収まりません。
あなたが文字列が数字であるかどうかをチェックしたいのなら(私はそれが文字列だと思っているので、ああ、あなたはそれが一つだと知っています)。
あなたもすることができます:
public static bool IsNumber(this string aNumber)
{
BigInteger temp_big_int;
var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
return is_number;
}
これはいつもの気まぐれな面倒を見るでしょう:
BigInteger.Parse("3.3")
は例外を投げます、そしてそれに対するTryParse
はfalseを返します)Double.TryParse
の使用よりも大きい場合をカバーしていますあなたはSystem.Numerics
への参照を追加し、あなたのクラスの上にusing System.Numerics;
を持つ必要があります(まあ、2番目は私が推測するボーナスです)。
TryParseを使用して、文字列を整数に解析できるかどうかを判断できます。
int i;
bool bNum = int.TryParse(str, out i);
それがうまくいったかどうか、ブール値が教えてくれます。
私はこの答えは他のすべてのものの間で失われていくと思いますが、とにかく、ここに行きます。
double.Parse("123")
メソッドの代わりにTryParse()
を使うことができるようにstring
がnumeric
であるかどうかを調べたかったので、私はグーグルを通してこの質問に行き着きました。
どうして?解析が失敗したかどうかを知る前に、out
変数を宣言してTryParse()
の結果をチェックしなければならないのは面倒です。私はstring
がnumerical
であるかどうかをチェックするために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
を作りました:
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);
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
をTryParse()
メソッドを持つ任意の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
bool Double.TryParse(string s, out double result)
文字列が数値かどうかを知りたい場合は、いつでも解析できます。
var numberString = "123";
int number;
int.TryParse(numberString , out number);
TryParse
はbool
を返すので、解析が成功したかどうかを確認するために使用できます。
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
}
これらの拡張メソッドを使用して、文字列が 数値 であるかどうかと、文字列 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;
}
}
C#7では、out変数をオンラインにすることができます。
if(int.TryParse(str, out int v))
{
}
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;
}
お役に立てれば
string myString = "abc";
double num;
bool isNumber = double.TryParse(myString , out num);
if isNumber
{
//string is number
}
else
{
//string is not a number
}
.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;
}
}
}
プロジェクトで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
すべての回答は有用です。しかし、数値が12桁以上であるソリューションを検索しているとき(私の場合)、デバッグ中に次のソリューションが有用であることがわかりました:
double tempInt = 0;
bool result = double.TryParse("Your_12_Digit_Or_more_StringValue", out tempInt);
結果変数はtrueまたはfalseを返します。
以下のregesを試してください
new Regex(@"^\d{4}").IsMatch("6") // false
new Regex(@"^\d{4}").IsMatch("68ab") // false
new Regex(@"^\d{4}").IsMatch("1111abcdefg") ```