Menu

sprintf() ב-PHP: עיצוב מחרוזות, ריפוד ומספרים עשרוניים

sprintf() בונה מחרוזת מתבנית ומערכים: sprintf('%05.2f', 3.14159) מחזירה "03.14". למדו %s, %d ו-%f, ריפוד באפסים, מספר קבוע של ספרות עשרוניות, יישור, מספור ארגומנטים, printf ו-vsprintf.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

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
%ffloat, 6 ספרות עשרוניות כברירת מחדלsprintf('%f', 1.5)1.500000
%.2ffloat, 2 ספרות עשרוניות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 חותך float לכיוון אפס, ולכן 42.9 הופך ל-42. אם אתם רוצים 43, עגלו קודם: sprintf('%d', round(42.9)). מחרוזת שאינה מספר, כמו 'abc', הופכת ל-0 תחת %d.

ריפוד באפסים מובילים

בין % לבין האות אפשר לשים תו ריפוד ורוחב. %05d פירושו "רפד ב-0 עד רוחב של 5". זו הדרך הרגילה לעצב מספרי הזמנה, מזהי חשבוניות, שעות ותאריכים.

הרוחב הוא מינימום. מספר ארוך מהרוחב מודפס במלואו.

%05.2f: רוחב וספרות עשרוניות יחד

ב-floats, הרוחב סופר כל תו בתוצאה, כולל הנקודה העשרונית וסימן המינוס. לכן %05.2f על 3.14159 נותן 03.14: חמישה תווים בסך הכול, שניים מהם אחרי הנקודה.

%f משתמש בנקודה העשרונית של ה-locale הנוכחי (שמוגדר עם setlocale()), בעוד %F תמיד משתמש בנקודה. אם הקוד שלכם מגדיר locale ואתם צריכים נקודה ל-JSON, ל-CSV או ל-API, השתמשו ב-%F.

יישור טקסט בעמודות

רוחב חיובי מיישר לימין, - לפני הרוחב מיישר לשמאל, ו-' ואחריו תו קובע תו ריפוד מותאם. בשילוב, הם מסדרים בשורות דוחות וקבלות בטקסט פשוט.

%-14s מרפד את שם הפריט מימין עד 14 תווים, %8.2f מיישר את המחיר לימין ב-8 תווים, ו-%'-27s עם מחרוזת ריקה מדפיס שורה של 27 מקפים. %'*10s מרפד ב-* במקום ברווחים.

מספור הארגומנטים כדי לחזור עליהם או לשנות את הסדר

%1$s פירושו "הארגומנט הראשון כמחרוזת", %2$d "השני כמספר שלם". ממלאי מקום ממוספרים מאפשרים להשתמש בערך פעמיים או לשנות את הסדר בלי לשנות את רשימת הארגומנטים, ומתרגמים צריכים את זה כשסדר המילים שונה בין שפות.

vsprintf, printf וערכי ההחזרה

vsprintf() מקבלת את הערכים כמערך אחד, וזה שימושי כשהם כבר יושבים במערך. printf() מחזירה את מספר הבתים שהדפיסה, ו-vprintf() היא גרסת המערך של printf().

הספירה מ-printf() כוללת את ירידת השורה, ולכן "Hello\n" הוא 6 בתים. בטקסט מרובה בתים היא סופרת בתים, לא תווים.

מעט מדי ארגומנטים זורק שגיאה

מאז 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) נותנת את אותה תוצאה.

איך מעצבים מספר עם 2 ספרות אחרי הנקודה עם 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 ל-floats.

איך משתמשים באותו ארגומנט פעמיים ב-sprintf?

מספרו את ממלאי המקום: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). השתמשו בגרשיים בודדים סביב התבנית: בתוך מירכאות כפולות PHP קוראת את $s כמשתנה, ולכן "%1$s" הופך ל-%1 ואחריו הערך של $s.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל