«الأصفار المفقودة»: لماذا لا يخزن Int الأصفار البادئة وكيف تتعايش مع هذا؟
\n\nهل سبق لك أن حاولت عرض الرقم 007 على الشاشة وحصلت على 7 فقط؟ ألم مألوف؟ مرحبًا بك في نادي مطوري Swift الذين يواجهون عاجلاً أم آجلاً السؤال: «كيف أضيف أصفارًا بادئة إلى Int؟».
هذا السؤال على Stack Overflow حصد آلاف المشاهدات، وهذا ليس مستغربًا. تبدو المهمة بسيطة - عرض رقم الطلب كـ «001234» بدلاً من «1234»، أو إظهار الوقت كـ «09:05» بدلاً من «9:5». لكن Swift، كونه لغة شديدة التحديد للأنواع، يفصل بين مفهوم «الرقم» و«تمثيله النصي». Int هو كيان رياضي. 007 بالنسبة له هو ببساطة 7. تُفقد الأصفار البادئة أثناء التهيئة.
في هذه المقالة، سنستعرض جميع المناهج الرئيسية لحل هذه المشكلة. ستتعلم كيفية تنسيق الأعداد الصحيحة بشكل صحيح، وأي طريقة تختار لمهام مختلفة، وكيف لا تقع في فخ الأداء. سننتقل من أقنعة السلاسل النصية البسيطة إلى NumberFormatter القوي من Foundation. هيا بنا!
لماذا لا يستطيع Int تخزين «001»؟ نبذة مختصرة
\n\nقبل الغوص في الكود، دعنا نفهم طبيعة الظاهرة. Int في Swift هو عدد صحيح ذو إشارة 64 بت (أو 32 بت على الأجهزة القديمة). تمثيله الداخلي هو كود ثنائي. الصفر على اليسار ليس له معنى رياضي.
let number = 007 // خطأ؟ لا!\nprint(number) // سيُظهر: 7\n\nمترجم Swift لن يسمح لك حتى بكتابة 007 في الكود (إلا إذا كان حرفًا حرفيًا في النظام الثماني، ولكن هناك البادئة 0o). الخلاصة: الأصفار البادئة هي مشكلة تنسيق، وليست مشكلة تخزين بيانات. نحن نحل المشكلة على مستوى التمثيل (واجهة المستخدم، التسجيل، التصدير).
الطريقة رقم 1: الكلاسيكية - String(format:)
\n\nالإجابة الأكثر شيوعًا على Stack Overflow هي استخدام الدالة String(format:)، الموروثة من Objective-C (عبر الجسر مع NSString). هذه طريقة سريعة وموجزة.
مثال: إضافة 3 أصفار بادئة
\n\nlet number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"\n\nالمُحدد %04d يعني:
- \n
%- بداية المُحدد؛ \n 0- ملء المواضع الفارغة بالأصفار، وليس بالمسافات؛ \n 4- الحد الأدنى لعرض الحقل (4 أحرف)؛ \n d- عدد صحيح عشري (Int). \n
إذا كان الرقم أطول من 4 أحرف (مثل 12345)، فإن التنسيق لن يقطعه - ستحصل على «12345».
\n\nالإيجابيات والسلبيات
\n- \n
- الإيجابيات: بسيط، سريع، سطر واحد. يعمل في جميع إصدارات Swift. \n
- السلبيات: يستخدم
NSStringتحت الغطاء، مما قد يكون أبطأ قليلاً من حل Swift النقي. تحتاج إلى تذكر صيغة تنسيق C-style. غير مُعرب (لا يأخذ في الاعتبار فواصل الآلاف إذا لزم الأمر). \n
متى تستخدم: للحالات البسيطة: السجلات، التصحيح، عرض المعرفات، عندما لا تكون هناك حاجة للتعريب.
\n\nالطريقة رقم 2: Swift النقي - String(repeating:count:) + لاحقة
\n\nإذا كنت تريد تجنب جسر Objective-C والكتابة بلغة Swift «النقية»، يمكنك القيام بذلك يدويًا. هذا تمرين ممتاز لفهم السلاسل النصية.
\n\nextension Int {\n func leadingZeros(_ totalDigits: Int) -> String {\n let stringValue = String(self)\n let zerosCount = max(0, totalDigits - stringValue.count)\n return String(repeating: "0", count: zerosCount) + stringValue\n }\n}\n\nlet number = 42\nprint(number.leadingZeros(5)) // "00042"\n\nكيف يعمل هذا؟
\n- \n
- نحول Int إلى سلسلة نصية. \n
- نحسب عدد الأصفار التي يجب إضافتها:
totalDigits - length. إذا كان