تُعدّ عملية التحقق من صحة تمثيل سلسلة نصية لرقم مهمة متكررة في تطوير تطبيقات C#. تستعرض هذه المقالة عدة طرق فعالة، مع مقارنة نقاط القوة والضعف لكل منها لمساعدتك في اختيار الطريقة الأنسب لاحتياجاتك المحددة.
محتويات
- استخدام التعابير النمطية (
Regex.IsMatch()
) - استخدام طرق
TryParse()
- استخدام LINQ (
Enumerable.All()
) - التحقق اليدوي حرفًا بحرف (حلقة
foreach
)
استخدام التعابير النمطية (Regex.IsMatch()
)
تُقدم التعابير النمطية حلاً مرنًا وقويًا للتحقق من صحة أنماط السلاسل النصية. تتيح لك طريقة Regex.IsMatch()
تعريف نمط لمطابقته مع سلسلة الإدخال الخاصة بك. هذه الطريقة فعالة بشكل عام وتتعامل مع مجموعة واسعة من صيغ الأعداد.
using System;
using System.Text.RegularExpressions;
public class StringNumberValidator
{
public static bool IsNumber(string str)
{
// نمط لمطابقة الأعداد الصحيحة، والأعداد ذات الفاصلة العشرية (بما في ذلك القيم السالبة)
return Regex.IsMatch(str, @"^-?d+(.d+)?$");
}
public static void Main(string[] args)
{
Console.WriteLine(IsNumber("123")); // True
Console.WriteLine(IsNumber("123.45")); // True
Console.WriteLine(IsNumber("-123")); // True
Console.WriteLine(IsNumber("-123.45")); // True
Console.WriteLine(IsNumber("123a")); // False
Console.WriteLine(IsNumber("")); // False
}
}
يمكنك تعديل التعبير النمطي لاستيعاب صيغ أرقام محددة (مثل: الأعداد الصحيحة فقط، أو الأعداد ذات عدد محدود من المنازل العشرية). وهذا يجعلها قابلة للتكيف بدرجة عالية مع المتطلبات المختلفة.
استخدام طرق TryParse()
تحاول طرق TryParse()
(مثل int.TryParse()
، و double.TryParse()
، و decimal.TryParse()
) تحليل السلسلة النصية إلى نوع رقمي. ترجع true
إذا نجحت و false
بخلاف ذلك. هذه طريقة مباشرة وفعالة في كثير من الأحيان، خاصة عندما تعرف النوع الرقمي المتوقع.
using System;
public class StringNumberValidator
{
public static bool IsInteger(string str)
{
int number;
return int.TryParse(str, out number);
}
public static bool IsDouble(string str)
{
double number;
return double.TryParse(str, out number);
}
public static void Main(string[] args)
{
Console.WriteLine(IsInteger("123")); // True
Console.WriteLine(IsDouble("123.45")); // True
Console.WriteLine(IsInteger("-123")); // True
Console.WriteLine(IsInteger("123a")); // False
Console.WriteLine(IsInteger("")); // False
}
}
اختر طريقة TryParse()
المناسبة بناءً على النوع الرقمي المتوقع لسلسلة الإدخال الخاصة بك.
استخدام LINQ (Enumerable.All()
)
يوفر Enumerable.All()
في LINQ طريقة موجزة للتحقق مما إذا كانت جميع الأحرف في سلسلة نصية تستوفي شرطًا معينًا. ومع ذلك، فإن هذه الطريقة تقتصر على الأعداد الصحيحة الموجبة بدون فاصلات عشرية أو علامات سالبة.
using System;
using System.Linq;
public class StringNumberValidator
{
public static bool IsPositiveInteger(string str)
{
return !string.IsNullOrEmpty(str) && str.All(char.IsDigit);
}
public static void Main(string[] args)
{
Console.WriteLine(IsPositiveInteger("123")); // True
Console.WriteLine(IsPositiveInteger("123.45")); // False
Console.WriteLine(IsPositiveInteger("-123")); // False
Console.WriteLine(IsPositiveInteger("")); // False
}
}
هذه الطريقة بسيطة وفعالة في نطاقها المحدود، لكنها تفتقر إلى تنوع الطرق الأخرى.
التحقق اليدوي حرفًا بحرف (حلقة foreach
)
يوفر النهج اليدوي أقصى قدر من التحكم، ولكنه عادةً ما يكون أقل كفاءة وأكثر عرضة للأخطاء. ستقوم بالتكرار عبر السلسلة، والتحقق من كل حرف للتأكد من أنه رقم، أو فاصلة عشرية، أو علامة ناقص (إذا سُمح بذلك) في الموضع الصحيح.
using System;
public class StringNumberValidator
{
public static bool IsNumberManual(string str)
{
if (string.IsNullOrEmpty(str)) return false;
bool hasDecimal = false;
bool hasSign = false;
foreach (char c in str)
{
if (c == '-' && !hasSign && str.IndexOf(c) == 0)
{
hasSign = true;
continue;
}
if (c == '.')
{
if (hasDecimal) return false;
hasDecimal = true;
continue;
}
if (!char.IsDigit(c)) return false;
}
return true;
}
public static void Main(string[] args)
{
Console.WriteLine(IsNumberManual("123")); // True
Console.WriteLine(IsNumberManual("123.45")); // True
Console.WriteLine(IsNumberManual("-123")); // True
Console.WriteLine(IsNumberManual("-123.45")); // True
Console.WriteLine(IsNumberManual("123a")); // False
Console.WriteLine(IsNumberManual("")); // False
Console.WriteLine(IsNumberManual("--123")); //False
Console.WriteLine(IsNumberManual("12.3.4")); //False
}
}
على الرغم من أن هذا يوفر أقصى قدر من التحكم، إلا أنه يُنصح عمومًا باستخدام الطرق الأكثر إيجازًا وفعالية المذكورة سابقًا ما لم تكن لديك متطلبات تحقق صحة محددة للغاية.
باختصار، يعتمد النهج الأمثل على احتياجاتك. توفر Regex.IsMatch()
حلاً قوياً ومرنًا لمعظم السيناريوهات، بينما TryParse()
فعالة للتحقق من صحة الأعداد الصحيحة أو الأعداد ذات الفاصلة العشرية البسيطة. نادراً ما تُفضّل طرق LINQ والحلقة اليدوية نظرًا لقيودها.