Overview
The NumberFormat class controls how numbers, dates, times, currencies, and percentages are displayed in cells. It provides pre-defined format codes and supports custom format strings.
Namespace
PhpOffice\PhpSpreadsheet\Style\NumberFormat
// Via Style object
$numberFormat = $spreadsheet->getActiveSheet()->getStyle('A1')->getNumberFormat();
// Via chaining
$spreadsheet->getActiveSheet()->getStyle('A1')
->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_CURRENCY_USD);
General and Text
FORMAT_GENERAL
string
default:"'General'"
General number format (default)
Text format (displays values as-is)
Number with 1 decimal place
Number with 2 decimal places
FORMAT_NUMBER_COMMA_SEPARATED1
string
default:"'#,##0.00'"
Number with thousand separators and 2 decimals
FORMAT_NUMBER_COMMA_SEPARATED2
string
default:"'#,##0.00_-'"
Number with thousand separators, 2 decimals, and trailing space
Percentage with 1 decimal place
Percentage with 2 decimal places
FORMAT_DATE_YYYYMMDD
string
default:"'yyyy-mm-dd'"
Date format: 2024-03-04
FORMAT_DATE_DDMMYYYY
string
default:"'dd/mm/yyyy'"
Date format: 04/03/2024
FORMAT_DATE_XLSX14
string
default:"'mm-dd-yy'"
Date format: 03-04-24
FORMAT_DATE_XLSX15
string
default:"'d-mmm-yy'"
Date format: 4-Mar-24
FORMAT_DATE_LONG_DATE
string
default:"'dddd, mmmm d, yyyy'"
Long date format: Monday, March 4, 2024
FORMAT_DATE_TIME1
string
default:"'h:mm AM/PM'"
Time format: 2:30 PM
FORMAT_DATE_TIME2
string
default:"'h:mm:ss AM/PM'"
Time format: 2:30:45 PM
FORMAT_DATE_TIME4
string
default:"'h:mm:ss'"
Time format: 14:30:45
FORMAT_DATE_TIME6
string
default:"'h:mm:ss'"
Time format: 14:30:45
FORMAT_DATE_TIME_INTERVAL_HMS
string
default:"'[hh]:mm:ss'"
Time interval format: [25]:30:45
FORMAT_DATE_DATETIME
string
default:"'d/m/yy h:mm'"
DateTime format: 4/3/24 14:30
FORMAT_DATE_DATETIME_BETTER
string
default:"'yyyy-mm-dd hh:mm'"
DateTime format: 2024-03-04 14:30
FORMAT_DATE_XLSX22
string
default:"'m/d/yy h:mm'"
DateTime format: 3/4/24 14:30
FORMAT_CURRENCY_USD
string
default:"'$#,##0.00_-'"
US Dollar with 2 decimals: $1,234.56
FORMAT_CURRENCY_USD_INTEGER
string
default:"'$#,##0_-'"
US Dollar integer: $1,235
FORMAT_CURRENCY_EUR
string
default:"'#,##0.00_-[$€]'"
Euro with 2 decimals: 1,234.56€
FORMAT_CURRENCY_EUR_INTEGER
string
default:"'#,##0_-[$€]'"
Euro integer: 1,235€
FORMAT_CURRENCY_GBP
string
default:"'£#,##0.00_-'"
British Pound: £1,234.56
FORMAT_CURRENCY_YEN_YUAN
string
default:"'ï¿¥#,##0.00_-'"
Yen/Yuan: ï¿¥1,234.56
US Dollar accounting format
Methods
Get the format code.
public function getFormatCode(bool $extended = false): ?string
Whether to return extended format (converts system formats)
Set the format code.
public function setFormatCode(string $formatCode): static
Format code string (use FORMAT_* constants or custom format)
Example:
$numberFormat->setFormatCode(NumberFormat::FORMAT_CURRENCY_USD);
$numberFormat->setFormatCode(NumberFormat::FORMAT_PERCENTAGE_00);
$numberFormat->setFormatCode('0.000'); // Custom format
Get the built-in format code index.
public function getBuiltInFormatCode(): false|int
Returns: Built-in format index or false if not a built-in format
Set format using a built-in format code index.
public function setBuiltInFormatCode(int $formatCodeIndex): static
Built-in format code index (0-49)
applyFromArray()
Apply number format from array.
public function applyFromArray(array $styleArray): static
Array with ‘formatCode’ key
Example:
$numberFormat->applyFromArray([
'formatCode' => NumberFormat::FORMAT_CURRENCY_EUR
]);
Static Methods
Get a built-in format code by index.
public static function builtInFormatCode(int $index): string
Get the index of a built-in format code.
public static function builtInFormatCodeIndex(string $formatCodeIndex): false|int
Convert a value to a formatted string.
public static function toFormattedString(
mixed $value,
string $format,
?array $callBack = null,
bool $lessFloatPrecision = false
): string
Optional callback function for additional formatting
Use less precise float conversion
Complete Examples
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Integer
$sheet->setCellValue('A1', 1234);
$sheet->getStyle('A1')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_NUMBER);
// 2 decimal places
$sheet->setCellValue('A2', 1234.5678);
$sheet->getStyle('A2')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_NUMBER_00);
// Thousands separator
$sheet->setCellValue('A3', 1234567.89);
$sheet->getStyle('A3')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
// Custom: 3 decimal places
$sheet->setCellValue('A4', 123.456789);
$sheet->getStyle('A4')->getNumberFormat()
->setFormatCode('0.000');
// No decimals
$sheet->setCellValue('B1', 0.75); // Stored as 0.75
$sheet->getStyle('B1')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_PERCENTAGE); // Displays as 75%
// 2 decimal places
$sheet->setCellValue('B2', 0.7545);
$sheet->getStyle('B2')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_PERCENTAGE_00); // Displays as 75.45%
// US Dollars
$sheet->setCellValue('C1', 1234.56);
$sheet->getStyle('C1')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_CURRENCY_USD);
// Euros
$sheet->setCellValue('C2', 1234.56);
$sheet->getStyle('C2')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_CURRENCY_EUR);
// British Pounds
$sheet->setCellValue('C3', 1234.56);
$sheet->getStyle('C3')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_CURRENCY_GBP);
// Custom currency
$sheet->setCellValue('C4', 1234.56);
$sheet->getStyle('C4')->getNumberFormat()
->setFormatCode('"Â¥"#,##0.00'); // Japanese Yen
use PhpOffice\PhpSpreadsheet\Shared\Date;
// Excel date values are days since 1900-01-01
$dateValue = Date::PHPToExcel('2024-03-04');
// yyyy-mm-dd format
$sheet->setCellValue('D1', $dateValue);
$sheet->getStyle('D1')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_YYYYMMDD);
// dd/mm/yyyy format
$sheet->setCellValue('D2', $dateValue);
$sheet->getStyle('D2')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_DDMMYYYY);
// Long date format
$sheet->setCellValue('D3', $dateValue);
$sheet->getStyle('D3')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_LONG_DATE);
// Custom date format
$sheet->setCellValue('D4', $dateValue);
$sheet->getStyle('D4')->getNumberFormat()
->setFormatCode('mmm d, yyyy'); // Mar 4, 2024
$timeValue = Date::PHPToExcel('2024-03-04 14:30:45');
// 12-hour format with AM/PM
$sheet->setCellValue('E1', $timeValue);
$sheet->getStyle('E1')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_TIME1);
// 24-hour format
$sheet->setCellValue('E2', $timeValue);
$sheet->getStyle('E2')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_TIME4);
// Time with seconds
$sheet->setCellValue('E3', $timeValue);
$sheet->getStyle('E3')->getNumberFormat()
->setFormatCode('h:mm:ss AM/PM');
$dateTimeValue = Date::PHPToExcel('2024-03-04 14:30:45');
// Standard datetime
$sheet->setCellValue('F1', $dateTimeValue);
$sheet->getStyle('F1')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_DATETIME);
// ISO datetime
$sheet->setCellValue('F2', $dateTimeValue);
$sheet->getStyle('F2')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_DATETIME_BETTER);
// Custom datetime
$sheet->setCellValue('F3', $dateTimeValue);
$sheet->getStyle('F3')->getNumberFormat()
->setFormatCode('yyyy-mm-dd hh:mm:ss');
Text Format
// Force text format (preserves leading zeros, etc.)
$sheet->setCellValue('G1', '00123');
$sheet->getStyle('G1')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_TEXT);
// ZIP codes
$sheet->setCellValue('G2', '02134');
$sheet->getStyle('G2')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_TEXT);
// Positive/Negative/Zero/Text format
$sheet->setCellValue('H1', 1234.56);
$sheet->getStyle('H1')->getNumberFormat()
->setFormatCode('#,##0.00_);[Red](#,##0.00);0.00;@');
// Phone number format
$sheet->setCellValue('H2', '5551234567');
$sheet->getStyle('H2')->getNumberFormat()
->setFormatCode('(000) 000-0000');
// Fractions
$sheet->setCellValue('H3', 0.75);
$sheet->getStyle('H3')->getNumberFormat()
->setFormatCode('# ?/?'); // Displays as 3/4
// Scientific notation
$sheet->setCellValue('H4', 12345678);
$sheet->getStyle('H4')->getNumberFormat()
->setFormatCode('0.00E+00');
// Different colors for positive/negative
$sheet->getStyle('I1')->getNumberFormat()
->setFormatCode('[Green]#,##0.00;[Red](#,##0.00)');
// Show different text for different ranges
$sheet->getStyle('I2')->getNumberFormat()
->setFormatCode('[>=1000]"High: "#,##0;[>=100]"Medium: "#,##0;"Low: "#,##0');
Apply to Range
// Apply currency format to entire column
$sheet->getStyle('C:C')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_CURRENCY_USD);
// Apply date format to range
$sheet->getStyle('D1:D100')->getNumberFormat()
->setFormatCode(NumberFormat::FORMAT_DATE_YYYYMMDD);
// Using applyFromArray
$sheet->getStyle('E1:E100')->applyFromArray([
'numberFormat' => [
'formatCode' => NumberFormat::FORMAT_PERCENTAGE_00
]
]);
Number formats can have up to 4 sections separated by semicolons:
Positive;Negative;Zero;Text
Format codes:
0 - Digit placeholder (shows 0 if no digit)
# - Digit placeholder (shows nothing if no digit)
. - Decimal point
, - Thousands separator
% - Percentage
@ - Text placeholder
[Color] - Color (Red, Blue, Green, etc.)
"text" - Literal text
[$currency] - Currency symbol
Examples:
// Custom formats
'0.00' // 2 decimal places
'#,##0.00' // Thousands separator
'$#,##0.00' // Currency
'0.00%;-0.00%;0.00%;@' // Percentage with all sections
'[Green]#,##0;[Red](#,##0);0' // Colored positive/negative
'"Qty: "#,##0' // With prefix text
'#,##0.00" units"' // With suffix text
'0.00E+00' // Scientific notation
'# ?/?' // Fraction
'[h]:mm:ss' // Time interval
See Also