これらの文字列がある場合:
"abc"
=false
"123"
=true
"ab2"
=false
IsNumeric()
文字列が有効な数値であるかどうかを特定できるようなコマンドはありますか?
これらの文字列がある場合:
"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);
または、番号が必要ない場合は、outパラメータを破棄できます
var isNumeric = int.TryParse("123", out _);
var sが、それぞれのタイプに置き換えることができます!
public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
これinput
は、すべての数値の場合にtrueを返します。かそれ以上かどうかはわかりませんが、TryParse
動作します。
Regex.IsMatch(input, @"^\d+$")
1つ以上の数字が文字と混在しているかどうかを知りたいだけの場合は、^
+
およびを省略し$
ます。
Regex.IsMatch(input, @"\d")
編集: 実際には、非常に長い文字列がTryParseをオーバーフローする可能性があるため、TryParseよりも優れていると思います。
RegexOptions.Compiled
速度を上げるためにこれらの何千も実行している場合は、パラメーターとして追加できますRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
.
次のものも使用できます。
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
(ソース: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進数を受け入れる場合は、10進数クラスにも.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;
}
}
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数値タイプ(標準ライブラリで定義されているものではありません)には適合しません。
私はこれが古いスレッドであることを知っていますが、答えはどれも実際には私に役立ちませんでした-非効率的であるか、カプセル化されていないため、簡単に再利用できません。また、文字列が空または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();
または、他のタイプの数値をテストする場合は、「スタイル」を指定できます。したがって、指数で数値を変換するには、次のように使用できます。
var mystring = "5.2453232E6";
var test = mystring.IsNumeric(style: NumberStyles.AllowExponent);
または、潜在的な16進数文字列をテストするには、次を使用できます。
var mystring = "0xF67AB2";
var test = mystring.IsNumeric(style: NumberStyles.HexNumber)
オプションの「culture」パラメーターは、ほとんど同じ方法で使用できます。
doubleに含めるには大きすぎる文字列を変換できないことによって制限されますが、これは制限された要件であり、これより大きい数値を扱う場合は、おそらく追加の特殊な数値処理が必要になると思いますとにかく機能します。
文字列が数値であるかどうかを確認したい場合(それが文字列であると仮定しているのは、それが数値である場合、それが1であることがわかっているからです)。
あなたも行うことができます:
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番目はボーナスだと思います:)
この答えは他のすべての答えの間では失われると思いますが、とにかく、ここに行きます。
私はかどうかを確認したかったので、私は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()
メソッドを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
どのようにtype
持っているTryParse()
方法を、それはまた、あなたが変換が失敗した場合に返すデフォルト値を指定することができます。
これは、変換を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
var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;
か?
Argument 2 must be passed with the 'out' keyword
あなたが指定out
するだけでなく、new
あなたが得るならA ref or out argument must be an assignable variable
。
文字列が数値であるかどうかを知りたい場合は、いつでも解析できます。
var numberString = "123";
int number;
int.TryParse(numberString , out number);
がをTryParse
返すことbool
に注意してください。これは、解析が成功したかどうかを確認するために使用できます。
bool Double.TryParse(string s, out double result)
と呼ばれる.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;
}
}
}
これらの拡張メソッドを使用して、文字列が数値であるかどうかと、文字列に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;
}
}
プロジェクトでVisual Basicへの参照を取得し、以下に示すようなInformation.IsNumericメソッドを使用して、intのみをキャッチする上記の答えとは異なり、floatとintegerをキャプチャできます。
// 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
ます。
これがC#メソッドです。 Int.TryParseメソッド(String、Int32)
//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;
}