2015-10-25 100 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