تعيد sprintf() نصًا مبنيًا من تنسيق وقائمة قيم: كل عنصر نائب % في التنسيق يُستبدل بالقيمة التالية. تعيد sprintf('%s is %d years old', 'Ada', 36) النص "Ada is 36 years old". وتأخذ printf() الوسائط نفسها لكنها تطبع النتيجة بدل إعادتها.
تُملأ العناصر النائبة بالترتيب، من أول التنسيق إلى آخره. يعرض %.2f منزلتين عشريتين دائمًا (4.50، لا 4.5)، ويحشو %05d العدد بالأصفار إلى خمسة أرقام.
محددات التنسيق
العنصر النائب هو %، ثم معدّلات اختيارية، ثم حرف واحد للنوع:
| المحدد | المعنى | sprintf(...) | النتيجة |
|---|---|---|---|
%s | نص | sprintf('%s', 'PHP') | PHP |
%d | عدد صحيح (بإشارة) | sprintf('%d', 42.9) | 42 |
%f | عدد عشري، 6 منازل افتراضيًا | sprintf('%f', 1.5) | 1.500000 |
%.2f | عدد عشري، منزلتان | sprintf('%.2f', 1.5) | 1.50 |
%e | الصيغة العلمية | sprintf('%e', 1234.5678) | 1.234568e+3 |
%x / %X | ست عشري | sprintf('%x', 255) | ff |
%o | ثماني | sprintf('%o', 8) | 10 |
%b | ثنائي | sprintf('%b', 5) | 101 |
%c | محرف من رمز | sprintf('%c', 65) | A |
%u | عدد صحيح دون إشارة | sprintf('%u', 3) | 3 |
%% | علامة نسبة مئوية حرفية | sprintf('%d%%', 50) | 50% |
غيّر القيم أدناه وشغّله مرة أخرى:
يقتطع %d العدد العشري نحو الصفر، فيصبح 42.9 العدد 42. إذا أردت 43، فقرّب أولًا: sprintf('%d', round(42.9)). والنص الذي ليس عددًا، مثل 'abc'، يصبح 0 مع %d.
الحشو بأصفار بادئة
بين % والحرف يمكنك وضع محرف حشو وعرض. يعني %05d «احشُ بـ 0 حتى عرض 5». وهذه الطريقة المعتادة لتنسيق أرقام الطلبات ومعرّفات الفواتير والأوقات والتواريخ.
العرض حد أدنى. والعدد الأطول من العرض يُطبع كاملًا.
%05.2f: العرض والمنازل العشرية معًا
مع الأعداد العشرية، يعدّ العرض كل محرف في النتيجة، بما فيه الفاصلة العشرية وإشارة السالب. لهذا يعطي %05.2f على 3.14159 النتيجة 03.14: خمسة محارف إجمالًا، اثنان منها بعد الفاصلة.
يستخدم %f الفاصلة العشرية للإعدادات المحلية الحالية (المضبوطة بـ setlocale())، بينما يستخدم %F النقطة دائمًا. إذا كانت شيفرتك تضبط إعدادات محلية واحتجت إلى نقطة لـ JSON أو CSV أو واجهة برمجية، فاستخدم %F.
محاذاة النص في أعمدة
يحاذي العرض الموجب إلى نهاية الحقل، ويحاذي - قبل العرض إلى بدايته، ويضبط ' متبوعًا بمحرف محرف حشو مخصصًا. ومجتمعةً تصفّ التقارير النصية والإيصالات.
يحشو %-14s اسم الصنف بعده حتى 14 محرفًا، ويحاذي %8.2f السعر إلى نهاية 8 محارف، ويطبع %'-27s مع نص فارغ خطًا من 27 شرطة. ويحشو %'*10s بـ * بدل المسافات.
ترقيم الوسائط لإعادة استخدامها أو تغيير ترتيبها
يعني %1$s «الوسيط الأول نصًا»، و%2$d «الثاني عددًا صحيحًا». تتيح لك العناصر النائبة المرقمة استخدام قيمة مرتين أو تغيير الترتيب دون تغيير قائمة الوسائط، وهذا ما يحتاجه المترجمون عندما يختلف ترتيب الكلمات بين اللغات.
vsprintf وprintf والقيم المعادة
تأخذ vsprintf() القيم في مصفوفة واحدة، وهذا مفيد عندما تكون القيم في مصفوفة أصلًا. وتعيد printf() عدد البايتات التي طبعتها، وvprintf() هي نسخة المصفوفة من printf().
العدد الذي تعيده printf() يشمل السطر الجديد، لذا فإن "Hello\n" ستة بايتات. وللنصوص متعددة البايتات تعدّ البايتات لا المحارف.
قلة الوسائط ترمي خطأً
منذ PHP 8، يرمي التنسيق الذي فيه عناصر نائبة أكثر من القيم الخطأ ArgumentCountError بدل إعادة false. عُدّ العناصر النائبة % (متجاهلًا %%) عندما ترى هذا الخطأ.
تعدّ الرسالة نص التنسيق وسيطًا: ArgumentCountError: 4 arguments are required, 3 given. وتُتجاهل الوسائط الزائدة بصمت، لذا لا يظهر الخطأ المعاكس على شكل خطأ. إذا بدت نتيجة sprintf خاطئة، فاطبع التنسيق بجانب القيم. وعندما لا تحتاج إلا إلى فاصل الآلاف، تكون number_format() أبسط من بنائه بـ sprintf. والقائمة الكاملة للمعدّلات على php.net.
الأسئلة الشائعة
كيف أضيف أصفارًا بادئة إلى عدد في PHP؟
استخدم sprintf('%05d', 42)، التي تعيد "00042". الصفر 0 هو محرف الحشو و5 هو العرض الكلي. وللنص، تعطي str_pad('42', 5, '0', STR_PAD_LEFT) النتيجة نفسها.
كيف أنسّق عددًا بمنزلتين عشريتين باستخدام sprintf؟
استخدم %.2f: تعيد sprintf('%.2f', 3.14159) النص "3.14" وتعيد sprintf('%.2f', 5) النص "5.00". وأضف عرضًا للحشو أيضًا: يعطي %08.2f النص "00003.14".
ما الفرق بين printf وsprintf في PHP؟
تعيد sprintf() النص المنسّق لتتمكن من تخزينه. وتطبعه printf() مباشرة وتعيد عدد البايتات المطبوعة. وتنتج echo sprintf(...) وprintf(...) المخرجات نفسها.
ماذا يعني %s في PHP؟
%s عنصر نائب لنص في sprintf() وprintf(): تعيد sprintf('Hello, %s', 'Ada') النص "Hello, Ada". وتُحوَّل الأعداد الممررة إلى %s إلى نصوص. و%d للأعداد الصحيحة و%f للأعداد العشرية.
كيف أستخدم الوسيط نفسه مرتين في sprintf؟
رقّم العناصر النائبة: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). استخدم علامتي تنصيص مفردتين حول التنسيق: داخل علامتي التنصيص المزدوجتين تقرأ PHP $s متغيرًا، فيصبح "%1$s" الرمز %1 متبوعًا بقيمة $s.