2009-01-13 50 views
86

Cách hiệu quả nhất để thử nghiệm một chuỗi đầu vào cho dù nó có chứa giá trị số (hoặc ngược lại không phải là một số)? Tôi đoán tôi có thể sử dụng Double.Parse hoặc regex (xem bên dưới) nhưng tôi đã tự hỏi nếu có một số được xây dựng trong cách để làm điều này, chẳng hạn như javascript NaN() hoặc IsNumeric() (là VB, tôi không thể nhớ?).Tương đương C# của NaN hoặc IsNumeric là gì?

public static bool IsNumeric(this string value) 
{ 
    return Regex.IsMatch(value, "^\\d+$"); 
} 
+0

Có thể trùng lặp [Làm cách nào để xác định xem chuỗi có phải là số không?] (Http://stackoverflow.com/questions/894263/how-do-i-identify-if-a-string-is -a-number) –

Trả lời

144

này không có regex overhead

double myNum = 0; 
String testVar = "Not A Number"; 

if (Double.TryParse(testVar, out myNum)) { 
    // it is a number 
} else { 
    // it is not a number 
} 

Ngẫu nhiên, tất cả các loại dữ liệu tiêu chuẩn, với ngoại lệ rõ ràng của các GUID, hỗ trợ TryParse.

cập nhật
secretwep lớn lên rằng giá trị "2345," sẽ vượt qua các thử nghiệm trên như một số. Tuy nhiên, nếu bạn cần đảm bảo rằng tất cả các ký tự trong chuỗi là các chữ số, thì một cách tiếp cận khác cần được thực hiện.

ví dụ 1:

public Boolean IsNumber(String s) { 
    Boolean value = true; 
    foreach(Char c in s.ToCharArray()) { 
    value = value && Char.IsDigit(c); 
    } 

    return value; 
} 

hoặc nếu bạn muốn trở thành ưa thích hơn một chút

public Boolean IsNumber(String value) { 
    return value.All(Char.IsDigit); 
} 
+0

Nếu cần, bạn có thể bọc mã trên vào một phương thức tiện ích hữu ích hơn như công thức tĩnh bool IsInteger (chuỗi sMaybeANumber) – Gishu

+0

@Gishu: Bạn đúng nếu tất cả những gì bạn quan tâm là số có thể chuyển đổi hay không. – NotMe

+2

Vấn đề duy nhất với điều này là đối tượng 'Số' trong Javascript là một số phẩy hoặc số nguyên, do đó thay đổi thành double.TryParse sẽ chính xác hơn tương đương –

4

VB có IsNumeric chức năng. Bạn có thể tham khảo Microsoft.VisualBasic.dll và sử dụng nó.

+0

Bạn có thể chỉ nhận được phương thức VB đó trong các phiên bản 2.0 của .net không? –

+0

ok ... Tôi không biết điều đó có nghĩa là gì. –

+0

Bạn có thể sử dụng nó từ 1.0 trở lên. –

2

Vâng, IsNumeric là VB. Thông thường mọi người sử dụng phương thức TryParse(), mặc dù nó hơi khó xử. Như bạn đã đề xuất, bạn luôn có thể viết của riêng bạn.

int i; 
if (int.TryParse(string, out i)) 
{ 

} 
36

Tôi thích một cái gì đó như thế này, nó cho phép bạn quyết định những gì NumberStyle để kiểm tra.

public static Boolean IsNumeric(String input, NumberStyles numberStyle) { 
    Double temp; 
    Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp); 
    return result; 
} 
+6

+1 cho là người duy nhất cho đến nay để Double.TryParse thay vì Int.TryParse :) – johnc

+0

Đây cũng là, rõ ràng, gần như là một phương pháp mở rộng. –

19

Ngoài các câu trả lời đúng trước nó có lẽ là giá trị chỉ ra rằng "Not a Number" (NaN) trong việc sử dụng chung của nó là không tương đương với một chuỗi mà không thể được đánh giá là một giá trị số. NaN thường được hiểu là giá trị số được sử dụng để biểu thị kết quả của phép tính "không thể" - nơi kết quả là không xác định. Về mặt này tôi sẽ nói việc sử dụng Javascript là hơi gây hiểu lầm. Trong C# NaN được định nghĩa là thuộc tính của các kiểu số đơn và đôi và được sử dụng để chỉ rõ ràng đến kết quả của số không lặn bằng 0. Các ngôn ngữ khác sử dụng nó để đại diện cho các giá trị "không thể" khác nhau.

+0

Tôi không biết điều đó, cảm ơn – johnc

3
public static bool IsNumeric(string anyString) 
{ 
    if (anyString == null) 
    { 
     anyString = ""; 
    } 

    if (anyString.Length > 0) 
    { 
     double dummyOut = new double(); 
     System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US", true); 
     return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut); 
    } 
    else 
    { 
     return false; 
    } 
} 
3

Có thể đây là tính năng C# 3, nhưng bạn có thể sử dụng double.NaN.

2

Thực ra, Double.NaN được hỗ trợ trong tất cả các phiên bản .NET 2.0 trở lên.

4

mở rộng đơn giản:

public static bool IsNumeric(this String str) 
{ 
    try 
    { 
     Double.Parse(str.ToString()); 
     return true; 
    } 
    catch { 
    } 
    return false; 
} 
2

Tôi đã sử dụng Chris đoạn Lively của (câu trả lời được chọn) gói gọn trong một hàm bool thích đề xuất Gishu cho một hoặc hai năm. Tôi đã sử dụng nó để đảm bảo một số chuỗi truy vấn nhất định chỉ là số trước khi tiếp tục xử lý.Tôi bắt đầu nhận được một số truy vấn sai lệch rằng câu trả lời được đánh dấu không được xử lý, đặc biệt, bất cứ khi nào một dấu phẩy được chuyển sau một số như "3645" (trả về true). Đây là kết quả mod:

static public bool IsNumeric(string s) 
    { 
     double myNum = 0; 
     if (Double.TryParse(s, out myNum)) 
     { 
     if (s.Contains(",")) return false; 
     return true; 
     } 
     else 
     { 
     return false; 
     } 
    } 
+0

+1 vì điều thú vị. Tôi đoán đó là câu hỏi sử dụng nhiều hơn. Nói cách khác, nếu bạn chỉ muốn chắc chắn rằng giá trị có thể được chuyển đổi thành một số mà không cần ném một lỗi thì câu trả lời ban đầu của tôi là tốt. Tuy nhiên, nếu bạn quan tâm nhiều hơn rằng tất cả các ký tự trong chuỗi thực sự là chữ số thì một cách tiếp cận hoàn toàn khác là cần thiết – NotMe

+0

'Double.TryParse (s, NumberStyles.Float, CultureInfo.InvariantCulture, out myNum)' –

5

Tôi thích phương pháp mở rộng, nhưng không thích ném ngoại lệ nếu có thể. Tôi đã chọn phương thức tiện ích mở rộng sử dụng tối đa 2 câu trả lời tại đây.

/// <summary> 
    /// Extension method that works out if a string is numeric or not 
    /// </summary> 
    /// <param name="str">string that may be a number</param> 
    /// <returns>true if numeric, false if not</returns> 
    public static bool IsNumeric(this String str) 
    { 
     double myNum = 0; 
     if (Double.TryParse(str, out myNum)) 
     { 
      return true; 
     } 
     return false; 
    } 
4

Bạn vẫn có thể sử dụng chức năng Visual Basic trong C#. Điều duy nhất bạn phải làm là chỉ cần làm theo hướng dẫn của tôi hiển thị dưới đây:

  1. Thêm tham chiếu đến Visual Thư viện cơ bản bằng cách nhấp chuột phải vào dự án của bạn và chọn "Add Reference":

enter image description here

  1. sau đó nhập khẩu nó trong lớp học của bạn như hình dưới đây:

    sử dụng Microsoft.VisualBasic;

  2. Tiếp sử dụng nó bất cứ nơi nào bạn muốn như hình dưới đây:

      if (!Information.IsNumeric(softwareVersion)) 
         { 
          throw new DataException(string.Format("[{0}] is an invalid App Version! Only numeric values are supported at this time.", softwareVersion)); 
         } 
    

Hope, điều này giúp và may mắn!

+1

Trong khi tôi không đề nghị phương pháp này, nó * là * một câu trả lời đúng. Không chắc chắn lý do tại sao nó đã được downvoted, và kể từ khi nó đã không được giải thích tại sao hoặc, tôi lên bầu chọn để chống lại nó :-) – Abacus

4

Tôi biết điều này đã được trả lời theo nhiều cách khác nhau, với các tiện ích mở rộng và ví dụ lambda, nhưng kết hợp cả hai cho giải pháp đơn giản nhất.

public static bool IsNumeric(this String s) 
{ 
    return s.All(Char.IsDigit); 
} 

hoặc nếu bạn đang sử dụng Visual Studio 2015 (C# 6.0 trở lên) sau đó

public static bool IsNumeric(this String s) => s.All(Char.IsDigit); 

tạo ảnh vui nhộn C# 6 trên cùng một dòng. Tất nhiên điều này bị giới hạn bởi vì nó chỉ kiểm tra các ký tự số duy nhất.

Để sử dụng, chỉ cần có một chuỗi và gọi phương thức trên nó, chẳng hạn như:

bool IsaNumber = "123456".IsNumeric(); 
+0

Đối với người dùng không quen thuộc với [phương pháp khuyến nông] (https://msdn.microsoft.com/en-us/ library/bb383977.aspx), nó có thể có ích để bao gồm một số thông tin khác (hoặc ít nhất là lớp tĩnh xung quanh để cung cấp một ví dụ hoàn chỉnh hơn). – johnnyRose

0

Tôi có một phiên bản hơi khác nhau mà trả về số. Tôi đoán rằng trong hầu hết các trường hợp sau khi kiểm tra chuỗi bạn sẽ muốn sử dụng số.

public bool IsNumeric(string numericString, out Double numericValue) 
{ 
    if (Double.TryParse(numericString, out numericValue)) 
     return true; 
    else 
     return false; 
} 
Các vấn đề liên quan