2012-04-30 39 views
9

Tìm kiếm các cách nhanh chóng/hiệu quả để chuyển đổi một chữ số sang số chỉ một chuỗiChữ và số để chỉ số

ví dụ: + 123-456/7890 trở thành 1234567890, vv

mã hiện là

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

return stringBuilder.ToString(); 
+0

bạn thực sự là gì sau đây? ... ý tưởng mới (ví dụ: sử dụng regex) hoặc điểm chuẩn? tại sao bạn hỏi câu hỏi này - chỉ để biết thông tin, hoặc là có một kịch bản thế giới thực? –

+0

Tôi không nghĩ rằng cách tiếp cận của bạn là chậm .. nếu đo tốc độ, nên nhanh hơn nhiều so với regex. Cải tiến duy nhất tôi có thể tưởng tượng là thay thế bằng LINQ, nhưng không phải ở tốc độ, chỉ có mã sạch hơn. – xandy

+1

Bản sao của http://stackoverflow.com/questions/6361986/how-get-integer-only-and-remove-all-string-in-c-sharp –

Trả lời

4

LINQ Giải pháp:

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

Không chắc nếu nó hiệu quả hơn; ít nhất nó không phải là regex!

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

Làm thế nào regex nhanh hơn? –

+1

@Kumar: Và nếu số của bạn vượt quá 'Int32.MaxValue = 2147483647', hãy sử dụng Convert.ToInt64 (...); có thể cung cấp cho bạn kết quả cho đến khi 'Int64.MaxValue = 9223372036854775807' – Marshal

+0

Cảm ơn @Marshal, tôi đã chỉnh sửa câu trả lời của mình. –

2

Có RegEx là nhanh hơn những người khác, bạn có thể làm cho việc so sánh nhiều hơn nhanh hơn sử dụng RegexOptions.Compiled để khớp với các trường hợp âm/dương và phân biệt chúng (nếu các chuỗi đó có thể tồn tại)

ví dụ

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

Tôi đã thử nghiệm nó bằng cách sử dụng Ideone, cho kết quả hoàn toàn ngược lại và bây giờ câu hỏi sẽ là những gì để tin tưởng VS-IDE hoặc Ideone? – Marshal

+0

@ Marshal thats lạ, tôi tin rằng nhiều hơn về kết quả VS-IDE vì nó là trên máy địa phương của bạn, nhưng không thể nói quá sớm. –

2

Dưới đây là một giải pháp khác tìm thấy

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

Quá trình này chậm hơn nhiều (4 ms) so với so sánh Regex (1 ms). Mặc dù nó có thể không gây hại quá nhiều cho các ứng dụng, (nó chỉ là một 'nghiên cứu nhỏ') – Marshal

1

Sau khi nhìn thấy nhiều câu trả lời cố gắng không sử dụng Regex trong tình huống này, tôi muốn nói thực sự Regex hoạt động nhanh hơn nhiều trong trường hợp cụ thể này. Tôi đã cố gắng thời gian thực hiện để thực hiện sử dụng this code snippet

Phương pháp được đề xuất bởi

Edit: Những đưa ra hai kết quả đầu ra hoàn toàn ngược lại, tôi không biết nếu chúng ta nên Ideone hoàn toàn tin tưởng hơn Visual Studio IDE.

+0

Nguyên soái, đặt mã của bạn trong [IDEone] (http://ideone.com/tH4O4), hiện tại tôi không có bất cứ điều gì để kiểm tra, nhưng nơi này có thể chấp nhận được cho cả hai chúng tôi. –

+0

@SaeedAmiri: Được rồi, tôi cũng sẽ cố gắng tìm điều đó :) – Marshal

+0

Nguyên soái, chỉ cần nhập ideone.com, sau đó đăng mã của bạn vào trong đó và để lại liên kết có liên quan tại đây. –

Các vấn đề liên quan