الأصفار البادئة في Int في Swift: من الفوضى إلى النظام

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

«الأصفار المفقودة»: لماذا لا يخزن Int الأصفار البادئة وكيف تتعايش مع هذا؟

\n\n

هل سبق لك أن حاولت عرض الرقم 007 على الشاشة وحصلت على 7 فقط؟ ألم مألوف؟ مرحبًا بك في نادي مطوري Swift الذين يواجهون عاجلاً أم آجلاً السؤال: «كيف أضيف أصفارًا بادئة إلى Int؟».

\n\n

هذا السؤال على Stack Overflow حصد آلاف المشاهدات، وهذا ليس مستغربًا. تبدو المهمة بسيطة - عرض رقم الطلب كـ «001234» بدلاً من «1234»، أو إظهار الوقت كـ «09:05» بدلاً من «9:5». لكن Swift، كونه لغة شديدة التحديد للأنواع، يفصل بين مفهوم «الرقم» و«تمثيله النصي». Int هو كيان رياضي. 007 بالنسبة له هو ببساطة 7. تُفقد الأصفار البادئة أثناء التهيئة.

\n\n

في هذه المقالة، سنستعرض جميع المناهج الرئيسية لحل هذه المشكلة. ستتعلم كيفية تنسيق الأعداد الصحيحة بشكل صحيح، وأي طريقة تختار لمهام مختلفة، وكيف لا تقع في فخ الأداء. سننتقل من أقنعة السلاسل النصية البسيطة إلى NumberFormatter القوي من Foundation. هيا بنا!

\n\n

لماذا لا يستطيع Int تخزين «001»؟ نبذة مختصرة

\n\n

قبل الغوص في الكود، دعنا نفهم طبيعة الظاهرة. Int في Swift هو عدد صحيح ذو إشارة 64 بت (أو 32 بت على الأجهزة القديمة). تمثيله الداخلي هو كود ثنائي. الصفر على اليسار ليس له معنى رياضي.

\n\n
let number = 007 // خطأ؟ لا!\nprint(number) // سيُظهر: 7
\n\n

مترجم Swift لن يسمح لك حتى بكتابة 007 في الكود (إلا إذا كان حرفًا حرفيًا في النظام الثماني، ولكن هناك البادئة 0o). الخلاصة: الأصفار البادئة هي مشكلة تنسيق، وليست مشكلة تخزين بيانات. نحن نحل المشكلة على مستوى التمثيل (واجهة المستخدم، التسجيل، التصدير).

\n\n

الطريقة رقم 1: الكلاسيكية - String(format:)

\n\n

الإجابة الأكثر شيوعًا على Stack Overflow هي استخدام الدالة String(format:)، الموروثة من Objective-C (عبر الجسر مع NSString). هذه طريقة سريعة وموجزة.

\n\n

مثال: إضافة 3 أصفار بادئة

\n\n
let number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"
\n\n

المُحدد %04d يعني:

\n
    \n
  • % - بداية المُحدد؛
  • \n
  • 0 - ملء المواضع الفارغة بالأصفار، وليس بالمسافات؛
  • \n
  • 4 - الحد الأدنى لعرض الحقل (4 أحرف)؛
  • \n
  • d - عدد صحيح عشري (Int).
  • \n
\n\n

إذا كان الرقم أطول من 4 أحرف (مثل 12345)، فإن التنسيق لن يقطعه - ستحصل على «12345».

\n\n

الإيجابيات والسلبيات

\n
    \n
  • الإيجابيات: بسيط، سريع، سطر واحد. يعمل في جميع إصدارات Swift.
  • \n
  • السلبيات: يستخدم NSString تحت الغطاء، مما قد يكون أبطأ قليلاً من حل Swift النقي. تحتاج إلى تذكر صيغة تنسيق C-style. غير مُعرب (لا يأخذ في الاعتبار فواصل الآلاف إذا لزم الأمر).
  • \n
\n\n

متى تستخدم: للحالات البسيطة: السجلات، التصحيح، عرض المعرفات، عندما لا تكون هناك حاجة للتعريب.

\n\n

الطريقة رقم 2: Swift النقي - String(repeating:count:) + لاحقة

\n\n

إذا كنت تريد تجنب جسر Objective-C والكتابة بلغة Swift «النقية»، يمكنك القيام بذلك يدويًا. هذا تمرين ممتاز لفهم السلاسل النصية.

\n\n
extension 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
  1. نحول Int إلى سلسلة نصية.
  2. \n
  3. نحسب عدد الأصفار التي يجب إضافتها: totalDigits - length. إذا كان

المدونات

توصيات الكتب