2015-10-25 58 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)'而不是多个大小写构造。 –

回答

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