تحويل الأعداد الصحيحة إلى أرقام مكتوبة في C#

هل سبق ووجدت نفسك بحاجة إلى تحويل الأعداد الصحيحة إلى شكلها المكتوب؟ هذه حاجة شائعة في تطبيقات مختلفة، مثل إعداد التقارير، أو كتابة الشيكات، أو ببساطة لجعل الأعداد أسهل قراءة في المحتوى النصي. على سبيل المثال، قد تحتاج إلى تحويل العدد 21 إلى "واحد وعشرون".

ولكن ماذا لو كنت تبحث عن حل لا يعتمد على جدول بحث ضخم؟ في هذه التدوينة، سوف نستكشف طريقة نظيفة وفعالة في C# لتحويل الأعداد الصحيحة إلى أرقام مكتوبة.

المشكلة

لتحويل الأعداد الصحيحة إلى شكل مكتوب، يلجأ العديد من المطورين عادةً إلى استخدام جداول بحث كبيرة، مما يمكن أن يكون مرهقًا وصعب الصيانة. بالمقابل، سوف نستكشف حلاً أكثر أناقة باستخدام معالجة السلاسل الأساسية والعودة العودية.

الحل

يمكننا تحقيق هدفنا من خلال استخدام فصل مخصص يستخدم مصفوفات لتصنيف الأعداد ووظيفة عودية لبناء الشكل المكتوب بشكل تدريجي. لنقسمها خطوة بخطوة.

فصل HumanFriendlyInteger

الفصل التالي يحتوي على الطريقة لتحويل الأعداد الصحيحة إلى نظائرها المكتوبة:

public static class HumanFriendlyInteger
{
    static string[] ones = new string[] { "", "واحد", "اثنان", "ثلاثة", "أربعة", "خمسة", "ستة", "سبعة", "ثمانية", "تسعة" };
    static string[] teens = new string[] { "عشرة", "أحد عشر", "اثنا عشر", "ثلاثة عشر", "أربعة عشر", "خمسة عشر", "ستة عشر", "سبعة عشر", "ثمانية عشر", "تسعة عشر" };
    static string[] tens = new string[] { "عشرون", "ثلاثون", "أربعون", "خمسون", "ستون", "سبعون", "ثمانون", "تسعون" };
    static string[] thousandsGroups = { "", " ألف", " مليون", " مليار" };

    private static string FriendlyInteger(int n, string leftDigits, int thousands)
    {
        // معالجة حالات خاصة بناءً على قيمة العدد
        if (n == 0)
        {
            return leftDigits;
        }

        string friendlyInt = leftDigits;

        if (friendlyInt.Length > 0)
        {
            friendlyInt += " ";
        }

        if (n < 10)
        {
            friendlyInt += ones[n];
        }
        else if (n < 20)
        {
            friendlyInt += teens[n - 10];
        }
        else if (n < 100)
        {
            friendlyInt += FriendlyInteger(n % 10, tens[n / 10 - 2], 0);
        }
        else if (n < 1000)
        {
            friendlyInt += FriendlyInteger(n % 100, (ones[n / 100] + " مئة"), 0);
        }
        else
        {
            friendlyInt += FriendlyInteger(n % 1000, FriendlyInteger(n / 1000, "", thousands + 1), 0);
            if (n % 1000 == 0)
            {
                return friendlyInt;
            }
        }

        return friendlyInt + thousandsGroups[thousands];
    }

    public static string IntegerToWritten(int n)
    {
        if (n == 0)
        {
            return "صفر";
        }
        else if (n < 0)
        {
            return "سلبي " + IntegerToWritten(-n);
        }

        return FriendlyInteger(n, "", 0);
    }
}

تحليل الكود

  • مصفوفات ثابتة: يستخدم الفصل أربعة مصفوفات ثابتة لتخزين الأشكال المكتوبة للأعداد:

    • ones: تحتوي على الكلمات للأعداد من 1 إلى 9.
    • teens: تحتوي على الكلمات للأعداد من 10 إلى 19.
    • tens: تحتوي على الكلمات للضربات العشرية (20، 30، إلخ).
    • thousandsGroups: تحتوي على الكلمات للقيم الأعلى مثل ألف، مليون، إلخ.
  • دالة FriendlyInteger: هذه الدالة العودية تقوم بتفكيك العدد إلى أجزاء قابلة للإدارة:

    • تتعامل مع تكوين الأعداد بناءً على أحجامها (آحاد، عشرات، مئات، وآلاف).
    • كل استدعاء يبني تمثيل السلسلة بشكل عودي من خلال التحقق من الفئة التي يقع فيها العدد.
  • دالة IntegerToWritten: هذه هي الطريقة العامة لتحويل الأعداد الصحيحة. تتعامل مع الأعداد صفر وسلبية قبل استدعاء دالة FriendlyInteger.

الخلاصة

باستخدام هذه الطريقة، يمكنك تحويل الأعداد الصحيحة إلى شكلها المكتوب بكفاءة في C#. هذا الحل ليس أنيقًا فحسب، بل يتجنب أيضًا عناء صيانة جداول البحث الواسعة.

في المرة التالية التي تحتاج فيها إلى عرض الأعداد في نص، جرب هذا النهج واستمتع بالنتائج النظيفة والودية للإنسان!