2013-08-15 197 views
16

Tôi chỉ muốn biết, liệu biến Chuỗi có chứa giá trị số nguyên dương có thể phân tích cú pháp không. Tôi KHÔNG muốn phân tích giá trị ngay bây giờ.Trong C#, cách kiểm tra xem chuỗi có chứa số nguyên không?

Hiện nay tôi đang thực hiện:

int parsedId; 
if (
    (String.IsNullOrEmpty(myStringVariable) || 
    (!uint.TryParse(myStringVariable, out parsedId)) 
) 
{//..show error message} 

này là xấu xí - Làm thế nào để được ngắn gọn hơn?

Lưu ý: Tôi biết về các phương pháp mở rộng, nhưng tôi tự hỏi liệu có cái gì đó được tích hợp sẵn hay không.

+1

Bạn có cần cho phép số âm không? –

+3

Giữ mã bạn có và sống với sự xấu xí. –

+0

@MatthewWatson Cảm ơn vì đã phát hiện ra điều này. Đó là tích cực chỉ trong trường hợp của tôi, làm rõ câu hỏi. – Marcel

Trả lời

3

Câu trả lời có vẻ là chỉ là không.

Mặc dù có nhiều câu trả lời hay khác, chúng chỉ che giấu sự xấu xí (mà tôi không yêu cầu) hoặc đưa ra các vấn đề mới (trường hợp cạnh).

+0

Tôi đoán các nhà thiết kế của C# có thể giới thiệu một số đường cú pháp mới cho trường hợp này, nơi chúng tôi không quan tâm đến biến số ngoài. Nó có thể trông giống như 'int.TryParse (myStringVariable, out void)' hoặc một cái gì đó. Trình biên dịch sau đó sẽ tự động giới thiệu một biến địa phương "được sinh ra" của kiểu đúng, nhưng nó sẽ không trông xấu xí trong mã. Tất nhiên biến được tạo sẽ không thể truy cập được (nên có một số tên bất hợp pháp "điên"). –

22

Giả sử bạn muốn kiểm tra xem tất cả các ký tự trong chuỗi là chữ số, bạn có thể sử dụng Enumerable.All Extension Method với Char.IsDigit Method như sau:

bool allCharactersInStringAreDigits = myStringVariable.All(char.IsDigit); 
+1

Điều gì xảy ra nếu 'myStringVariable' chứa các ký tự chữ số từ nhiều" tập lệnh "khác nhau từ khắp nơi trên thế giới, chẳng hạn như chữ số Hindu-Ả Rập kết hợp với chữ số phương Tây? –

+0

Trong trường hợp đó, "۲۲۲" sẽ cho đúng, nhưng phân tích cú pháp dưới dạng int sẽ ném một ngoại lệ. –

+0

Nếu bạn muốn kiểm tra xem có bất kỳ ký tự nào là số và không phải tất cả chúng, bạn có thể sử dụng - bool anyCharactersInStringAreDigits = myStringVariable.Any (char.IsDigit); – Deano

0

Xin lỗi, không hoàn toàn nhận được câu hỏi của bạn. Vì vậy, một cái gì đó như thế này?

str.ToCharArray().Any(char.IsDigit); 

Hoặc giá trị phải là số nguyên hoàn toàn, không có bất kỳ chuỗi bổ sung nào không?

if(str.ToCharArray().All(char.IsDigit(c)); 
+0

Câu trả lời thứ hai của bạn sẽ trả về cho '----- 'là gì? – I4V

+0

@SBoss Nó chính xác nên được phân tích cú pháp là int, nhưng tôi chỉ muốn bây giờ, không phải là kết quả của giá trị phân tích cú pháp. – Marcel

+0

Chỉ cần nhận ra rằng;) – SBoss

5

Bạn có thể kiểm tra xem chuỗi chỉ chứa số:

Regex.IsMatch(myStringVariable, @"^-?\d+$") 

Nhưng số có thể lớn hơn Int32.MaxValue hoặc ít hơn Int32.MinValue - bạn nên giữ ý nghĩ đó.

Một tùy chọn khác - tạo phương pháp mở rộng và di chuyển mã xấu xí đó:

public static bool IsInteger(this string s) 
{ 
    if (String.IsNullOrEmpty(s)) 
     return false; 

    int i; 
    return Int32.TryParse(s, out i); 
} 

Điều đó sẽ làm cho mã của bạn sạch hơn:

if (myStringVariable.IsInteger()) 
    // ... 
+2

+1 cho gợi ý Min/Max. –

+0

câu trả lời thẳng về phía trước –

17

Bạn có thể sử dụng char.IsDigit:

 bool isIntString = "your string".All(char.IsDigit) 

Sẽ trả lại true nếu chuỗi là một số

bool containsInt = "your string".Any(char.IsDigit) 

Sẽ trở lại true nếu chuỗi có chứa một chữ số

+2

Nếu 'str' bằng' "iuhs,./Hu3dwuh" ', thì' str.Any (char.IsDigit) 'sẽ là đúng. –

+1

Tôi không phải là downvoter, nhưng 1. Không có chức năng tĩnh trên lớp 'string' được gọi là' Any' (có lẽ bạn có nghĩa là cho biến chuỗi được gọi là 'string', nhưng điều đó là không thể); 2. Nếu bạn đang đề cập đến phương thức mở rộng Linq 'Any', bạn phải gọi nó là liks:' s.Any (c => char.IsDigit (c)) '; 3. Tôi nghĩ anh ta muốn chuỗi * toàn bộ * là một số nguyên, không chỉ để chứa một chữ số ở đâu đó; bằng không nó không có ý nghĩa gì với anh ta để sử dụng 'int.TryParse'. –

+4

@MagnusGrindalBakken Về (2): Không, vì chữ ký và kiểu trả về là đúng, biểu thức 'char.IsDigit' (một nhóm phương thức được gọi là) _can_ được chuyển thành kiểu' Func 'thông qua chuyển đổi ngầm, vì vậy phần đó là OK. –

3

Có lẽ điều này có thể giúp

string input = "hello123world"; 
bool isDigitPresent = input.Any(c => char.IsDigit(c)); 

câu trả lời từ msdn.

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