سؤال

لدي سلسلة وأريد التحقق من أنها تتكون من أرقام فقط.لا أريد حقًا (أو أحتاج إلى) تحليله أو أي شيء، أريد فقط أن أعرف أنه لا يحتوي على أي شيء سوى أرقام (ولا يوجد فاصل عائم أيضًا، مجرد أرقام).

لدى PHP هذه الوظيفة الرائعة التي تسمى ctype_digit.هل يوجد أي شيء مشابه لـ C# في أي مكان في .Net Framework؟أو هل أحتاج إلى استخدام تعبير عادي أو شيء من هذا القبيل؟

سيكون إنشاء تعبير عادي لهذا بالطبع أمرًا بسيطًا جدًا، ولكني أرغب في عدم استخدامه إذا كانت هناك طرق أفضل :p

هل كانت مفيدة؟

المحلول 2

والجواب من @ برونو كوندي جعلني أفكر في هذا: D

if(subject.All(char.IsDigit))
    // Do something

ويمكن أن أصدق أنني لم يفكر به من قبل ...

نصائح أخرى

هل يمكن استخدام int.TryParse . فإنه سيعود صحيح إذا تمثل سلسلة الموردة رقم صحيح، كاذبة خلاف ذلك. لا تنسى أن استخدام NumerStyles.None عدم السماح مسافات فارغة وبالإضافة إلى / ناقص علامة.

<القوي> UPDATE : لوempi يقول، وليس هذا العمل لسلاسل كبيرة جدا. إذا كان لديك سلاسل كبيرة بشكل تعسفي، وربما التعابير المنطقية هو الخيار الوحيد. هل يمكن أن تفعل شيئا من هذا القبيل Regex.IsMatch(theString,"^[0-9]+$")

bool onlyDigits = "1234".All(c => char.IsDigit(c));

وبدا لي، وكنت أفضل أن يكون لاستخدام التعابير المنطقية للقيام بهذه المهمة نيابة عنك ... "\ د +" ينبغي أن نفعل ذلك ... حسنا، قلت لك لا أريد أن استخدامه ... ولكنها مضمونة طريقة لضمان سلسلة تحتوي على أرقام فقط، ثم إذا كان يمر التعبير العادي، ثم يمكنك استخدام int.Parse (...) على الفور.

نعم، يمكنك استخدام

bool Int32.TryParse(string s, out int result);

ونموذج التعليمات البرمجية:

string myString = "1265";
int myInt;

if (Int32.TryParse(myString,myInt) // Returns true if mystring contains only digits
{
...
}

والخيار الآخر هو استخدام التعبيرات المنتظمة:

    public static bool IsDigit(string myString)
    {
        string pattern = @"^\d*$";

        if (Regex.IsMatch(myString, pattern))
            return true;
        else
            return false;
    }

يمكنك تغيير نمط وفقا لمتطلباتكم.

لا يوجد أي المدمج في الأسلوب. سوف Int32.TryParse أو Int64.TryParse لا عمل سلاسل طويلة جدا تحتوي على أرقام عادلة (كما انها قد تسمح حرف الأخرى المستخدمة لتمثيل صحيح أرقام).

كما قال أشخاص آخرون، يمكنك استخدام int.TryParse الطريقة، على الرغم من أنه ما لم يكن رقمك كبيرًا جدًا حقًا، فيمكنك استخدام TryParse طريقة الأنواع الأخرى، التي لها نطاق أكبر من طريقة int32.(بالطبع باستخدام NumberStyles.None الخيار، لتجنب العلامات وعلامات الترقيم).

وهنا الانهيار:

  1. int -2,147,483,648 .. 2,147,483,647
  2. uint 0 .. 4,294,967,295
  3. long -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807
  4. ulong 0 .. 18,446,744,073,709,551,615
  5. float -3.402823e38 ..3.402823e38
  6. double -1.79769313486232e308 ..1.79769313486232e308
  7. decimal -79228162514264337593543950335 .. 79228162514264337593543950335

الشخص الذي يمكنه تحليل أكبر الأرقام هو Double.إذا كنت بحاجة إلى استخدام الرقم، فسوف تفقد بعض الدقة، لكنه يمكنه تحليل أرقام طويلة جدًا (على الرغم من أنك تقول أنك لا تحتاج إلى استخدامه لذلك لا ينبغي أن يكون ذلك مشكلة).في اختبار سريع قمت به، تمكنت من تحليل السلسلة التالية بنجاح:

79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423

(هذا 308 حرفًا، سيفشل مع رقم آخر)

ومع ذلك، إذا كنت لن تستخدم الرقم، فقد يكون ذلك مبالغة، لذا سأختار Regex، أو حتى أفضل من ذلك، التحقق من أن كل حرف هو رقم.

إذا كنت تريد أن تصبح مجنونًا بعض الشيء، فيمكنك تقسيم ذلك إلى عدة سلاسل أصغر، واستخدام مكتبة المهام للتحقق منها بطريقة متوازية: P

(أعلم أن الأمر خارج عن الموضوع قليلاً الآن، ولكن إذا كنت تريد القيام بذلك، فيجب عليك التحقق parallel.for و ال Partition Ranger, ، تحقق من مقطع C9 الذي تبلغ مدته 10 دقائق: بالتوازي مع حارس التقسيم )

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top