入力文字列に数値が含まれているかどうか(または逆に数値ではないかどうか)をテストする最も効率的な方法は何ですか?Double.Parse
または正規表現(以下を参照)を使用できると思いますが、javascript NaN()
やIsNumeric()
(VBだったか覚えていませんか?)
public static bool IsNumeric(this string value)
{
return Regex.IsMatch(value, "^\\d+$");
}
入力文字列に数値が含まれているかどうか(または逆に数値ではないかどうか)をテストする最も効率的な方法は何ですか?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をサポートしています。
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;
}
Number
JavaScript のオブジェクトが浮動小数点または整数であるため、doubleに変更することです。TryParseの方がより正確に同等です
double
が、多くの場合、これらは数値ではないと見なされます。
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; }
私はこのようなものが好きです、それはあなたが何NumberStyle
をテストするかを決めることを可能にします。
public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
Double temp;
Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
return result;
}
私はこれが拡張とラムダの例で多くの異なる方法で答えられたことを知っていますが、最も簡単な解決策として両方の組み合わせです。
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();
私は拡張メソッドが好きですが、可能であれば例外をスローするのは好きではありません。私はここで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関数を使用できます。 あなたがしなければならない唯一のことは、以下に示す私の指示に従うだけです:
次に、以下に示すようにクラスにインポートします。
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));
}
幸運を祈ります。
VBにIsNumeric
機能があります。参照Microsoft.VisualBasic.dll
して使用できます。
単純な拡張:
public static bool IsNumeric(this String str)
{
try
{
Double.Parse(str.ToString());
return true;
}
catch {
}
return false;
}
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;
}
}
私は、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;
}
}
Double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out myNum)
これは、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かどうかをテストすることをお勧めします。