دقة تنسيق السلاسل النصية في Swift: أسرار وأمثلة

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

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

ابدأ الدورة

مُحدد دقة تنسيق السلسلة النصية في Swift: كيفية التحكم في دقة إخراج الأرقام



مرحبًا يا زميل! إذا كنت قد واجهت يومًا الحاجة إلى إخراج رقم بعدد معين من المنازل العشرية في Swift، فمن المؤكد أنك لاحظت أن String(format:) الكلاسيكي لا يتصرف دائمًا بشكل واضح. خاصة إذا كنت قادمًا من عالم C أو Objective-C، حيث printf هو المرجع المقدس. في هذه المقالة، سنفهم كيفية عمل مُحدد دقة تنسيق السلسلة النصية في Swift، ولماذا "يتعطل" أحيانًا وكيفية استخدامه بشكل صحيح. هيا بنا!



ما هو مُحدد الدقة ولماذا نحتاجه؟



مُحدد الدقة هو جزء من سلسلة التنسيق يحدد عدد المنازل العشرية (أو العدد الإجمالي للأرقام) التي يجب إخراجها. في Swift، كما في C، يتم كتابته بعد النقطة داخل مُحدد التنسيق. على سبيل المثال، %.2f يعني "إخراج رقم عائم بمنزلتين عشريتين".



ولكن هناك فارق بسيط: يستخدم Swift Core Foundation لتنسيق السلاسل النصية، وقد يختلف سلوكه عما اعتدت رؤيته في C. هذا ينطبق بشكل خاص على العمل مع Double و Float.



دعنا نلقي نظرة فورية على مثال بسيط غالبًا ما يظهر في الأسئلة على Stack Overflow:



let pi = Double.pilet formatted = String(format: "%.2f", pi)print(formatted) // سيطبع: "3.14"


كل شيء يعمل بشكل مثالي. ولكن بمجرد أن نبدأ في تجربة تنسيقات أكثر تعقيدًا، تبدأ المفاجآت.



الأنواع الرئيسية لمُحدد الدقة في Swift



في Swift، يتم دعم المُحددات التالية التي تؤثر على الدقة:



  • %f — رقم عائم. تشير الدقة إلى عدد المنازل العشرية.
  • %e — تدوين أسي. الدقة هي عدد المنازل بعد النقطة.
  • %g — يختار بين %f و %e اعتمادًا على القيمة. الدقة هي العدد الإجمالي للأرقام المعنوية.
  • %d / %i — أعداد صحيحة. الدقة هي الحد الأدنى لعدد الأرقام (يتم استكمالها بالأصفار على اليسار).
  • %s — سلاسل نصية. الدقة هي الحد الأقصى لعدد الأحرف المُخرجة.


ولكن الأمر الأكثر إثارة للاهتمام يبدأ عندما نحاول تطبيق الدقة على Double أو Float عبر String(format:).



المشكلة الشائعة: "لماذا لا تعمل الدقة؟"



واحدة من أكثر الشكاوى شيوعًا على Stack Overflow: "أكتب String(format: "%.2f", myDouble)، لكني أحصل على نتيجة غير متوقعة". دعنا نحلل سيناريو نموذجي:



let value: Float = 1.23456789let result = String(format: "%.4f", value)print(result) // قد يطبع "1.2346" أو "1.2345" اعتمادًا على التجميع


لماذا؟ لأن Float لديه دقة تبلغ حوالي 6-7 أرقام معنوية. إذا قمت بتمرير 1.23456789، فسيتم تقريبه إلى 1.234568 (أو ما يقرب من ذلك) حتى قبل أن يصل إلى التنسيق. ويتم تطبيق الدقة في %.4f على هذه القيمة المُقربة.



لتجنب الارتباك، استخدم دائمًا Double للأرقام العائمة إذا كنت بحاجة إلى دقة عالية:



let value: Double = 1.23456789let result = String(format: "%.4f", value)print(result) // سيطبع بشكل موثوق "1.2346"


أمثلة متقدمة: كيفية التحكم في الدقة ديناميكيًا



في بعض الأحيان، تحتاج إلى تحديد الدقة ليس بشكل ثابت، ولكن من خلال متغير. يسمح Swift بذلك بطريقتين:



الطريقة 1: عبر * (النجمة)



في مُحدد التنسيق، يمكنك استخدام * بدلاً من الرقم، وعندها سيتم أخذ الدقة من التالي

المدونات

توصيات الكتب