Php format number to text

number_format

Formats a number with grouped thousands and optionally decimal digits using the rounding half up rule.

Parameters

The number being formatted.

Sets the number of decimal digits. If 0 , the decimal_separator is omitted from the return value.

Sets the separator for the decimal point.

Sets the thousands separator.

Return Values

A formatted version of num .

Changelog

Version Description
8.0.0 Prior to this version, number_format() accepted one, two, or four parameters (but not three).
7.2.0 number_format() was changed to not being able to return -0 , previously -0 could be returned for cases like where num would be -0.01 .

Examples

Example #1 number_format() Example

For instance, French notation usually use two decimals, comma (‘,’) as decimal separator, and space (‘ ‘) as thousand separator. The following example demonstrates various ways to format a number:

// english notation (default)
$english_format_number = number_format ( $number );
// 1,235

// French notation
$nombre_format_francais = number_format ( $number , 2 , ‘,’ , ‘ ‘ );
// 1 234,56

// english notation without thousands separator
$english_format_number = number_format ( $number , 2 , ‘.’ , » );
// 1234.57

See Also

  • money_format() — Formats a number as a currency string
  • sprintf() — Return a formatted string
  • printf() — Output a formatted string
  • sscanf() — Parses input from a string according to a format

User Contributed Notes 9 notes

It’s not explicitly documented; number_format also rounds:

$numbers = array( 0.001 , 0.002 , 0.003 , 0.004 , 0.005 , 0.006 , 0.007 , 0.008 , 0.009 );
foreach ( $numbers as $number )
print $number . «->» . number_format ( $number , 2 , ‘.’ , ‘,’ ). «
» ;
?>

0.001->0.00
0.002->0.00
0.003->0.00
0.004->0.00
0.005->0.01
0.006->0.01
0.007->0.01
0.008->0.01
0.009->0.01

Note: use NumberFormatter to convert in human-readable format instead user function from comments:
echo NumberFormatter :: create ( ‘en’ , NumberFormatter :: SPELLOUT )-> format ( 12309 ); // twelve thousand three hundred nine
echo NumberFormatter :: create ( ‘ru’ , NumberFormatter :: SPELLOUT )-> format ( 12307.5 ); // двенадцать тысяч триста семь целых пять десятых
?>

If you want to display a number ending with ,- (like 200,-) when there are no decimal characters and display the decimals when there are decimal characters i use:

function DisplayDouble($value)
list($whole, $decimals) = split (‘[.,]’, $value, 2);
if (intval($decimals) > 0)
return number_format($value,2,».»,»,»);
else
return number_format($value,0,».»,»,») .»,-«;
>

Outputs a human readable number.

# Output easy-to-read numbers
# by james at bandit.co.nz
function bd_nice_number ( $n ) // first strip any formatting;
$n = ( 0 + str_replace ( «,» , «» , $n ));

// is this a number?
if(! is_numeric ( $n )) return false ;

// now filter it;
if( $n > 1000000000000 ) return round (( $n / 1000000000000 ), 1 ). ‘ trillion’ ;
else if( $n > 1000000000 ) return round (( $n / 1000000000 ), 1 ). ‘ billion’ ;
else if( $n > 1000000 ) return round (( $n / 1000000 ), 1 ). ‘ million’ ;
else if( $n > 1000 ) return round (( $n / 1000 ), 1 ). ‘ thousand’ ;

return number_format ( $n );
>
?>

Outputs:

247,704,360 -> 247.7 million
866,965,260,000 -> 867 billion

For Zero fill — just use the sprintf() function

$pr_id = 1;
$pr_id = sprintf(«%03d», $pr_id);
echo $pr_id;

$pr_id = 10;
$pr_id = sprintf(«%03d», $pr_id);
echo $pr_id;

You can change %03d to %04d, etc.

I ran across an issue where I wanted to keep the entered precision of a real value, without arbitrarily rounding off what the user had submitted.

I figured it out with a quick explode on the number before formatting. I could then format either side of the decimal.

function number_format_unlimited_precision ( $number , $decimal = ‘.’ )
$broken_number = explode ( $decimal , $number );
return number_format ( $broken_number [ 0 ]). $decimal . $broken_number [ 1 ];
>
?>

formatting numbers may be more easy if u use number_format function.

I also wrote this :
function something($number)
$locale = localeconv();
return number_format($number,
$locale[‘frac_digits’],
$locale[‘decimal_point’],
$locale[‘thousands_sep’]);
>

My simpler solution to the problem of the decimal number in this function being longer than the specified number of decimals.

Standard result for number_format() is..
number_format(5.00098, 2) = 5.00

My function will return the result = 5.001

// ** Warning: Does not work with scientific notation. Conversion to a real number is required. **

echo auto_decimal_format ( 5.0005620 ); // print 5.0006
echo auto_decimal_format ( 5.0009820 ); // print 5.001
echo auto_decimal_format ( 5.00098 , 8 ); // print 5.00098000
echo auto_decimal_format ( 1.0295691366783E-5 , 2 ); // print 0.00

function auto_decimal_format ( $n , $def = 2 ) $a = explode ( «.» , $n );
if ( count ( $a )> 1 ) $b = str_split ( $a [ 1 ]);
$pos = 1 ;
foreach ( $b as $value ) if ( $value != 0 && $pos >= $def ) $c = number_format ( $n , $pos );
$c_len = strlen ( substr ( strrchr ( $c , «.» ), 1 ));
if ( $c_len > $def ) < return rtrim ( $c , 0 ); >
return $c ; // or break
>
$pos ++;
>
>
return number_format ( $n , $def );
>

To prevent the rounding that occurs when next digit after last significant decimal is 5 (mentioned by several people below):

function fnumber_format ( $number , $decimals = » , $sep1 = » , $sep2 = » )

if (( $number * pow ( 10 , $decimals + 1 ) % 10 ) == 5 ) //if next not significant digit is 5
$number -= pow ( 10 , -( $decimals + 1 ));

return number_format ( $number , $decimals , $sep1 , $sep2 );

$t = 7.15 ;
echo $t . » | » . number_format ( $t , 1 , ‘.’ , ‘,’ ) . » | » . fnumber_format ( $t , 1 , ‘.’ , ‘,’ ) . «\n\n» ;
//result is: 7.15 | 7.2 | 7.1

$t = 7.3215 ;
echo $t . » | » . number_format ( $t , 3 , ‘.’ , ‘,’ ) . » | » . fnumber_format ( $t , 3 , ‘.’ , ‘,’ ) . «\n\n» ;
//result is: 7.3215 | 7.322 | 7.321
> ?>

have fun!

Источник

Преобразуем число в текст на примере суммы на PHP

В одном из проектов мне потребовалось преобразовать число в текст и блуждая по страницам великой паутины. Я набрел на публикацию «PHP — получение суммы прописью» от runcore. Неожиданно во мне проснулось непреодолимое желание потренировать мозг и написать свой вариант этой полезной функции. Еще проще и и элегантнее, а главное быстрее (по моим подсчетам примерно на 40%).

Пример использования:

echo number2string(123456789); // сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять рублей 
function number2string($number) < // обозначаем словарь в виде статической переменной функции, чтобы // при повторном использовании функции его не определять заново static $dic = array( // словарь необходимых чисел array( -2 =>'две', -1 => 'одна', 1 => 'один', 2 => 'два', 3 => 'три', 4 => 'четыре', 5 => 'пять', 6 => 'шесть', 7 => 'семь', 8 => 'восемь', 9 => 'девять', 10 => 'десять', 11 => 'одиннадцать', 12 => 'двенадцать', 13 => 'тринадцать', 14 => 'четырнадцать' , 15 => 'пятнадцать', 16 => 'шестнадцать', 17 => 'семнадцать', 18 => 'восемнадцать', 19 => 'девятнадцать', 20 => 'двадцать', 30 => 'тридцать', 40 => 'сорок', 50 => 'пятьдесят', 60 => 'шестьдесят', 70 => 'семьдесят', 80 => 'восемьдесят', 90 => 'девяносто', 100 => 'сто', 200 => 'двести', 300 => 'триста', 400 => 'четыреста', 500 => 'пятьсот', 600 => 'шестьсот', 700 => 'семьсот', 800 => 'восемьсот', 900 => 'девятьсот' ), // словарь порядков со склонениями для плюрализации array( array('рубль', 'рубля', 'рублей'), array('тысяча', 'тысячи', 'тысяч'), array('миллион', 'миллиона', 'миллионов'), array('миллиард', 'миллиарда', 'миллиардов'), array('триллион', 'триллиона', 'триллионов'), array('квадриллион', 'квадриллиона', 'квадриллионов'), // квинтиллион, секстиллион и т.д. ), // карта плюрализации array( 2, 0, 1, 1, 1, 2 ) ); // обозначаем переменную в которую будем писать сгенерированный текст $string = array(); // дополняем число нулями слева до количества цифр кратного трем, // например 1234, преобразуется в 001234 $number = str_pad($number, ceil(strlen($number)/3)*3, 0, STR_PAD_LEFT); // разбиваем число на части из 3 цифр (порядки) и инвертируем порядок частей, // т.к. мы не знаем максимальный порядок числа и будем бежать снизу // единицы, тысячи, миллионы и т.д. $parts = array_reverse(str_split($number,3)); // бежим по каждой части foreach($parts as $i=>$part) < // если часть не равна нулю, нам надо преобразовать ее в текст if($part>0) < // обозначаем переменную в которую будем писать составные числа для текущей части $digits = array(); // если число треххзначное, запоминаем количество сотен if($part>99) < $digits[] = floor($part/100)*100; >// если последние 2 цифры не равны нулю, продолжаем искать составные числа // (данный блок прокомментирую при необходимости) if($mod1=$part%100) < $mod2 = $part%10; $flag = $i==1 && $mod1!=11 && $mod1!=12 && $mod2else < $digits[] = floor($mod1/10)*10; $digits[] = $flag*$mod2; >> // берем последнее составное число, для плюрализации $last = abs(end($digits)); // преобразуем все составные числа в слова foreach($digits as $j=>$digit) < $digits[$j] = $dic[0][$digit]; >// добавляем обозначение порядка или валюту $digits[] = $dic[1][$i][(($last%=100)>4 && $last <20) ? 2 : $dic[2][min($last%10,5)]]; // объединяем составные числа в единый текст и добавляем в переменную, которую вернет функция array_unshift($string, join(' ', $digits)); >> // преобразуем переменную в текст и возвращаем из функции, ура! return join(' ', $string); > 

Повторюсь, что данный код работает быстрее всех найденных мной вариантов.

Источник

Читайте также:  Greenlion php sql parser
Оцените статью