Визначте, чи є рядок числом


731

Якщо у мене є ці рядки:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

Чи є така команда, як IsNumeric()чи щось інше, яка може визначити, чи є рядок дійсним номером?


79
з їхніх прикладів ви бачите, що вони мали на увазі, якщо весь рядок представляє число.
Лукас

47
повернути str.All (Char.IsDigit);
Мохсен

13
str.All (Char.IsDigit) оголосить "3.14" помилковим, а також "-2" та "3E14". Не кажучи про: "0x10"
Харальд Коппулз

4
Це залежить від того, який тип номера ви намагаєтеся перевірити. Для цілих чисел без роздільника (тобто рядків десяткових цифр) ця перевірка працює, і є однаковою з прийнятої відповіді та тієї, що передбачається в ОП.
Алекс Мацаріол

1
@Lucas дякую за ваш коментар, ви поняття не маєте, як довго я намагаюся розібрати дубль рядка як int і цікаво, чому це не вдалося ...
Novastorm

Відповіді:


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

Оновлення станом на C # 7:

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

або якщо вам не потрібен номер, ви можете скасувати вихідний параметр

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

В вар s можуть бути замінені їх відповідними типами!


126
Хоча я б використав double.TryParse, оскільки ми хочемо знати, чи є він взагалі числом.
Джон Гітцен

5
Функція повернеться істинною, якщо я передаю рядок як "-123" або "+123". Я розумію, що ціле число має позитивні та негативні значення. Але якщо цей рядок надходить із введеного користувачем текстового поля, він повинен повернути помилкове.
user2323308

9
Це хороше рішення, поки користувач не введе значення, що перевищує -2,147,483,648 до 2,147,483,647, а потім це мовчки не вдається
BlackTigerX

спробуйте розібрати 0,60 (це кома!), це недійсне число, але буде розібрано як 60!
Пол Захра

2
Я вважаю за краще використовувати метод розширення для цієї перевірки: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Хамід Наемі

350

Це повернеться вірно, якщо inputвсі числа. Не знаю, чи це краще TryParse, але це спрацює.

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

Якщо ви просто хочете дізнатись, чи є в ній одне чи більше номерів, змішаних із символами, залиште ^ +і $.

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

Редагувати: Насправді я думаю, що це краще, ніж TryParse, оскільки дуже довгий рядок може потенційно переповнити TryParse.


2
Хоча побудова регулярного виразів був би набагато ефективнішим.
Клімент

2
@CFP +1 ... RegEx завжди краще, ніж звичайні функції, коли це застосовується!
МАКСЕ

19
@MAXE: Я б не погодився. Регулярні перевірки вираження досить повільні, тому часто є кращі рішення, якщо продуктивність розглядається.
Міхал Б.

7
редагувати: ви можете додати RegexOptions.Compiledяк параметр, якщо ви використовуєте тисячі таких для можливого збільшення швидкостіRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
Simon_Weaver

9
також не вдасться до негативів та речей з.
Noctis

199

Ви також можете використовувати:

stringTest.All(char.IsDigit);

Він повернеться trueдля всіх числових цифр (не float), і falseякщо рядок введення є будь-якою буквено-цифровою.

Будь ласка, зауважте : stringTestне повинно бути порожнім рядком, оскільки це пройде тест чисельності.


20
Це дуже круто. Однак слід пам’ятати одне: порожній рядок пройде цей тест як числовий.
дан-gph

2
@ dan-gph: Я радий, тобі це подобається. Так, ви праві. Я оновив замітку вище. Дякую!
Kunal Goel

1
це також не працює для десяткових випадків. Правильним тестом буде stringTest.All (l => char.IsDigit (l) || '.' == l || '-' == l);
Салман Хасрат Хан

Дякуємо за ваш вклад, Salman. Щоб спеціально перевірити десятковий рядок, ви можете перейти до - if (Decimal.TryParse (stringTest2, out value)) {/ * Так, Decimal /} else {/ Ні, Not a Decimal * / }
Kunal Goel

6
Салман, це не так просто - це було б ..--..--дійсним числом. Ясно ні.
Flynn1179

133

Я кілька разів використовував цю функцію:

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

З параметри порівняння IsNumeric

alt текст
(джерело: aspalliance.com )

alt текст
(джерело: aspalliance.com )


80
посилання Microsoft.VisualBasic.dll з програми C #? eww: P
Лукас

У мене немає проблем використовувати "IsNumeric", він працює добре. Також ви бачите, що між TryParse та IsNumeric є невелика різниця у ефективності. Пам’ятайте, що TryParse є новим у 2.0, а до цього було краще використовувати IsNumeric, ніж будь-яка інша стратегія.
Нельсон Міранда

10
Ну, IsNumeric () VB.NET внутрішньо використовує double.TryParse (), після ряду гірацій, які потрібні (серед іншого) для сумісності VB6. Якщо вам не потрібна сумісність, Double.TryParse () настільки ж простий у використанні, і це позбавить вас від втрати пам’яті, завантаживши Microsoft.VisualBasic.dll у вашому процесі.
Євро Міцеллі

4
Швидке зауваження: використання регулярного виразу буде набагато швидше, якщо вам вдасться створити основну машину з кінцевим станом раз і назавжди. Як правило, побудова машини машини приймає O (2 ^ n), де n - довжина регулярного вираження, тоді як читання - O (k), де k - довжина рядка, що шукається. Тож відбудова регулярного виразів кожного разу вносить упередження.
Clément

2
@Lucas Насправді там є справді приємні речі, як повний аналізатор CSV. Немає причин не використовувати його, якщо він існує там.
Nyerguds

32

Це, мабуть, найкращий варіант у C #.

Якщо ви хочете знати, чи рядок містить ціле число (ціле число):

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

Метод TryParse спробує перетворити рядок у число (ціле число), і якщо він буде успішним, він поверне істинне та розмістить відповідне число у myInt. Якщо він не може, він повертає помилкове значення.

Рішення, що використовують int.Parse(someString)альтернативу, показану в інших відповідях, працюють, але це набагато повільніше, тому що кидати винятки дуже дорого. TryParse(...)було додано до мови C # у версії 2, і до цього часу у вас не було вибору. Тепер ви робите: тому вам слід уникати Parse()альтернативи.

Якщо ви бажаєте прийняти десяткові числа, у десятковому класі також є .TryParse(...)метод. У наведеному вище обговоренні замініть int на десятковий, і застосовуються ті самі принципи.


Чому TryParse краще, ніж порівнювати всі символи з цілими символами?
Arjang

25

Ви завжди можете використовувати вбудовані в TryParse методи для багатьох типів даних, щоб побачити, чи пройде відповідний рядок.

Приклад.

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

Тоді результат буде = Правда

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

Результат буде тоді помилковим


Я думаю, що, можливо, я робив це більше в синтаксисі стилю VB, ніж C #, але застосовуються ті самі правила.
TheTXI

22

Якщо ви не хочете використовувати 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;
    }
}

7
Що робити, якщо вони означають лише цілі числа? Як щодо локалів, де "." це роздільник групи, а не кома (наприклад, pt-Br)? як щодо негативних чисел? групові роздільники (коми англійською мовою)? символи валюти? TryParse () може керувати усім цим, як потрібно, використовуючи NumberStyles та IFormatProvider.
Лукас

О, так, мені все більше подобається вся версія. Я ніколи фактично не використовував цей метод розширення, хороший дзвінок. Хоча це має бути s.ToCharArray (). Усі (..). Щодо твого другого моменту, я чую, що я, тому я і напередодні, якщо ви не хочете використовувати int.Parse .... (який я припускаю, має більше накладних витрат)
BFree

11
1.3.3.8.5 насправді не є числом, хоча 1,23E5 є.
Clément

4
логіка хибна. -1
Рассел Ян

1
@Lucas Я погоджуюся, що TryParse обробляє більше, але іноді це не потрібно. Мені просто потрібно перевірити поля моїх номерів кредитної картки (які можуть мати лише цифри). Це рішення майже напевно швидше, ніж спробувати розбір.
Міллі Сміт

14

Якщо ви хочете отримати більш широкий спектр чисел, à la PHP's_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 (не той, який визначений у стандартній бібліотеці, тобто).


Тут не намагаються бути розумним алеком, але це здається, що це не вдається для рядка "0". Мій Regex не існує. Чи є для цього простий твіст? Я отримую "0" і, можливо, "0,0" і навіть "-0,0" як можливі дійсні цифри.
Стів Хібберт

@SteveHibbert - Усі знають, що "0" - це не число! Хоча серйозно ... налаштувавши регулярний вираз на 0
JDB все ще пам’ятає Моніку

Гммм, це я, або "0" все ще не визнається числовим?
Стів Хібберт

1
Будучи ледачим і невідомим регулярним виразом, я вирізав код вище, і він виглядає так, що він включає зміну типу "0,0". Я провів тест, щоб перевірити, чи працює рядок "0" .IsNumeric (), і що він повертає значення false. Я думаю, що тест Octal повернеться істинним для всього, що має два числові символи, де перше дорівнює нулю (а друге - нуль до семи), але поверне помилковим лише для великого жиру, самотнього нуля. Якщо ви перевірите "0", з кодом вище, чи помиляєтесь ви? Вибачте, якби я знав більше виразів, я міг би дати кращі відгуки. Потрібно прочитати.
Стів Хібберт

1
! До! Просто перечитайте ваш коментар вище, я пропустив додаткову зірочку, я лише оновив десятковий рядок. З цим на місці ви маєте рацію, "0" IsNumeric. Вибачте за фальшивку, і дуже дякую за оновлення, сподіваємось, що це допоможе і іншим. Дуже вдячний.
Стів Хібберт

14

Я знаю, що це стара тема, але жодна з відповідей насправді не зробила це для мене - або неефективна, або не інкапсульована для легкого повторного використання. Я також хотів переконатися, що він повернув значення 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);

Або для тестування потенційної шістнадцяткової рядки ви можете використовувати:

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

Необов’язковий параметр "культура" може використовуватися майже однаково.

Він обмежений тим, що не в змозі перетворити занадто великі рядки, щоб вони містилися в подвійному, але це обмежена вимога, і я думаю, якщо ви працюєте з числами, більшими за це, вам, ймовірно, знадобиться додаткова спеціалізована обробка чисел функціонує все одно.


2
Чудово працює, за винятком того, що Double.TryParse не підтримує NumberStyles.HexNumber. Див. MSDN Double.TryParse. Будь-яка причина, чому ви пробуєтеParse перед тим, як перевірити наявність IsNullOrWhiteSpace? TryParse повертає значення false, якщо IsNullOrWhiteSpace не робить цього?
Харальд Коппулз

10

Ви можете використовувати TryParse, щоб визначити, чи можна рядок розбирати на ціле число.

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

Булевий скаже вам, працював чи ні.


9

Якщо ви хочете перевірити, чи є рядок числом (я припускаю, що це рядок, оскільки якщо це число, так, ви знаєте, що це одна).

  • Без регулярного вираження і
  • максимально використовуючи код 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для того ж поверне помилкове)
  • ніяких смішних нецифрових
  • охоплює випадки, коли кількість перевищує звичайне використання Double.TryParse

Вам потрібно буде додати посилання System.Numericsта мати using System.Numerics;верх над своїм класом (ну, я думаю, другий бонус :)


8

Я здогадуюсь, що ця відповідь просто загубиться між усіма іншими, але все одно, ось що.

Я закінчився цим питанням через 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()метод двічі, що, звичайно, не настільки ефективно, але не все має бути повністю оптимізовано, іноді зручність є ще важливішою.

Цей метод також може бути використаний для легкого розбору списку числових рядків у списку 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()метод, а також дозволяє вказати значення за замовчуванням для повернення, якщо конверсія не вдалася.

Це краще, ніж використовувати потрійний оператор із вищезгаданим методом розширення, оскільки це робить перетворення лише один раз. Він все ще використовує рефлексію, хоча ...

Приклади:

"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

4
Я вважаю, що ви, можливо, винайшли один з найбільш неефективних підходів, яких я бачив досі. Ви не тільки розбираєте рядок двічі (у випадку, якщо вона піддається синтаксичному аналізу), ви також викликаєте функції відображення кілька разів, щоб це зробити. Зрештою, ви навіть не зберігаєте жодних натискань клавіш, використовуючи метод розширення.
JDB досі пам’ятає Моніку

Дякую, що ви просто повторили те, що я написав у другому до останнього абзацу. Крім того, якщо ви враховуєте мій останній приклад, ви, безумовно, зберігаєте натискання клавіш за допомогою цього методу розширення. Ця відповідь не претендує на якесь магічне рішення будь-якої проблеми, це лише приклад коду. Використовуйте його чи не використовуйте. Я думаю, що це зручно при правильному використанні. І вона включає приклади як методів розширення, так і рефлексії, можливо, хтось може навчитися на цьому.
Хайн Андре Грьоннестад

5
Ви пробували var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
JDB досі пам’ятає Моніку

2
Так, і це не працює. Argument 2 must be passed with the 'out' keywordі якщо ви вкажете out, як newви отримаєте A ref or out argument must be an assignable variable.
Хайн Андре Грьоннестад

1
Продуктивність TryParse краща за всі експоновані тут. Результати: TryParse 8 Regex 20 PHP IsNumeric 30 Reflections TryParse 31 Тестовий код dotnetfiddle.net/x8GjAF
prampe

7

Якщо ви хочете знати, чи є рядок числом, ви завжди можете спробувати його розібрати:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

Зауважте, що TryParseповернення a bool, яке ви можете використовувати, щоб перевірити, чи вдалося розібратися.



4

ОНОВЛЕННЯ відповіді Kunal Noel

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
}

4

Найкраще гнучке рішення із вбудованою функцією .net char.IsDigit. Він працює з необмеженими довгими числами. Він поверне справжній лише тоді, коли кожен символ є числовим числом. Я використовував це багато разів, без проблем і набагато легшого чистішого рішення, яке я коли-небудь знайшов. Я зробив приклад метод. Він готовий до використання. Крім того, я додав перевірку нульового та порожнього вводу. Таким чином, метод тепер повністю захищений від куль

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

2

За допомогою c # 7 ви можете вбудовувати змінну:

if(int.TryParse(str, out int v))
{
}

2

Використовуйте ці методи розширення, щоб чітко розмежувати перевірку, чи є рядок числовим, і якщо рядок містить лише 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
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;
}

1

Сподіваюсь, це допомагає

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

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

0

Перейдіть до посилання на 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

Потенційна проблема такого підходу полягає в тому, що IsNumericробиться аналіз символу рядка. Таким чином, число типу 9999999999999999999999999999999999999999999999999999999999.99999999999буде зареєстровано як True, хоча немає можливості представити це число за допомогою стандартного числового типу.
JDB досі пам’ятає Моніку

0

Спробуйте регрес нижче

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

0

Усі відповіді корисні. Але під час пошуку рішення, де числове значення становить 12 цифр або більше (в моєму випадку), тоді під час налагодження я знайшов таке рішення корисним:

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

Змінна результату дасть вам істинне чи хибне.



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

1
Чотири низовини, але ніхто не сказав чому? Я гадаю, що це тому, що TryParse / Parse був би кращим варіантом, але не всі, хто приїде сюди, будуть знати це.
njplumridge

2
Ви зробили це настільки складним, що навіть програміст C сказав би: "Боже, там повинен бути простіший спосіб написати це"
Ch3shire

1. Немає жодної причини читати ДВОХ номери з консолі та додавати їх. Звідки береться рядок, в будь-якому разі не має значення, тому немає жодної причини читати що-небудь з консолі.
Алгоман

2. Змінна для f непотрібна, ви можете повернути 0 або 1 безпосередньо - якщо ви хочете отримати одне повернення, ви можете використовувати для цього потрійний оператор. int також невірний тип повернення для знаходження, він повинен бути bool, і ви можете повернути s == s1
Algoman

3. ви копіюєте цифри s в s1 і потім порівнюєте s до s1. Це набагато повільніше, ніж потрібно. Крім того, чому ви продовжуєте внутрішній цикл, навіть якщо c [0] == s [i] сталося? Чи очікуєте, що s [i] також дорівнює іншим цифрам?
Алгоман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.