Xác định nếu một chuỗi là một số


731

Nếu tôi có những chuỗi này:

  1. "abc" = = false

  2. "123" = = true

  3. "ab2" = = false

Có một lệnh, như IsNumeric()hoặc một cái gì khác, có thể xác định nếu một chuỗi là một số hợp lệ?


79
từ các ví dụ của họ, bạn có thể thấy chúng có nghĩa nếu toàn bộ chuỗi đại diện cho một số.
Lucas

47
trả về str.All (Char.IsDigit);
Mohsen

13
str.All (Char.IsDigit) sẽ khai báo "3.14" sai cũng như "-2" và "3E14". Không nói về: "0x10"
Harald Coppoolse

4
Nó phụ thuộc vào loại số bạn đang cố kiểm tra. Đối với các số nguyên không có dấu phân cách (tức là chuỗi các chữ số thập phân), kiểm tra này hoạt động và giống như câu trả lời được chấp nhận và câu trả lời được ngụ ý trong OP.
Alex Mazzariol

1
@Lucas cảm ơn bạn đã bình luận của bạn, bạn không có ý tưởng bao lâu tôi đã cố gắng để phân tích một chuỗi kép như một int và tự hỏi tại sao nó đã thất bại ...
Novastorm

Câu trả lời:


1160
int n;
bool isNumeric = int.TryParse("123", out n);

Cập nhật kể từ C # 7:

var isNumeric = int.TryParse("123", out int n);

hoặc nếu bạn không cần số bạn có thể loại bỏ tham số ra

var isNumeric = int.TryParse("123", out _);

Các var s có thể được thay thế bởi các loại tương ứng của họ!


126
Mặc dù vậy, tôi sẽ sử dụng double.TryPude, vì chúng tôi muốn biết liệu nó có đại diện cho một số không.
John Gietzen

5
Hàm sẽ trả về true nếu tôi chuyển chuỗi thành "-123" hoặc "+123". Tôi hiểu rằng số nguyên có giá trị dương và âm. Nhưng nếu chuỗi này đến từ người dùng đã nhập vào hộp văn bản thì nó sẽ trả về false.
2323308

9
Đây là một giải pháp tốt, cho đến khi người dùng nhập một giá trị vượt quá -2,147,483,648 đến 2,147,483,647, và sau đó điều này âm thầm thất bại
BlackTigerX

hãy thử phân tích cú pháp 0,60 (đó là dấu phẩy!) đó là một số không hợp lệ nhưng sẽ được phân tích cú pháp là 60!
Paul Zahra

2
Tôi thích có phương pháp mở rộng cho kiểm tra này: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Hamid Naeemi

350

Điều này sẽ trả về true nếu inputlà tất cả các số. Không biết nó có tốt hơn không TryParse, nhưng nó sẽ hoạt động.

Regex.IsMatch(input, @"^\d+$")

Nếu bạn chỉ muốn biết nếu nó có một hoặc nhiều số được trộn lẫn với các ký tự, hãy bỏ qua ^ +$.

Regex.IsMatch(input, @"\d")

Chỉnh sửa: Trên thực tế tôi nghĩ rằng nó tốt hơn so với TryPude vì một chuỗi rất dài có thể có khả năng tràn qua TryPude.


2
Xây dựng regex một lần và mãi mãi sẽ hiệu quả hơn nhiều.
Clément

2
@CFP +1 ... RegEx luôn tốt hơn các chức năng thông thường, khi áp dụng!
MAXE

19
@MAXE: Tôi không đồng ý. Kiểm tra biểu thức thông thường khá chậm, vì vậy thường có các giải pháp tốt hơn nếu hiệu suất đang được xem xét.
Michal B.

7
chỉnh sửa: bạn có thể thêm RegexOptions.Compileddưới dạng tham số nếu bạn đang chạy hàng nghìn trong số này để tăng tốc độ có thểRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
Simon_Weaver

9
cũng sẽ thất bại về những điều tiêu cực và những điều với.
Noctis

199

Bạn cũng có thể dùng:

stringTest.All(char.IsDigit);

Nó sẽ trả về truecho tất cả các chữ số (không float) và falsenếu chuỗi đầu vào là bất kỳ loại chữ và số nào.

Xin lưu ý : stringTestkhông nên là một chuỗi trống vì điều này sẽ vượt qua bài kiểm tra là số.


20
Điều đó thật ngầu. Một điều cần lưu ý mặc dù: một chuỗi rỗng sẽ vượt qua bài kiểm tra đó dưới dạng số.
dan-gph

2
@ dan-gph: Tôi rất vui, bạn thích nó. Ư, bạn đung. Tôi đã cập nhật ghi chú ở trên. Cảm ơn!
Kunal Goel

1
Điều này cũng không làm việc cho các trường hợp thập phân. Bài kiểm tra đúng sẽ là stringTest.All (l => char.IsDigit (l) || '.' == l || '-' == l);
Salman Hasrat Khan

Cảm ơn Salman đầu vào của bạn, Để kiểm tra cụ thể số thập phân trong chuỗi, bạn có thể tìm kiếm - if (Decimal.TryPude (stringTest2, out value)) {/ * Có, Số thập phân /} khác {/ Không, Không phải là Số thập phân * / }
Kunal Goel

6
Salman, nó không đơn giản - điều này sẽ vượt qua ..--..--như một con số hợp lệ. Rõ ràng không.
Flynn1179

133

Tôi đã sử dụng chức năng này nhiều lần:

public static bool IsNumeric(object Expression)
{
    double retNum;

    bool isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
    return isNum;
}

Nhưng bạn cũng có thể sử dụng;

bool b1 = Microsoft.VisualBasic.Information.IsNumeric("1"); //true
bool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false

Từ tùy chọn điểm chuẩn IsNumeric

văn bản thay thế
(nguồn: aspalliance.com )

văn bản thay thế
(nguồn: aspalliance.com )


80
tham khảo Microsoft.VisualBasic.dll từ ứng dụng C #? eww: P
Lucas

Tôi không có vấn đề gì khi sử dụng "IsNumeric", nó hoạt động tốt. Ngoài ra, bạn có thể thấy rằng có rất ít sự khác biệt về hiệu quả giữa TryPude và IsNumeric. Hãy nhớ rằng TryPude mới ở phiên bản 2.0 và trước đó, tốt hơn là sử dụng IsNumeric cho bất kỳ chiến lược nào khác.
Nelson Miranda

10
Chà, IsNumeric () bên trong của VB.NET sử dụng double.TryPude (), sau một số điều hướng cần thiết (trong số những thứ khác) để tương thích VB6. Nếu bạn không cần khả năng tương thích, double.TryPude () chỉ đơn giản để sử dụng và nó giúp bạn tiết kiệm bộ nhớ bằng cách tải Microsoft.VisualBasic.dll trong quy trình của bạn.
Euro Micelli

4
Lưu ý nhanh: sử dụng biểu thức chính quy sẽ nhanh hơn nhiều nếu bạn quản lý để có máy trạng thái hữu hạn cơ bản được xây dựng một lần và mãi mãi. Nói chung, việc xây dựng máy trạng thái lấy O (2 ^ n) trong đó n là độ dài của regex, trong khi đọc là O (k) trong đó k là độ dài của chuỗi được tìm kiếm. Vì vậy, xây dựng lại regex mỗi lần giới thiệu một thiên vị.
Clément

2
@Lucas Trên thực tế, có một số thứ thực sự tốt trong đó, như trình phân tích cú pháp csv đầy đủ. Không có lý do để không sử dụng nó nếu nó tồn tại trong đó.
Nyerguds

32

Đây có lẽ là lựa chọn tốt nhất trong C #.

Nếu bạn muốn biết nếu chuỗi chứa toàn bộ số (số nguyên):

string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);

Phương thức TryPude sẽ cố gắng chuyển đổi chuỗi thành một số (số nguyên) và nếu thành công, nó sẽ trả về true và đặt số tương ứng trong myInt. Nếu không thể, nó trả về false.

Các giải pháp sử dụng int.Parse(someString)thay thế được hiển thị trong các phản hồi khác hoạt động, nhưng nó chậm hơn nhiều vì ném ngoại lệ rất tốn kém. TryParse(...)đã được thêm vào ngôn ngữ C # trong phiên bản 2 và cho đến lúc đó bạn không có lựa chọn nào khác. Bây giờ bạn làm: do đó bạn nên tránh sự Parse()thay thế.

Nếu bạn muốn chấp nhận số thập phân, lớp thập phân cũng có một .TryParse(...)phương thức. Thay int bằng số thập phân trong phần thảo luận ở trên và áp dụng các nguyên tắc tương tự.


Tại sao TryPude tốt hơn so với việc so sánh tất cả các ký tự với các ký tự nguyên?
jimjim

25

Bạn luôn có thể sử dụng các phương thức TryPude tích hợp cho nhiều kiểu dữ liệu để xem chuỗi trong câu hỏi có vượt qua không.

Thí dụ.

decimal myDec;
var Result = decimal.TryParse("123", out myDec);

Kết quả sau đó = True

decimal myDec;
var Result = decimal.TryParse("abc", out myDec);

Kết quả sau đó = Sai


Tôi nghĩ rằng tôi có thể đã làm điều đó nhiều hơn theo cú pháp kiểu VB so với C #, nhưng các quy tắc tương tự được áp dụng.
TheTXI

22

Trong trường hợp bạn không muốn sử dụng int.Pude hoặc double.Pude, bạn có thể tự cuộn bằng thứ gì đó như thế này:

public static class Extensions
{
    public static bool IsNumeric(this string s)
    {
        foreach (char c in s)
        {
            if (!char.IsDigit(c) && c != '.')
            {
                return false;
            }
        }

        return true;
    }
}

7
Nếu chúng chỉ có nghĩa là số nguyên thì sao? Thế còn địa phương nơi '.' là dấu phân cách nhóm, không phải dấu phẩy (ví dụ pt-Br)? Còn số âm thì sao? dấu phân cách nhóm (dấu phẩy bằng tiếng Anh)? ký hiệu tiền tệ? TryPude () có thể quản lý tất cả những thứ này theo yêu cầu bằng NumberStyles và IFormatProvider.
Lucas

Ooh yeah, tôi thích phiên bản All hơn. Tôi chưa bao giờ thực sự sử dụng phương pháp mở rộng đó, cuộc gọi tốt. Mặc dù nó phải là s.ToCharArray (). All (..). Đối với điểm thứ hai của bạn, tôi nghe thấy bạn, đó là lý do tại sao tôi mở đầu nếu bạn không muốn sử dụng int.Pude .... (mà tôi cho rằng có nhiều chi phí hơn ...)
BFree

11
1.3.3.8.5 không thực sự là một con số, trong khi 1.23E5 là.
Clément

4
logic là thiếu sót. -1
Russel Yang

1
@Lucas Tôi đồng ý rằng TryPude xử lý nhiều hơn, nhưng đôi khi điều đó không cần thiết. Tôi chỉ cần xác thực hộp số thẻ tín dụng của mình (chỉ có thể có chữ số). Giải pháp này gần như chắc chắn nhanh hơn so với thử phân tích cú pháp.
Millie Smith

14

Nếu bạn muốn bắt một dải số rộng hơn, hãy gọi là is_numeric của PHP , bạn có thể sử dụng như sau:

// From PHP documentation for is_numeric
// (http://php.net/manual/en/function.is-numeric.php)

// Finds whether the given variable is numeric.

// Numeric strings consist of optional sign, any number of digits, optional decimal part and optional
// exponential part. Thus +0123.45e6 is a valid numeric value.

// Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but
// only without sign, decimal and exponential part.
static readonly Regex _isNumericRegex =
    new Regex(  "^(" +
                /*Hex*/ @"0x[0-9a-f]+"  + "|" +
                /*Bin*/ @"0b[01]+"      + "|" + 
                /*Oct*/ @"0[0-7]*"      + "|" +
                /*Dec*/ @"((?!0)|[-+]|(?=0+\.))(\d*\.)?\d+(e\d+)?" + 
                ")$" );
static bool IsNumeric( string value )
{
    return _isNumericRegex.IsMatch( value );
}

Bài kiểm tra đơn vị:

static void IsNumericTest()
{
    string[] l_unitTests = new string[] { 
        "123",      /* TRUE */
        "abc",      /* FALSE */
        "12.3",     /* TRUE */
        "+12.3",    /* TRUE */
        "-12.3",    /* TRUE */
        "1.23e2",   /* TRUE */
        "-1e23",    /* TRUE */
        "1.2ef",    /* FALSE */
        "0x0",      /* TRUE */
        "0xfff",    /* TRUE */
        "0xf1f",    /* TRUE */
        "0xf1g",    /* FALSE */
        "0123",     /* TRUE */
        "0999",     /* FALSE (not octal) */
        "+0999",    /* TRUE (forced decimal) */
        "0b0101",   /* TRUE */
        "0b0102"    /* FALSE */
    };

    foreach ( string l_unitTest in l_unitTests )
        Console.WriteLine( l_unitTest + " => " + IsNumeric( l_unitTest ).ToString() );

    Console.ReadKey( true );
}

Hãy nhớ rằng chỉ vì một giá trị là số không có nghĩa là nó có thể được chuyển đổi thành loại số. Ví dụ: "999999999999999999999999999999.9999999999"là một giá trị số hợp lệ hoàn hảo, nhưng nó sẽ không phù hợp với loại số .NET (không phải là một giá trị được xác định trong thư viện chuẩn).


Không cố gắng trở thành một alec thông minh ở đây, nhưng điều này dường như thất bại đối với chuỗi "0". Regex của tôi là không tồn tại. Có một điều chỉnh đơn giản cho điều đó? Tôi nhận được "0" và có thể là "0,0" và thậm chí là "-0.0" là số hợp lệ có thể.
Steve Hibbert

@SteveHibbert - Mọi người đều biết rằng "0" không phải là một con số! Nghiêm túc mà nói ... đã điều chỉnh regex thành khớp 0.
JDB vẫn còn nhớ Monica

Hmmm, là tôi hay "0" vẫn chưa được nhận dạng là số?
Steve Hibbert

1
Vì lười biếng và không biết gì về regex, tôi đã cắt mã ở trên, có vẻ như nó bao gồm thay đổi loại "0,0". Tôi đã chạy thử nghiệm để kiểm tra xem chuỗi "0" đang chạy .IsNumeric () và điều đó trả về sai. Tôi nghĩ rằng bài kiểm tra Octal sẽ trả về giá trị đúng cho bất kỳ thứ gì có hai ký tự số trong đó số thứ nhất bằng 0 (và số thứ hai bằng 0), nhưng sẽ trả về giá trị sai cho chính số 0 cô đơn béo lớn. Nếu bạn kiểm tra "0", với mã ở trên, bạn có bị sai không? Xin lỗi, nếu tôi biết nhiều regex hơn, tôi có thể đưa ra phản hồi tốt hơn. Phải đọc lên.
Steve Hibbert

1
! Đừng! Chỉ cần đọc lại bình luận của bạn ở trên, tôi đã bỏ lỡ dấu hoa thị bổ sung, tôi chỉ cập nhật dòng thập phân. Với vị trí đó, bạn đã đúng, "0" IsNumeric. Xin lỗi vì sự cố gắng và cảm ơn rất nhiều về bản cập nhật, hy vọng nó cũng giúp ích cho những người khác. Nhiều nghĩa vụ.
Steve Hibbert

14

Tôi biết đây là một chủ đề cũ, nhưng không có câu trả lời nào thực sự làm điều đó cho tôi - hoặc không hiệu quả, hoặc không được gói gọn để dễ sử dụng lại. Tôi cũng muốn đảm bảo nó trả về false nếu chuỗi rỗng hoặc null. TryPude trả về true trong trường hợp này (một chuỗi rỗng không gây ra lỗi khi phân tích cú pháp dưới dạng số). Vì vậy, đây là phương pháp mở rộng chuỗi của tôi:

public static class Extensions
{
    /// <summary>
    /// Returns true if string is numeric and not empty or null or whitespace.
    /// Determines if string is numeric by parsing as Double
    /// </summary>
    /// <param name="str"></param>
    /// <param name="style">Optional style - defaults to NumberStyles.Number (leading and trailing whitespace, leading and trailing sign, decimal point and thousands separator) </param>
    /// <param name="culture">Optional CultureInfo - defaults to InvariantCulture</param>
    /// <returns></returns>
    public static bool IsNumeric(this string str, NumberStyles style = NumberStyles.Number,
        CultureInfo culture = null)
    {
        double num;
        if (culture == null) culture = CultureInfo.InvariantCulture;
        return Double.TryParse(str, style, culture, out num) && !String.IsNullOrWhiteSpace(str);
    }
}

Đơn giản để sử dụng:

var mystring = "1234.56789";
var test = mystring.IsNumeric();

Hoặc, nếu bạn muốn kiểm tra các loại số khác, bạn có thể chỉ định 'kiểu'. Vì vậy, để chuyển đổi một số có số mũ, bạn có thể sử dụng:

var mystring = "5.2453232E6";
var test = mystring.IsNumeric(style: NumberStyles.AllowExponent);

Hoặc để kiểm tra chuỗi Hex tiềm năng, bạn có thể sử dụng:

var mystring = "0xF67AB2";
var test = mystring.IsNumeric(style: NumberStyles.HexNumber)

Tham số 'văn hóa' tùy chọn có thể được sử dụng theo nhiều cách giống nhau.

Nó bị hạn chế do không thể chuyển đổi các chuỗi quá lớn để được chứa trong một đôi, nhưng đó là một yêu cầu hạn chế và tôi nghĩ rằng nếu bạn đang làm việc với các số lớn hơn số này, thì có lẽ bạn sẽ cần xử lý số chuyên biệt bổ sung chức năng nào.


2
Hoạt động rất tốt, ngoại trừ Double.TryPude không hỗ trợ NumberStyles.HexNumber. Xem MSDN Double.TryPude. Bất kỳ lý do nào khiến bạn dùng thử trước khi kiểm tra IsNullOrWhiteSpace? TryPude trả về false nếu IsNullOrWhiteSpace không?
Harald Coppoolse

10

Bạn có thể sử dụng TryPude để xác định xem chuỗi có thể được phân tích thành một số nguyên hay không.

int i;
bool bNum = int.TryParse(str, out i);

Boolean sẽ cho bạn biết nếu nó hoạt động hay không.


9

Nếu bạn muốn kiểm tra xem một chuỗi có phải là một số không (tôi giả sử đó là một chuỗi vì nếu đó là một số, duh, bạn biết đó là một chuỗi).

  • Không có regex và
  • sử dụng mã của Microsoft càng nhiều càng tốt

bạn cũng có thể làm:

public static bool IsNumber(this string aNumber)
{
     BigInteger temp_big_int;
     var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
     return is_number;
}

Điều này sẽ chăm sóc các món ngon thông thường:

  • Trừ (-) hoặc Plus (+) khi bắt đầu
  • chứa ký tự thập phânBigIntegers sẽ không phân tích các số có dấu thập phân. (Vì vậy: BigInteger.Parse("3.3")sẽ đưa ra một ngoại lệ và TryParsetương tự sẽ trả về false)
  • không có chữ số buồn cười
  • bao gồm các trường hợp số lượng lớn hơn sử dụng thông thường của Double.TryParse

Bạn sẽ phải thêm một tài liệu tham khảo System.Numericsvà có using System.Numerics;trên đầu lớp của bạn (tốt, thứ hai là một phần thưởng tôi đoán :)


8

Tôi đoán câu trả lời này sẽ bị mất ở giữa tất cả những người khác, nhưng dù sao, ở đây đi.

Tôi đã kết thúc câu hỏi này thông qua Google vì tôi muốn kiểm tra xem có phải stringnumericvì vậy tôi chỉ có thể sử dụng double.Parse("123")thay vì TryParse()phương pháp.

Tại sao? Bởi vì thật khó chịu khi phải khai báo một outbiến và kiểm tra kết quả TryParse()trước khi bạn biết liệu phân tích có thất bại hay không. Tôi muốn sử dụng ternary operatorđể kiểm tra nếu stringnumericalvà sau đó chỉ phân tích nó trong biểu thức ternary đầu tiên hoặc cung cấp một giá trị mặc định trong biểu thức ternary thứ hai.

Như thế này:

var doubleValue = IsNumeric(numberAsString) ? double.Parse(numberAsString) : 0;

Nó chỉ sạch sẽ hơn nhiều so với:

var doubleValue = 0;
if (double.TryParse(numberAsString, out doubleValue)) {
    //whatever you want to do with doubleValue
}

Tôi đã làm một vài extension methodscho những trường hợp này:


Phương pháp mở rộng một

public static bool IsParseableAs<TInput>(this string value) {
    var type = typeof(TInput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return false;

    var arguments = new[] { value, Activator.CreateInstance(type) };
    return (bool) tryParseMethod.Invoke(null, arguments);
}

Thí dụ:

"123".IsParseableAs<double>() ? double.Parse(sNumber) : 0;

Bởi vì IsParseableAs()cố gắng phân tích chuỗi là loại thích hợp thay vì chỉ kiểm tra xem chuỗi có "số" hay không, nên nó khá an toàn. Và bạn thậm chí có thể sử dụng nó cho các loại không có số có một TryParse()phương thức, như DateTime.

Phương thức này sử dụng sự phản chiếu và cuối cùng bạn gọi TryParse()phương thức đó hai lần, tất nhiên, không hiệu quả, nhưng không phải mọi thứ đều phải được tối ưu hóa hoàn toàn, đôi khi sự tiện lợi chỉ quan trọng hơn.

Phương pháp này cũng có thể được sử dụng để dễ dàng phân tích một danh sách các chuỗi số thành một danh sách doublehoặc một số loại khác có giá trị mặc định mà không phải bắt bất kỳ trường hợp ngoại lệ nào:

var sNumbers = new[] {"10", "20", "30"};
var dValues = sNumbers.Select(s => s.IsParseableAs<double>() ? double.Parse(s) : 0);

Phương pháp mở rộng hai

public static TOutput ParseAs<TOutput>(this string value, TOutput defaultValue) {
    var type = typeof(TOutput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return defaultValue;

    var arguments = new object[] { value, null };
    return ((bool) tryParseMethod.Invoke(null, arguments)) ? (TOutput) arguments[1] : defaultValue;
}

Phương thức tiện ích mở rộng này cho phép bạn phân tích cú pháp stringnhư bất kỳ phương thức nào typeTryParse()phương thức và nó cũng cho phép bạn chỉ định giá trị mặc định để trả về nếu chuyển đổi không thành công.

Điều này tốt hơn so với việc sử dụng toán tử ternary với phương thức mở rộng ở trên vì nó chỉ thực hiện chuyển đổi một lần. Nó vẫn sử dụng sự phản chiếu mặc dù ...

Ví dụ:

"123".ParseAs<int>(10);
"abc".ParseAs<int>(25);
"123,78".ParseAs<double>(10);
"abc".ParseAs<double>(107.4);
"2014-10-28".ParseAs<DateTime>(DateTime.MinValue);
"monday".ParseAs<DateTime>(DateTime.MinValue);

Đầu ra:

123
25
123,78
107,4
28.10.2014 00:00:00
01.01.0001 00:00:00

4
Tôi tin rằng bạn có thể đã phát minh ra một trong những cách tiếp cận kém hiệu quả nhất mà tôi từng thấy. Bạn không chỉ phân tích cú pháp chuỗi hai lần (trong trường hợp nó có thể phân tích cú pháp), bạn cũng đang gọi các hàm phản chiếu nhiều lần để thực hiện. Và cuối cùng, bạn thậm chí không lưu bất kỳ tổ hợp phím nào bằng phương pháp tiện ích mở rộng.
JDB vẫn còn nhớ Monica

Cảm ơn bạn chỉ lặp lại những gì tôi đã viết cho mình trong đoạn thứ hai đến đoạn cuối. Ngoài ra, nếu bạn lấy ví dụ cuối cùng của tôi vào tài khoản, bạn chắc chắn lưu tổ hợp phím bằng phương pháp tiện ích mở rộng này. Câu trả lời này không tự nhận là một loại giải pháp kỳ diệu cho bất kỳ vấn đề nào, nó chỉ là một ví dụ mã. Sử dụng nó, hoặc không sử dụng nó. Tôi nghĩ rằng nó thuận tiện khi sử dụng đúng. Và nó bao gồm các ví dụ về cả phương pháp mở rộng và phản xạ, có lẽ ai đó có thể học hỏi từ nó.
Hein Andre Grønnestad

5
Bạn đã thử var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;chưa
JDB vẫn còn nhớ Monica

2
Vâng, và nó không hoạt động. Argument 2 must be passed with the 'out' keywordvà nếu bạn chỉ định outcũng như newbạn nhận được A ref or out argument must be an assignable variable.
Hein Andre Grønnestad

1
Hiệu suất TryPude tốt hơn tất cả được trình bày ở đây. Kết quả: TryPude 8 Regex 20 PHP IsNumeric 30 Reflection TryPude
prampe

7

Nếu bạn muốn biết nếu một chuỗi là một số, bạn luôn có thể thử phân tích cú pháp chuỗi đó:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

Lưu ý rằng TryParsetrả về a bool, mà bạn có thể sử dụng để kiểm tra xem phân tích cú pháp của bạn có thành công hay không.



4

CẬP NHẬT Kunal Noel Trả lời

stringTest.All(char.IsDigit);
// This returns true if all characters of the string are digits.

Nhưng, trong trường hợp này, chúng ta có các chuỗi trống sẽ vượt qua bài kiểm tra đó, vì vậy, bạn có thể:

if (!string.IsNullOrEmpty(stringTest) && stringTest.All(char.IsDigit)){
   // Do your logic here
}

4

Giải pháp linh hoạt tốt nhất với chức năng tích hợp .net được gọi là- char.IsDigit. Nó hoạt động với số lượng dài không giới hạn. Nó sẽ chỉ trả về true nếu mỗi ký tự là một số. Tôi đã sử dụng nó rất nhiều lần mà không có vấn đề gì và giải pháp dễ dàng sạch hơn tôi từng tìm thấy. Tôi đã thực hiện một phương thức ví dụ. Tôi đã sẵn sàng để sử dụng. Ngoài ra, tôi đã thêm xác nhận cho đầu vào null và trống. Vì vậy, phương pháp bây giờ là hoàn toàn chống đạn

public static bool IsNumeric(string strNumber)
    {
        if (string.IsNullOrEmpty(strNumber))
        {
            return false;
        }
        else
        {
            int numberOfChar = strNumber.Count();
            if (numberOfChar > 0)
            {
                bool r = strNumber.All(char.IsDigit);
                return r;
            }
            else
            {
                return false;
            }
        }
    }

2

Với c # 7, bạn có thể nội tuyến biến ra:

if(int.TryParse(str, out int v))
{
}

2

Sử dụng các phương thức mở rộng này để phân biệt rõ ràng giữa kiểm tra xem chuỗi có phải là số không và nếu chuỗi chỉ chứa 0-9 chữ số

public static class ExtensionMethods
{
    /// <summary>
    /// Returns true if string could represent a valid number, including decimals and local culture symbols
    /// </summary>
    public static bool IsNumeric(this string s)
    {
        decimal d;
        return decimal.TryParse(s, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out d);
    }

    /// <summary>
    /// Returns true only if string is wholy comprised of numerical digits
    /// </summary>
    public static bool IsNumbersOnly(this string s)
    {
        if (s == null || s == string.Empty)
            return false;

        foreach (char c in s)
        {
            if (c < '0' || c > '9') // Avoid using .IsDigit or .IsNumeric as they will return true for other characters
                return false;
        }

        return true;
    }
}

2
public static bool IsNumeric(this string input)
{
    int n;
    if (!string.IsNullOrEmpty(input)) //.Replace('.',null).Replace(',',null)
    {
        foreach (var i in input)
        {
            if (!int.TryParse(i.ToString(), out n))
            {
                return false;
            }

        }
        return true;
    }
    return false;
}

1

Hi vọng điêu nay co ich

string myString = "abc";
double num;
bool isNumber = double.TryParse(myString , out num);

if isNumber 
{
//string is number
}
else
{
//string is not a number
}

0

Kéo tham chiếu đến Visual Basic trong dự án của bạn và sử dụng phương thức Information.IsNumeric của nó như hiển thị bên dưới và có thể chụp các số float cũng như các số nguyên không giống như câu trả lời ở trên chỉ bắt được ints.

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

    if (Information.IsNumeric(txt))
        Console.WriteLine ("Numeric");

IsNumeric("12.3"); // true
IsNumeric("1"); // true
IsNumeric("abc"); // false

Một vấn đề tiềm năng với cách tiếp cận này là IsNumericphân tích ký tự của chuỗi. Vì vậy, một số like 9999999999999999999999999999999999999999999999999999999999.99999999999sẽ đăng ký là True, mặc dù không có cách nào để biểu diễn số này bằng cách sử dụng một loại số tiêu chuẩn.
JDB vẫn còn nhớ Monica

0

Hãy thử các chế độ dưới đây

new Regex(@"^\d{4}").IsMatch("6")    // false
new Regex(@"^\d{4}").IsMatch("68ab") // false
new Regex(@"^\d{4}").IsMatch("1111abcdefg") ```

0

Tất cả các câu trả lời là hữu ích. Nhưng trong khi tìm kiếm một giải pháp trong đó giá trị Số là 12 chữ số trở lên (trong trường hợp của tôi), sau đó trong khi gỡ lỗi, tôi thấy giải pháp sau hữu ích:

double tempInt = 0;
bool result = double.TryParse("Your_12_Digit_Or_more_StringValue", out tempInt);

Biến kết quả sẽ cho bạn đúng hay sai.



-7
//To my knowledge I did this in a simple way
static void Main(string[] args)
{
    string a, b;
    int f1, f2, x, y;
    Console.WriteLine("Enter two inputs");
    a = Convert.ToString(Console.ReadLine());
    b = Console.ReadLine();
    f1 = find(a);
    f2 = find(b);

    if (f1 == 0 && f2 == 0)
    {
        x = Convert.ToInt32(a);
        y = Convert.ToInt32(b);
        Console.WriteLine("Two inputs r number \n so that addition of these text box is= " + (x + y).ToString());
    }
    else
        Console.WriteLine("One or two inputs r string \n so that concatenation of these text box is = " + (a + b));
    Console.ReadKey();
}

static int find(string s)
{
    string s1 = "";
    int f;
    for (int i = 0; i < s.Length; i++)
       for (int j = 0; j <= 9; j++)
       {
           string c = j.ToString();
           if (c[0] == s[i])
           {
               s1 += c[0];
           }
       }

    if (s == s1)
        f = 0;
    else
        f = 1;

    return f;
}

1
Bốn downvote, nhưng không ai nói tại sao? Tôi đoán đó là vì TryPude / Parse sẽ là một lựa chọn tốt hơn, nhưng không phải ai đến đây cũng sẽ biết điều đó.
njplumridge

2
Bạn đã làm cho nó phức tạp đến mức ngay cả lập trình viên C cũng sẽ nói "trời ạ, phải có một cách dễ dàng hơn để viết điều đó"
Ch3shire

1. Không có lý do để đọc số HAI từ bảng điều khiển và thêm chúng. Trường hợp chuỗi đến từ đâu là không liên quan, vì vậy không có lý do để đọc bất cứ điều gì từ bảng điều khiển cả.
Algoman

2. Biến cho f là không cần thiết, bạn có thể trả về 0 hoặc 1 trực tiếp - nếu bạn muốn trả về một lần duy nhất, bạn có thể sử dụng toán tử ternary cho điều đó. int cũng là kiểu trả về sai cho find, nó phải là bool và bạn có thể trả về s == s1
Algoman

3. bạn sao chép các chữ số của s thành s1 và sau đó so sánh s với s1. Điều này là chậm hơn nhiều so với nó cần phải được. Ngoài ra tại sao bạn tiếp tục vòng lặp bên trong ngay cả khi c [0] == s [i] đã xảy ra? Bạn có mong đợi s [i] cũng bằng các chữ số khác không?
Algoman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.