2015-10-25 3 views
0

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

Мой вопрос сейчас: Мое решение так просто, как может быть?

internal static string testStringForNumber(string v) 
    { 
     // example: string strToTest = Data.CommonMethods.testStringForNumber(this.amountTextBox.Text.Trim()); 
     string returnValue = ""; 
     string chr = ""; 
     int nLen = v.Length; 
     int i = 0; // this is my counter 
     while (i < nLen) 
     { 
      chr = v.Substring(i, 1); 
      switch (chr) 
      { 
       case ".": 
        returnValue = returnValue + chr; 
        break; 
       case "0": 
        returnValue = returnValue + chr; 
        break; 
       case "9": 
        returnValue = returnValue + chr; 
        break; 
       case "8": 
        returnValue = returnValue + chr; 
        break; 
       case "7": 
        returnValue = returnValue + chr; 
        break; 
       case "6": 
        returnValue = returnValue + chr; 
        break; 
       case "5": 
        returnValue = returnValue + chr; 
        break; 
       case "4": 
        returnValue = returnValue + chr; 
        break; 
       case "3": 
        returnValue = returnValue + chr; 
        break; 
       case "2": 
        returnValue = returnValue + chr; 
        break; 
       case "1": 
        returnValue = returnValue + chr; 
        break; 
      } 

      i = i + 1; 
     } 


     return returnValue; 
    } 
+0

'string' является перечислимым символом' char', поэтому вместо выполнения дорогостоящей операции подстроки вы можете просто выполнить 'foreach (char c in v)'. Кроме того, используйте 'StringBuilder', если вы добавляете много строк или символов вместе, в большинстве случаев они будут более эффективными. –

+0

Ваш заголовок говорит, что вы хотите сохранить символы, которые соответствуют определенным критериям, но имя метода в вашем фрагменте, кажется, указывает, что вы просто хотите проверить, является ли строка числом или нет. Так что это? –

+0

Вы также должны использовать 'char.IsDigit (chr)' вместо нескольких конструкций case. –

ответ

2

Это не так, я дам одну гильзы, но я бы рекомендовал StringBuilder для кода охранения.

public string NumbersAndDecimalPoints(string input) 
{ 
    return new string(input.ToCharArray().Where(t => char.IsDigit(t) || t == '.').ToArray()); 
} 

Если строка - это то, что вы хотите. Иначе вы можете разобрать его и на номер.

return decimal.Parse(NumbersAndDecimalsPoints(v)); 

Если с другой стороны, задача выяснения, если строка является допустимым числом, я бы либо пойти с @Steve и использовать Any() или просто попытаться разобрать его.

Использование Any() (который не будет ловить несколько разделителей):

var isNumber = !input.ToCharArray().Any(c => "1234567890.".IndexOf(c) < 0); 

Использование TryParse() (на самом деле лучший способ):

var number = 0m; 
var isNumber = decimal.TryParse(input, out number); // is number true = is valid number 
+0

Приятно, но может быть быстрее с помощью любого – Steve

+0

@Steve Просьба уточнить, как мог 'Any()' улучшить его? – flindeberg

+0

Умм Я вижу непоследовательность между заголовком и вопросом. Если название правильное, тогда ваш ответ правильный. Но вопрос говорит только о проверке наличия действительных чисел. В этом случае используйте _input.ToCharArray(). Любой (c => "1234567890.". IndexOf (c) <0) _ должен быть быстрее, чем использовать Where и проверять каждый символ с помощью IsDigit – Steve

2

Я хотел бы использовать регулярное выражение, а не лично.

string newString = Regex.Replace(strToTest,@"[^\d.]",""); 

Конечно, я не знаю, ПОЧЕМУ вы это сделаете. Что-то вроде «Тест 23. Тест 42». Вернет строку 23.42.

+0

grrrr вы меня избили ;-) – Seabizkit

Смежные вопросы