Menu

number_format() ב-PHP: מפריד אלפים וספרות עשרוניות

number_format(1234567.891, 2) מחזירה "1,234,567.89": היא מעגלת למספר הספרות העשרוניות שביקשתם ומוסיפה מפריד אלפים. למדו את ארבעת הפרמטרים, פורמטים אירופיים ויפניים, איך היא מעגלת, ולמה התוצאה היא מחרוזת.

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

number_format($number, $decimals) מחזירה את המספר כמחרוזת עם מפריד אלפים ומספר קבוע של ספרות עשרוניות: number_format(1234567.891, 2) מחזירה "1,234,567.89". עם ארגומנט אחד היא מעגלת למספר שלם: number_format(1234567.891) הוא "1,234,568".

ארבעת הפרמטרים

number_format(
    float $num,
    int $decimals = 0,
    ?string $decimal_separator = ".",
    ?string $thousands_separator = ","
): string

הארגומנט השלישי הוא התו שבין החלק השלם לספרות העשרוניות, הרביעי הוא התו שבין קבוצות של שלוש ספרות. כל אחד מהם יכול להיות כל מחרוזת, כולל מחרוזת ריקה או תו מרובה בתים. ערכו את המפרידים למטה כדי לראות כל סגנון:

נתוני locale (CLDR) משתמשים ברווח בלתי שביר צר (U+202F) לצרפתית וברווח בלתי שביר (U+00A0) לרוסית, כך שמספר אף פעם לא נשבר על פני שתי שורות. ב-HTML, העבירו "\u{202F}" או "\u{00A0}" כמפריד במקום רווח רגיל.

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

העבירו '' כארגומנט הרביעי. מקבלים מספר פשוט עם מספר קבוע של ספרות עשרוניות, הצורה ששערי תשלום, ייצוא CSV וערכי <input type="number"> מצפים לה:

בשורה האחרונה, round() לפני ההמרה חשובה: 19.9 * 100 נשמר כ-1989.9999999999998, ו-(int) לבדה הייתה חותכת אותו ל-1989.

איך number_format מעגלת

number_format() מעגלת חצי הרחק מאפס, כמו round(), ולכן 0.5 הופך ל-1 ו--2.5 הופך ל--3. היא גם מתקנת את השגיאה הבינארית הזעירה בערכים כמו 2.675, ולכן היא יכולה לא להסכים עם sprintf('%.2f'):

אי אפשר לשמור את 2.675 בדיוק בבינארי; הערך השמור נמוך ממנו בשערה. sprintf() מעצבת את הערך השמור ומקבלת 2.67, בעוד number_format() ו-round() מתייחסות אליו כ-2.675 שכתבתם. אם אתם צריכים כלל עיגול מסוים, קראו בעצמכם קודם ל-round(), ל-floor() או ל-ceil() (ראו עיגול ומתמטיקה) והעבירו את התוצאה ל-number_format().

עיצוב כסף ומטבעות אחרים

number_format() לא יודעת כלום על מטבעות, ולכן מוסיפים את הסמל בעצמכם. שימו סימני מינוס לפני הסמל, וזכרו שלין היפני אין ספרות עשרוניות:

לפלט שמותאם ל-locale עם המיקום הנכון של הסמל לכל מדינה, NumberFormatter של הרחבת intl עושה את כל העבודה:

$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo $fmt->formatCurrency(1234.5, 'EUR'); // 1.234,50 € (a no-break space before €)

היא דורשת את הרחבת intl, שלא מותקנת בכל מקום, ולכן number_format() עם סמל משלכם היא הבחירה הניידת.

התוצאה היא מחרוזת, לא מספר

זה הבאג הנפוץ ביותר עם number_format(): לעצב ערך ואז לחשב איתו. "1,234.50" אינה מחרוזת מספרית, ולכן PHP קוראת רק את ה-1 שלפני הפסיק:

<?php
echo number_format(1234.5, 2) + 1;
Warning: A non-numeric value encountered in /home/index.php on line 2
2

העברה של מחרוזת כזו בחזרה ל-number_format() גרועה יותר: היא זורקת TypeError: number_format(): Argument #1 ($num) must be of type int|float, string given. שמרו את המספר הגולמי לחשבון ועצבו רק ברגע שאתם מדפיסים. אם אתם מקבלים מחרוזת מעוצבת מטופס או מקובץ, הסירו קודם את המפרידים:

לריפוד, ליישור או לסימן פלוס לפני המספר, השתמשו במקום זאת ב-sprintf(); היא לא מוסיפה מפרידי אלפים, אבל היא שולטת ברוחב ובסימן.

שאלות נפוצות

איך מעצבים מספר עם פסיקים ב-PHP?

קראו ל-number_format($n): number_format(1234567) מחזירה "1,234,567". העבירו ארגומנט שני לספרות עשרוניות: number_format(1234567.891, 2) מחזירה "1,234,567.89".

איך משתמשים ב-number_format בלי פסיק?

העבירו מחרוזת ריקה כמפריד האלפים: number_format(1234.5, 2, '.', '') מחזירה "1234.50". זו הצורה ש-API של תשלומים וקובצי CSV מצפים לה בדרך כלל.

האם number_format מעגלת או חותכת?

היא מעגלת, חצי הרחק מאפס: number_format(2.5) הוא "3", number_format(-2.5) הוא "-3" ו-number_format(2.675, 2) הוא "2.68". כדי לחתוך ספרות עשרוניות במקום זאת, השתמשו קודם ב-floor(): number_format(floor(2.679 * 100) / 100, 2) נותן "2.67".

איך מעצבים מספרים בצורה האירופית (1.234,56)?

החליפו את המפרידים עם הארגומנט השלישי והרביעי: number_format(1234.56, 2, ',', '.') מחזירה "1.234,56". בסגנון הצרפתי והשווייצרי משתמשים ברווח או בגרש כארגומנט הרביעי.

למה number_format נותנת תוצאה שגויה כשמוסיפים לה מספר?

number_format() מחזירה מחרוזת כמו "1,234.50", ו-PHP קוראת רק את ה-1 שלפני הפסיק כשעושים איתה חשבון. שמרו את המספר לחישובים וקראו ל-number_format() רק כשאתם מדפיסים אותו.

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

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

להתחיל