入力文字列に数値(または逆に非数値)が含まれているかどうかをテストする最も効率的な方法は何ですか?私はDouble.Parse
または正規表現(以下を参照)を使用できると思いますが、javascriptのNaN()
またはIsNumeric()
(これはそのVB、私は覚えていない?)。
public static bool IsNumeric(this string value)
{
return Regex.IsMatch(value, "^\\d+$");
}
これには正規表現のオーバーヘッドはありません
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をサポートしています。
更新
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);
}
私はこのようなものを好む、それはあなたが NumberStyle
をテストするかを決めることができる。
public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
Double temp;
Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
return result;
}
以前の正解に加えて、一般的な使用法の「Not a Number」(NaN)は、数値として評価できない文字列に相当するnotであることを指摘する価値があります。 NaNは通常、「不可能な」計算の結果を表すために使用される数値として理解されます-結果は未定義です。この点で、私はJavascriptの使用が少し誤解を招くと言っています。 C#では、NaNはsingleおよびdoubleの数値型のプロパティとして定義されており、ゼロごとのダイビングの結果を明示的に参照するために使用されます。他の言語は、異なる「不可能な」値を表すためにそれを使用します。
拡張機能とラムダの例を使用して、これには多くの異なる方法で回答されていることを知っていますが、最も単純な解決策の両方の組み合わせです。
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();
ええ、IsNumericはVBです。通常、TryParse()メソッドを使用しますが、少し不格好です。あなたが提案したように、いつでも自分で書くことができます。
int i;
if (int.TryParse(string, out i))
{
}
拡張メソッドは好きですが、可能であれば例外をスローするのは好きではありません。ここでは、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;
}
C#でVisual Basic関数を引き続き使用できます。必要なことは、以下に示す私の指示に従うことだけです。
次に、以下に示すように、クラスでimport it:
microsoft.VisualBasicを使用。
次必要な場所で使用以下に示すように:
if (!Information.IsNumeric(softwareVersion))
{
throw new DataException(string.Format("[{0}] is an invalid App Version! Only numeric values are supported at this time.", softwareVersion));
}
これがお役に立てば幸いです!
単純な拡張:
public static bool IsNumeric(this String str)
{
try
{
Double.Parse(str.ToString());
return true;
}
catch {
}
return false;
}
VBにはIsNumeric
関数があります。 Microsoft.VisualBasic.dll
を参照して使用できます。
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;
}
}
これはC#3の機能かもしれませんが、double.NaN
。
私は、Gishuの提案のようなブール関数にカプセル化されたChris Livelyのスニペット(選択した回答)を1〜2年使用していました。さらに処理を進める前に、特定のクエリ文字列が数値のみであることを確認するために使用しました。マークされた回答が処理していない誤ったクエリ文字列を取得し始めました。具体的には、「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;
}
}
実際、Double.NaN
は、すべての.NETバージョン2.0以降でサポートされています。
番号を返すわずかに異なるバージョンがあります。ほとんどの場合、文字列をテストした後、数字を使用したいと思うでしょう。
public bool IsNumeric(string numericString, out Double numericValue)
{
if (Double.TryParse(numericString, out numericValue))
return true;
else
return false;
}