طريقتان للتنسيق
تُنسّق Java النصوص انطلاقًا من قالب يحوي محددات تنسيق (العناصر النائبة %) إضافةً إلى القيم المراد إدراجها. هناك نقطتا دخول، وكلتاهما تتشاركان بنية نحوية واحدة:
String.format(template, values...)يُعيدStringجديدًا.System.out.printf(template, values...)يطبع النتيجة مباشرة.
كلتاهما تُنتجان النص نفسه. يُعيد لك String.format النص لتتمكن من تخزينه، بينما يكتبه printf إلى وحدة التحكم. لاحظ الرمز %n في نهاية قالب printf - فهو فاصل السطر المستقل عن المنصة (فضِّله على \n في نصوص التنسيق).
المحددات الشائعة
يبدأ كل محدد بـ % وينتهي بحرف يدل على نوع القيمة المتوقعة:
المحددات الثلاثة الأكثر استخدامًا يوميًا هي %s (أي قيمة، عبر طريقتها toString) و %d (الأعداد الصحيحة) و %f (الأعداد العشرية). استخدم %% لطباعة علامة نسبة مئوية حرفية. وتمرير النوع الخاطئ - كأن تُمرّر String إلى %d - يطلق استثناء IllegalFormatConversionException أثناء التشغيل.
التحكم في المنازل العشرية
يستخدم %f افتراضيًا ست منازل عشرية، وهو نادرًا ما يكون ما تريده. ضع .N قبل الحرف f لتثبيت الدقة (تُقرّب القيمة):
أضف علامة الفاصلة لفواصل التجميع في الأعداد الكبيرة:
العرض والحشو
يحدد رقم يُوضع بين % وحرف النوع الحدَّ الأدنى لعرض الحقل، مع الحشو بالمسافات حتى تصطف الأعمدة. وتؤدي إضافة - في البداية إلى المحاذاة إلى البداية، بينما تؤدي إضافة 0 في البداية إلى حشو الأرقام بالأصفار:
هذا ما يجعل الجداول المُنسَّقة والتقارير المُحاذاة قابلة للقراءة:
يحاذي %-8s الأسماء إلى البداية في عمود بعرض 8، ويحاذي %5d الدرجات إلى النهاية في عمود بعرض 5، فتصطف الأرقام بغض النظر عن عدد خاناتها.
ترتيب الوسائط
افتراضيًا تستهلك المحددات القيم بالترتيب من البداية إلى النهاية. يمكنك تكرار قيمة أو إعادة ترتيبها باستخدام N$ (فهرس يبدأ من واحد)، وهو مفيد عندما تظهر القيمة نفسها مرتين:
يشير %1$s إلى الوسيط الأول في المرتين، لذا تُطبع echo مرتين.
طريقة formatted()
منذ Java 15، يملك كل نص طريقة نسخة باسم formatted - وهي المحرك نفسه الذي يستخدمه String.format، لكن مكتوبة بوصفها استدعاء طريقة على القالب:
وهي تنسجم بشكل خاص مع الكتل النصية (النصوص متعددة الأسطر المُحاطة بعلامات اقتباس ثلاثية) عند بناء مُخرجات مُنسَّقة أكبر.
متى لا تستخدم String.format
في عمليات الدمج البسيطة لمرة واحدة، يكون الربط العادي باستخدام + أوضح وأسرع:
String greeting = "Hi, " + name + "!"; // simpler than String.format here
لجأ إلى String.format / printf عندما تحتاج إلى تنسيق حقيقي - منازل عشرية ثابتة، وحشو، ومحاذاة، وتجميع - لا لمجرد لصق بضع قيم معًا.
التالي: العوامل
التنسيق يحوّل القيم إلى نص. ولحساب تلك القيم في الأساس تحتاج إلى عوامل Java - الحسابية والمقارنة والمنطقية. وهذا هو موضوع الصفحة التالية.
الأسئلة الشائعة
كيف تُنسّق نصًا في Java؟
استخدم String.format(template, values...)، الذي يُعيد نصًا جديدًا تُستبدل فيه كل محدد تنسيق بقيمة: String.format("%s is %d", name, age). وللطباعة مباشرة بدلًا من بناء نص، استخدم System.out.printf(...) بالقالب نفسه. ومنذ Java 15 يمكنك أيضًا استدعاء template.formatted(values...).
كيف تُنسّق رقمًا إلى منزلتين عشريتين في Java؟
استخدم المحدد %.2f: ينتج String.format("%.2f", 3.14159) القيمة "3.14". والرقم الذي يلي النقطة هو عدد المنازل العشرية المُحتفظ بها، وتُقرّب القيمة. ولفواصل الآلاف أضف علامة الفاصلة: يُعطي %,.2f القيمة "1,234.57".
ما الفرق بين String.format و printf في Java؟
يستخدمان محددات التنسيق نفسها تمامًا. يُعيد String.format(...) النص المُنسَّق بوصفه String جديدًا يمكنك تخزينه أو تمريره. أما System.out.printf(...) فيكتب النص المُنسَّق مباشرة إلى المُخرَج القياسي ولا يُعيد شيئًا مفيدًا. استخدم String.format لبناء نص، و printf لطباعة نص.