2012-04-30 40 views
9

尋找快速/有效的方式來一個字母數字轉換爲數字僅串字母數字到數字僅

例如+ 123-456/7890變爲1234567890等

現有的代碼是

foreach(char c in str.ToCharArray()) 
    if (char.IsDigit(c)) stringBuilder.Append(c); 

return stringBuilder.ToString(); 
+0

你究竟在做什麼?......新的想法(例如使用正則表達式)還是基準測試?你爲什麼問這個問題 - 僅僅是爲了獲得信息,還是存在一個真實世界的場景? –

+0

我不認爲你的方法很慢..如果測量速度,應該比正則表達式快得多。我能想象的唯一改進就是用Linq取代,但速度並不快,只有更簡潔的代碼。 – xandy

+1

重複的http://stackoverflow.com/questions/6361986/how-get-integer-only-and-remove-all-string-in-c-sharp –

回答

4

LINQ解決方案:

return new string(str.Where(char.IsDigit).ToArray()); 

不知道它的效率更高;至少它不是正則表達式!

4
string str="+123-456/7890"; 
long onlyNumbers= Convert.ToInt64(Regex.Replace(str, @"\D", "")); 
+0

正則表達式的速度如何? –

+1

@Kumar:如果你的數字超過了'Int32.MaxValue = 2147483647',使用Convert.ToInt64(...);它可以給你的結果,直到'Int64。MaxValue = 9223372036854775807' – Marshal

+0

Thanks @Marshal,我編輯了我的答案。 –

2

是正則表達式是中別人快,你可以作出比較更快使用RegexOptions.Compiled到匹配陰性/陽性病例並將它們分開(如果這樣的字符串可以存在)

例如

Regex numberOnlyRegEx = new Regex(@"[^0-9]+", RegexOptions.Compiled); 

if (!numberOnlyRegEx.IsMatch(str)) 
    return 0; //default value; 

return Convert.ToInt32(numberOnlyRegEx .Replace(str, "[^0-9]+", "")); 
+0

我使用Ideone測試了它,它給出了完全相反的結果,現在問題是什麼來信任VS-IDE或Ideone? – Marshal

+0

@Marshal很奇怪,我更相信VS-IDE的結果,因爲它在你的本地機器上,但不能這麼早說。 –

2

這裏是另一種解決方案發現

string justNumbers = new String(text.Where(Char.IsDigit).ToArray()); 
int numbers = Convert.ToInt32(justNumbers); 
+0

與正則表達式比較(1 ms)相比,此過程要慢得多(4 ms)。雖然它可能不會對應用程序造成太大的損害,但它只是一個小小的'研究' – Marshal

1

在這種情況下看到很多嘗試不使用正則表達式的答案後,我想說的實際上正則表達式在這種情況下工作得更快。我試着計算由

編輯:這些給兩個完全相反的輸出,我不知道我們是否應該比Visual Studio IDE中完全信任Ideone。

+0

元帥,把你的代碼放在[IDEone](http://ideone.com/tH4O4)中,目前我沒有任何東西去測試,但這個地方對我們倆都是可以接受的。 –

+0

@SaeedAmiri:好的,我會盡力找到:) – Marshal

+0

Marshal,只需鍵入ideone.com,然後在其中發佈代碼,並在此處留下相關鏈接。 –