2012-03-21 28 views

Trả lời

7

Có phương thức TryParse, trả về một bool cho biết liệu chuyển đổi có thành công hay không.

+0

Dường như điều này có lẽ sẽ là lựa chọn tốt hơn trên mạng, nhờ .... – user1202606

+0

Lệnh 'TryParse 'phương thức sẽ không cho kết quả tương tự như' IsNumeric'. – phoog

70

Bạn có thể viết một phương pháp khuyến nông:

public static class Extension 
{ 
    public static bool IsNumeric(this string s) 
    { 
     float output; 
     return float.TryParse(s, out output); 
    } 
} 
+8

Tôi muốn gọi phương thức đó là 'IsInteger'. Số là khá mơ hồ. – CodesInChaos

+3

@CodeInChaos - chắc chắn, tại sao không. Tôi cũng sẽ không gọi lớp mở rộng, tôi quan tâm nhiều hơn đến ý tưởng đó. –

+0

Phương thức này trả về 'false' cho một số lớp của chuỗi mà' IsNumeric' trả về 'true'. – phoog

14

Bạn nên sử dụng TryParse-Parse ném một ngoại lệ nếu chuỗi không phải là một số hợp lệ - ví dụ nếu bạn muốn kiểm tra đối với một số nguyên hợp lệ:

int v; 
if (Int32.TryParse(textMyText.Text.Trim(), out v)) { 
    . . . 
} 

Nếu bạn muốn kiểm tra đối với một số dấu chấm động hợp lệ:

double v; 
if (Double.TryParse(textMyText.Text.Trim(), out v)) { 
    . . . 
} 

Cũng lưu ý rằng Double.TryParse có một phiên bản quá tải với các thông số thêm quy định cụ thể khác nhau các quy tắc và tùy chọn kiểm soát quá trình phân tích cú pháp - ví dụ bản địa hóa ('.' hoặc ',') - xem http://msdn.microsoft.com/en-us/library/3s27fasw.aspx.

+0

'Int32.TryParse' trả về' false' cho '1E2', ví dụ, trong khi' IsNumeric' trả về 'true'. – phoog

+0

Có 'Double.TryParse' sau đó - Tôi đang cập nhật câu trả lời của tôi – MiMo

+0

Theo tài liệu Parse và TryParse bỏ qua khoảng trắng. Điều này làm cho Trim() không cần thiết. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-a-string-to-a-number – Asimov

14

Tôi nghĩ bạn cần một cái gì đó chung chung hơn một chút. Hãy thử điều này:

public static System.Boolean IsNumeric (System.Object Expression) 
{ 
    if(Expression == null || Expression is DateTime) 
     return false; 

    if(Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal || Expression is Single || Expression is Double || Expression is Boolean) 
     return true; 

    try 
    { 
     if(Expression is string) 
      Double.Parse(Expression as string); 
     else 
      Double.Parse(Expression.ToString()); 
      return true; 
     } catch {} // just dismiss errors but return false 
     return false; 
    } 
} 

Hy vọng điều đó sẽ hữu ích!

+0

Đây là câu trả lời hay hơn tất cả những người khác , nhưng nó vẫn không khớp với chức năng của 'IsNumeric'. – phoog

+3

Tôi thích cách tiếp cận để kiểm tra kiểu dữ liệu trước, nhưng tôi đề nghị sửa đổi phần thứ hai của mã bằng cách sử dụng 'Double tmp; var isSuccess = Double.TryParse (Biểu thức dưới dạng chuỗi, ra tmp); return isSuccess; 'thay vì khối try-catch xung quanh. – Matt

1

Bạn nên sử dụng phương pháp TryParse Chuyển đổi chuỗi đại diện của một số thành số nguyên tương đương 32 bit đã ký. Giá trị trả lại cho biết liệu chuyển đổi có thành công hay không.

int intParsed; 
    if(int.TryParse(txtMyText.Text.Trim(),out intParsed)) 
    { 
     // perform your code 
    } 
+0

'int.TryParse' trả về false cho' "$ 100" 'và' "1E2" ', trong khi' IsNumeric' trả về true. – phoog

+0

Bạn có thể sử dụng phương thức Int32.TryParse quá tải (String, NumberStyles, IFormatProvider, Int32%) để chỉ định đơn vị tiền tệ hoặc số mũ. http://msdn.microsoft.com/en-us/library/zf50za27(v=vs.90).aspx – DotNetUser

1

Có một cách tốt hơn một chút:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), out valueParsed)) 
{ ... } 

Nếu bạn cố gắng để phân tích văn bản và nó không thể được phân tích, phương pháp Int32.Parse sẽ nâng cao một ngoại lệ. Tôi nghĩ rằng nó là tốt hơn cho bạn để sử dụng phương pháp TryParse mà sẽ nắm bắt được ngoại lệ và cho bạn biết như là một boolean nếu bất kỳ ngoại lệ đã gặp phải.

Có nhiều biến chứng trong phân tích cú pháp văn bản mà Int32.Parse tính đến. Nó là ngu ngốc để nhân đôi nỗ lực. Như vậy, điều này rất có thể là cách tiếp cận được thực hiện bởi IsNumeric của VB. Bạn cũng có thể tùy chỉnh các quy tắc phân tích cú pháp thông qua việc liệt kê NumberStyles để cho phép hex, thập phân, tiền tệ và một vài kiểu khác.

Một cách tiếp cận phổ biến khác cho các ứng dụng không dựa trên web là hạn chế đầu vào của hộp văn bản để chỉ chấp nhận các ký tự sẽ được phân tích thành số nguyên.

EDIT: Bạn có thể chấp nhận một loạt lớn các định dạng đầu vào, chẳng hạn như giá trị tiền ("100 $") và số mũ ("1E4"), bằng cách xác định NumberStyles cụ thể:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed)) 
{ ... } 

... hoặc bằng cách cho phép bất kỳ loại định dạng được hỗ trợ:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.Any, CultureInfo.CurrentCulture, out valueParsed)) 
{ ... } 
+0

'IsNumeric' trả về' true' cho các chuỗi như '" 1E2 "' và '" $ 100 "', trong khi 'Int32.TryParse' trả về false cho các chuỗi đó. – phoog

+0

@phoog hành vi mặc định là không hỗ trợ các thông báo khoa học hoặc các giá trị tiền. bạn có thể điều chỉnh hành vi bằng cách đi qua kết hợp các tùy chọn NumberStyles, chẳng hạn như: Int32.TryParse ("1E2", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed). Bạn cũng có thể chỉ định NumberStyles.Any, đó là khả năng những gì IsNumeric VB làm đằng sau hậu trường. – Scott

+1

tất nhiên, nhưng nếu tôi có yêu cầu sao chép chức năng của 'IsNumeric' trong dự án C#, tôi chỉ gọi 'IsNumeric' thay vì viết mã C# mới và cố gắng đảm bảo rằng tôi đã bao quát tất cả các trường hợp góc đúng. – phoog

8

câu trả lời khác đã đề nghị sử dụng TryParse, mà có thể phù hợp với nhu cầu của bạn, nhưng cách an toàn nhất để cung cấp các chức năng của IsNumeric chức năng là để tham khảo các thư viện VB và sử dụngChức năng.

IsNumeric linh hoạt hơn TryParse. Ví dụ: IsNumeric trả về true cho chuỗi "$100", trong khi các phương thức TryParse đều trả về false.

Để sử dụng IsNumeric trong C#, hãy thêm tham chiếu đến Microsoft.VisualBasic.dll. Chức năng là một phương pháp tĩnh của lớp Microsoft.VisualBasic.Information, vì vậy giả sử bạn có using Microsoft.VisualBasic;, bạn có thể làm điều này:

if (Information.IsNumeric(txtMyText.Text.Trim())) //... 
+5

Tôi không chắc rằng tôi muốn kết quả "true" cho '" $ 100 "' là số ?! – cederlof

+4

@cederlof Tôi không chắc chắn bạn sẽ, hoặc là, trừ khi bạn đang cố gắng sao chép chức năng 'IsNumeric' của Visual Basic, được đề cập trong câu hỏi. Hàm đó trả về true cho "$ 100". Nếu bạn đang cố gắng tái tạo hành vi của một thủ tục VBA Excel, ví dụ, do đó bạn sẽ muốn hàm trả về true cho "$ 100" và bạn có thể sẽ sử dụng Microsoft.VisualBasic.dll tốt hơn là viết thay thế của riêng bạn chức năng. – phoog

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