2016-08-08 6 views
0

Я работаю с модулем создания форм DNN, который позволяет запускать некоторый код на стороне сервера на основе состояния. Для моего конкретного сценария мне нужен мой блок кода для запуска, если первые 4 символа текста определенной формы являются числовыми.Проверьте, является ли строка числовой в одной строке кода

Пространство для ввода условия, однако, является только одной строкой, и я считаю, что вводится в оператор if где-то за кулисами, поэтому у меня нет возможности писать многострочный условный.

Если у меня есть поле формы под названием MyField, я мог бы создать простой условный так:

[MyField] == "some value" 

Тогда где-то за кулисами, он переводится на что-то вроде if("some value" == "some value") {

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

Есть ли способ проверить, являются ли первые 4 символа строки числовыми только в одной строке, которая может существовать внутри оператора if?

+0

Используется метод расширения для использования 'TryParse'? – Scott

+0

определенно метод расширения – Jonesopolis

+0

@ScottKaye - Я никогда не использовал методы расширения. Гуглинг, чтобы посмотреть, как их использовать, и я сделаю это. – TheIronCheek

ответ

2

В ответ на это:

Есть ли способ, чтобы проверить, если первые 4 символа строки являются числами в одну строку, которая может существовать внутри, если заявление?

Вы, ребята, не должны заставлять его учитывать что-либо более сложное, чем положительное целое число.

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

// in an if: 
if (new Regex(@"^\d{4}").IsMatch("3466")) 
{ 
    // Do something 
} 

Старый ответ:

Если вы не можете использовать TryParse, вы, вероятно, уйти с использованием LINQ:

"12345".All(char.IsDigit); // true 
"abcde".All(char.IsDigit); // false 
"abc123".All(char.IsDigit); // false 

Если вы можете, вот a IsNumeric метод расширения, с использованием:

public static class NumberExtensions 
{ 
    // <= C#6 
    public static bool IsNumeric(this string str) 
    { 
     float f; 
     return float.TryParse(str, out f); 
    } 

    // C# 7+ 
    public static bool IsNumeric(this string str) => float.TryParse(str, out var _); 
} 

// ... elsewhere 

"123".IsNumeric();  // true 
"abc".IsNumeric();  // false, etc 
"-1.7e5".IsNumeric(); // true 
+1

проблема в том, что это не так! 00% проверить, что это 'int' – Jonesopolis

+0

@Jonesopolis Правда, это обходное решение наверняка. Метод метода расширения лучше, но если OP сразу после того, как базовый метод «строка содержит только числа», он должен работать. – Scott

+0

Не обрабатывает числа с плавающей запятой. – AgentFire

6

Оберните его в extension method.

public static class StringExtensions 
{ 
    public static bool IsNumeric(this string input) 
    { 
     int number; 
     return int.TryParse(input, out number); 
    } 
} 

И использовать его как

if("1234".IsNumeric()) 
{ 
    // Do stuff.. 
} 

UPDATE, так как вопрос изменения:

public static class StringExtensions 
{ 
    public static bool FirstFourAreNumeric(this string input) 
    { 
     int number; 
     if(string.IsNullOrEmpty(input) || input.Length < 4) 
     { 
      throw new Exception("Not 4 chars long"); 
     } 

     return int.TryParse(input.Substring(4), out number); 
    } 
} 

И использовать его как

if("1234abc".FirstFourAreNumeric()) 
{ 
    // Do stuff.. 
} 
+0

Не обрабатывает длинные числовые числа и не обрабатывает разделители запятой/периодом. – AgentFire

+0

Это отвечает на вопрос, но использование '@ this' в качестве имени параметра - очень и очень плохой выбор. Не говоря уже об использовании его в качестве параметра метода расширения. Лично я считаю, что использование ключевых слов в качестве имен параметров и переменных является чем-то, чего следует избегать. – user3185569

+0

@ user3185569 - Возможно, вы правы в отношении имени параметра. Я изменил его на 'input'. Лично я нахожу '@ this' очень логичным в этом (каламбуром не предназначенном) конкретном случае только потому, что он показывает, что расширяет расширение. Но это только я. – smoksnes

2

Как насчет легко LinQ?

if (str.Take(4).All(char.IsDigit) { ... } 
+0

Как насчет негативов и десятичных знаков? –