2012-06-12 37 views
10

Tôi đã được cung cấp một số dữ liệu được định dạng kém và cần phải lấy số ra khỏi chuỗi. Tôi không chắc cách tốt nhất để làm điều này là gì. Các con số có thể dài bất kỳ.Trích xuất các số từ chuỗi để tạo chuỗi ký tự duy nhất

string a = "557222]]>"; 
string b = "5100870<br>"; 

bất kỳ ý tưởng những gì tôi có thể làm như vậy tôi sẽ có được điều này:

a = "557222" 
b = "5100870" 

Cảm ơn

Giải pháp là cho C# xin lỗi. Đã chỉnh sửa câu hỏi để có thẻ đó

+0

Bạn có nghĩa là C hoặc C#? –

+0

"Dữ liệu xấu" có thể ở giữa số của bạn không? –

+0

Không, nó sẽ chỉ ở cuối. – kevp

Trả lời

8

Không đủ quen thuộc với .NET cho mã chính xác. Tuy nhiên, hai cách tiếp cận sẽ là:

  • Đúc nó làm số nguyên. Nếu các ký tự không phải chữ số ở cuối (ví dụ: 21389abc), thì đây là cách dễ nhất.
  • Nếu bạn đã trộn lẫn các ký tự không phải chữ số (ví dụ: 1231a23v) và muốn giữ mỗi chữ số, hãy sử dụng regex [^\d] để thay thế các ký tự không phải chữ số.
+2

+1 cho regex. Với C# bạn có thể sử dụng một cái gì đó như, 'Regex.split (str," [^ \ d] ")' và sử dụng hàm 'string.join (" ", Regex.split (...))'. – Ryan

+0

@Ryan, cảm ơn. Không bao giờ có quá sâu trong .NET. Nhưng logic vượt quá ngôn ngữ :) –

+2

Thay vì chia nhỏ/kết nối lộn xộn, giải pháp đơn giản hơn là: Regex mới (@ "\ D"). Thay thế (nguồn ?? "", ""); –

29

Bạn có thể viết một phương pháp đơn giản để trích xuất ra tất cả các ký tự không phải chữ số, mặc dù điều này sẽ không xử lý dữ liệu điểm nổi:

public string ExtractNumber(string original) 
{ 
    return new string(original.Where(c => Char.IsDigit(c)).ToArray()); 
} 

này hoàn toàn rút ra những "con số" - bạn cũng có thể sử dụng Char.IsNumber thay vì Char.IsDigit, tùy thuộc vào kết quả bạn muốn.

+0

IsDigit rút ra những điều sau đây; phân số, chỉ số, chữ số, chữ số La Mã, tử số tiền tệ, số được mã hóa và số chữ số của tập lệnh. Bạn có thể cho ai đó ấn tượng bằng cách nói "hoàn toàn kéo ra các chữ số". Xem câu trả lời của tôi để có được chỉ các ký tự 0-9. – Atters

7

Bạn có thể sử dụng một biểu thức chính quy đơn giản:

var numericPart = Regex.Match(a, "\\d+").Value; 

Nếu bạn cần nó để được một giá trị số thực tế, sau đó bạn có thể sử dụng int.Parse hoặc int.TryParse.

3

Hãy thử điều này

string number = Regex.Match("12345<br>", @"\d+").Value; 

này sẽ trở lại với nhóm đầu tiên của chữ số. Ví dụ: đối với đầu vào "a 123 b 456 c", nó sẽ trả về "123".

3

Câu hỏi không nói rõ rằng bạn chỉ muốn các ký tự từ 0 đến 9 nhưng sẽ không thể kéo dài để tin rằng điều đó đúng với tập hợp và nhận xét mẫu của bạn. Vì vậy, đây là mã mà làm điều đó.

 string digitsOnly = String.Empty; 
     foreach (char c in s) 
     { 
      // Do not use IsDigit as it will include more than the characters 0 through to 9 
      if (c >= '0' && c <= '9') digitsOnly += c; 
     } 

Tại sao bạn không muốn sử dụng Char.IsDigit() - Số bao gồm các nhân vật như phân số, kí hiệu, superscript, chữ số La Mã, tử số tiền tệ, bao quanh con số, chữ số và kịch bản cụ thể.

10

thử tính năng này: Regex.Replace (str, "[^ 0-9 _]", "");

+0

Điều đó không hoạt động đối với các số dấu phẩy động vì nó xóa dấu chấm và dấu âm. –

4

Bạn có thể sử dụng LINQ. Đoạn mã dưới đây lọc chuỗi thành một IEnumerable chỉ với các chữ số và sau đó chuyển nó thành một char []. Khi đó, hàm tạo chuỗi có thể chuyển đổi char [] thành một chuỗi:

string a = "557222]]>"; 
string b = "5100870<br>"; 

a = new string(a.Where(x => char.IsDigit(x)).ToArray()); 
b = new string(b.Where(x => char.IsDigit(x)).ToArray()); 
Các vấn đề liên quan