• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • number_format()

    (PHP 4, PHP 5, PHP 7)

    以千位分隔符方式格式化一个数字

    说明

    number_format( float $number[,int $decimals= 0] ): string
    number_format( float $number, int $decimals= 0, string $dec_point= ".", string $thousands_sep= ",") : string

    本函数可以接受1个、2个或者4个参数(注意:不能是3个):

    如果只提供第一个参数,$number的小数部分会被去掉并且每个千位分隔符都是英文小写逗号","

    如果提供两个参数,$number将保留小数点后的位数到你设定的值,其余同楼上

    如果提供了四个参数,$number将保留$decimals个长度的小数部分,小数点被替换为$dec_point,千位分隔符替换为$thousands_sep

    参数

    $number

    你要格式化的数字

    $decimals

    要保留的小数位数

    $dec_point

    指定小数点显示的字符

    $thousands_sep

    指定千位分隔符显示的字符

    返回值

    格式化以后的$number.

    更新日志

    版本说明
    5.4.0This function now supports multiple bytes in$dec_pointand$thousands_sep. Only the first byte of each separator was used in older versions.

    范例

    Example #1number_format()Example

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

    <?php
    $number = 1234.56;
    // english notation (default)
    $english_format_number = number_format($number);
    // 1,235
    // French notation
    $nombre_format_francais = number_format($number, 2, ',', ' ');
    // 1 234,56
    $number = 1234.5678;
    // english notation without thousands separator
    $english_format_number = number_format($number, 2, '.', '');
    // 1234.57
    ?>

    更新日志

    版本说明
    7.2.0number_format()现在无法返回-0,之前可能返回-0,因为$number可能会是-0.01

    参见

    It's not explicitly documented; number_format also rounds:
    <?php
    $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, '.', ',')."<br>";
    ?>
    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
    Outputs a human readable number.
    <?php
      #  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
    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.
    <?php
       function number_format_unlimited_precision($number,$decimal = '.')
       {
          $broken_number = explode($decimal,$number);
          return number_format($broken_number[0]).$decimal.$broken_number[1];
       }
    ?>
    For Zero fill - just use the sprintf() function
    $pr_id = 1;
    $pr_id = sprintf("%03d", $pr_id);
    echo $pr_id;
    //outputs 001
    -----------------
    $pr_id = 10;
    $pr_id = sprintf("%03d", $pr_id);
    echo $pr_id;
    //outputs 010
    -----------------
    You can change %03d to %04d, etc.
    Simple function to show money as only dollars if no cents, but will show 2 decimals if cents exist.
    The 'cents' flag can force to never or always show 2 decimals
    <?php
    // formats money to a whole number or with 2 decimals; includes a dollar sign in front
    function formatMoney($number, $cents = 1) { // cents: 0=never, 1=if needed, 2=always
     if (is_numeric($number)) { // a number
      if (!$number) { // zero
       $money = ($cents == 2 ? '0.00' : '0'); // output zero
      } else { // value
       if (floor($number) == $number) { // whole number
        $money = number_format($number, ($cents == 2 ? 2 : 0)); // format
       } else { // cents
        $money = number_format(round($number, 2), ($cents == 0 ? 0 : 2)); // format
       } // integer or decimal
      } // value
      return '$'.$money;
     } // numeric
    } // formatMoney
    $a = array(1, 1234, 1.5, 1.234, 2.345, 2.001, 2.100, '1.000', '1.2345', '12345', 0, '0.00');
    // show cents if needed ($cents=1)
    foreach ($a as $b) echo ('<br />'.$b.' = '.formatMoney($b, 1));
    1 = $1
    1234 = $1,234
    1.5 = $1.50
    1.234 = $1.23
    2.345 = $2.35
    2.001 = $2.00
    2.1 = $2.10
    1.000 = $1
    1.2345 = $1.23
    12345 = $12,345
    0 = $0
    0.00 = $0
    // never show cents ($cents=0)
    foreach ($a as $b) echo ('<br />'.$b.' = '.formatMoney($b, 0));
    1 = $1
    1234 = $1,234
    1.5 = $2
    1.234 = $1
    2.345 = $2
    2.001 = $2
    2.1 = $2
    1.000 = $1
    1.2345 = $1
    12345 = $12,345
    0 = $0
    0.00 = $0
    // always show cents ($cents=2)
    foreach ($a as $b) echo ('<br />'.$b.' = '.formatMoney($b, 2));
    1 = $1.00
    1234 = $1,234.00
    1.5 = $1.50
    1.234 = $1.23
    2.345 = $2.35
    2.001 = $2.00
    2.1 = $2.10
    1.000 = $1.00
    1.2345 = $1.23
    12345 = $12,345.00
    0 = $0.00
    0.00 = $0.00
    ?>
    Cheers :)
    And remember to always contribute custom functions if they might be useful to the rest of us or future versions of the php language.
    // Here is a function that produces the same output as number_format() but also works with numbers bigger than 2^53.
    function a_number_format($number_in_iso_format, $no_of_decimals=3, $decimals_separator='.', $thousands_separator='', $digits_grouping=3){
      // Check input variables
      if (!is_numeric($number_in_iso_format)){
        error_log("Warning! Wrong parameter type supplied in my_number_format() function. Parameter \$number_in_iso_format is not a number.");
        return false;
      }
      if (!is_numeric($no_of_decimals)){
        error_log("Warning! Wrong parameter type supplied in my_number_format() function. Parameter \$no_of_decimals is not a number.");
        return false;
      }
      if (!is_numeric($digits_grouping)){
        error_log("Warning! Wrong parameter type supplied in my_number_format() function. Parameter \$digits_grouping is not a number.");
        return false;
      }
      
      
      // Prepare variables
      $no_of_decimals = $no_of_decimals * 1;
      
      
      // Explode the string received after DOT sign (this is the ISO separator of decimals)
      $aux = explode(".", $number_in_iso_format);
      // Extract decimal and integer parts
      $integer_part = $aux[0];
      $decimal_part = isset($aux[1]) ? $aux[1] : '';
      
      // Adjust decimal part (increase it, or minimize it)
      if ($no_of_decimals > 0){
        // Check actual size of decimal_part
        // If its length is smaller than number of decimals, add trailing zeros, otherwise round it
        if (strlen($decimal_part) < $no_of_decimals){
          $decimal_part = str_pad($decimal_part, $no_of_decimals, "0");
        } else {
          $decimal_part = substr($decimal_part, 0, $no_of_decimals);
        }
      } else {
        // Completely eliminate the decimals, if there $no_of_decimals is a negative number
        $decimals_separator = '';
        $decimal_part    = '';
      }
      
      // Format the integer part (digits grouping)
      if ($digits_grouping > 0){
        $aux = strrev($integer_part);
        $integer_part = '';
        for ($i=strlen($aux)-1; $i >= 0 ; $i--){
          if ( $i % $digits_grouping == 0 && $i != 0){
            $integer_part .= "{$aux[$i]}{$thousands_separator}";
          } else {
            $integer_part .= $aux[$i];      
          }
        }
      }
      
      $processed_number = "{$integer_part}{$decimals_separator}{$decimal_part}";
      return $processed_number;
    }
    $original_number= 9223372036854775805;
    echo a_number_format($original_number, 4, '.',"'",3);
    // Outputs: 9'223'372'036'854'775'805.1230
    I'd like to comment to the old notes of "stm555" and "woodynadobhar".
    They wrote about "number_format_unlimited_precision()".
    I guess many of us need that kind of function, which is the almost same function as number_format but don't round a number.
    Does Anyone know any new solution in a recent PHP version?
    ...
    If no, how about the following function? (I fixed somethings like bugs of the function in the old comment.)
    <?php
    function number_format_unchanged_precision($number, $dec_point='.', $thousands_sep=','){
      if($dec_point==$thousands_sep){
        trigger_error('2 parameters for ' . __METHOD__ . '() have the same value, that is "' . $dec_point . '" for $dec_point and $thousands_sep', E_USER_WARNING);
        // It corresponds "PHP Warning: Wrong parameter count for number_format()", which occurs when you use $dec_point without $thousands_sep to number_format().
      }
      if(preg_match('{\.\d+}', $number, $matches)===1){
        $decimals = strlen($matches[0]) - 1;
      }else{
        $decimals = 0;
      }
      return number_format($number, $decimals, $dec_point, $thousands_sep);
    }
    var_dump(number_format_unchanged_precision(1234.5678, ',', '.'));
    var_dump(number_format_unchanged_precision(1234.5678, ','));
    var_dump(number_format_unchanged_precision(12345678));
    var_dump(number_format_unchanged_precision(-0.5678, ',', '.')); // It occurred a bug with the function in the old comment.
    ?>
    output is:
      string(10) "1.234,5678"
      PHP Warning: 2 parameters for number_format_unchanged_precision() have the same value, that is "," for $dec_point and $thousands_sep in...
      string(10) "1,234,5678"
      string(10) "12,345,678"
      string(7) "-0,5678"
    Be carreful, when you're using French notation
    means : number_format(124.25, 2 , ',' , ' ') with ',' as dec_point,
    Don't forget to specify thousands_sep that default is ',' to another value, otherwise function will return null.
    here is the code to convert number to Indonesian text, this code has limitation as is number_format function. sorry for this.
    /*
    * Created : Iwan Sapoetra - Jun 13, 2008
    * Project : Web
    * Package : cgaf
    *
    */
    function terbilang( $num ,$dec=4){
      $stext = array(
        "Nol",
        "Satu",
        "Dua",
        "Tiga",
        "Empat",
        "Lima",
        "Enam",
        "Tujuh",
        "Delapan",
        "Sembilan",
        "Sepuluh",
        "Sebelas"
      );
      $say = array(
        "Ribu",
        "Juta",
        "Milyar",
        "Triliun",
        "Biliun", // remember limitation of float
        "--apaan---" ///setelah biliun namanya apa?
      );
      $w = "";
      if ($num <0 ) {
        $w = "Minus ";
        //make positive
        $num *= -1;
      }
      $snum = number_format($num,$dec,",",".");
      die($snum);
      $strnum = explode(".",substr($snum,0,strrpos($snum,",")));
      //parse decimalnya
      $koma = substr($snum,strrpos($snum,",")+1);
      $isone = substr($num,0,1) ==1;
      if (count($strnum)==1) {
        $num = $strnum[0];
        switch (strlen($num)) {
          case 1:
          case 2:
            if (!isset($stext[$strnum[0]])){
              if($num<19){
                $w .=$stext[substr($num,1)]." Belas";
              }else{
                $w .= $stext[substr($num,0,1)]." Puluh ".
                  (intval(substr($num,1))==0 ? "" : $stext[substr($num,1)]);
              }
            }else{
              $w .= $stext[$strnum[0]];
            }
            break;
          case 3:
            $w .= ($isone ? "Seratus" : terbilang(substr($num,0,1)) .
              " Ratus").
              " ".(intval(substr($num,1))==0 ? "" : terbilang(substr($num,1)));
            break;
          case 4:
            $w .= ($isone ? "Seribu" : terbilang(substr($num,0,1)) .
              " Ribu").
              " ".(intval(substr($num,1))==0 ? "" : terbilang(substr($num,1)));
            break;
          default:
            break;
        }
      }else{
        $text = $say[count($strnum)-2];
        $w = ($isone && strlen($strnum[0])==1 && count($strnum) <=3? "Se".strtolower($text) : terbilang($strnum[0]).' '.$text);
        array_shift($strnum);
        $i =count($strnum)-2;
        foreach ($strnum as $k=>$v) {
          if (intval($v)) {
            $w.= ' '.terbilang($v).' '.($i >=0 ? $say[$i] : "");
          }
          $i--;
        }
      }
      $w = trim($w);
      if ($dec = intval($koma)) {
        $w .= " Koma ". terbilang($koma);
      }
      return trim($w);
    }
    //example
    echo terbilang(999999999999)."\n";
    /**
     * result : Sembilan Ratus Sembilan Puluh Sembilan Milyar Sembilan Ratus Sembilan Puluh Sembilan Juta Sembilan Ratus Sembilan Puluh Sembilan Ribu Sembilan Ratus Sembilan Puluh Sembilan
     */
    echo terbilang(9999999999999999);
    /**
     * todo : fix this bug pleasese
     * problem : number_format(9999999999999999) <--- 10.000.000.000.000.000,0000
     * Result : Sepuluh Biliun
     */
    Just an observation:
    The number_format rounds the value of the variable.
    $val1 = 1.233;
    $val2 = 1.235;
    $val3 = 1.237;
    echo number_format($val1,2,",","."); // returns: 1,23
    echo number_format($val2,2,",","."); // returns: 1,24
    echo number_format($val3,2,",","."); // returns: 1,24
    In my function my_number_format() [shown below] there was a bug.
    If a negative number which is smaller than 1 was entered (-0,...), then the result was wrongly positive because +0 is equal to -0 (the content of $tmp[0] which was interpretet as numeric value).
    Here is the corrected version:
    <?php
    function my_number_format($number, $dec_point, $thousands_sep)
    {
      $was_neg = $number < 0; // Because +0 == -0
      $number = abs($number);
      $tmp = explode('.', $number);
      $out = number_format($tmp[0], 0, $dec_point, $thousands_sep);
      if (isset($tmp[1])) $out .= $dec_point.$tmp[1];
      if ($was_neg) $out = "-$out";
      return $out;
    }
    ?>
    Thanks to Federico Cassinelli for the bug report.
    [EDIT BY danbrown AT php DOT net: The original note follows.]
    Let's say we got the number $inp = 1234.56
    By using
    <?php
    return number_format($inp, 2, ',', '.');
    ?>
    you can get the German format 1.234,56. (Comma as decimal separator and point as thousand separator)
    But I have a problem with that: I want to add commas as thousand separators and change the decimal-separator (this could also be done with str_replace), but I do not want to change the amount of fractional digits!
    But since the 2nd argument of number_format is necessary to enter the 3rd and 4th argument, this cannot be done with number_format. You have to change the fractional digits with this function.
    But I want that 1234.56 changes into 1.234,56 and 1234.567890123456 changes into 1.234,567890123456
    So, I created following function, that doesn't change the amount of fractional digits:
    <?php
    function my_number_format($number, $dec_point, $thousands_sep)
    {
     $tmp = explode('.', $number);
     $out = number_format($tmp[0], 0, $dec_point, $thousands_sep);
     if (isset($tmp[1])) $out .= $dec_point.$tmp[1];
     return $out;
    }
    ?>
    To prevent the rounding that occurs when next digit after last significant decimal is 5 (mentioned by several people below):
    <?php
    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!
    simpler function to convert a number in bytes, kilobytes.... 
    <?php
    function bytes($a) {
      $unim = array("B","KB","MB","GB","TB","PB");
      $c = 0;
      while ($a>=1024) {
        $c++;
        $a = $a/1024;
      }
      return number_format($a,($c ? 2 : 0),",",".")." ".$unim[$c];
    }
    ?>
    you may also add others units over PeraBytes when the hard disks will reach 1024 PB :)
    If you use space as a separator, it will break on that space in HTML tables...
    Furthermore, number_format doesn't like '&nbsp;' as a fourth parameter. I wrote the following function to display the numbers in an HTML table.
     function numberfix($number)
     {
      $number = number_format($number,0,","," ");
      return str_replace(" ", "&nbsp;", $number);
     }
    For use in:
    <table><tr><td><?php echo $number; ?></td></tr></table>
    Please be careful with stm555 at hotmail dot com's solution.
    If you pass some little negative number (-1 < $number < 0) such as -0.01, the integer part would be converted to 0, so that the sign is eventually lost.
    Here is a fixed version:
    <?php
       function number_format_unlimited_precision($number,$decimal = '.')
       {
          $broken_number = explode('.', abs($number));
          $sign = $number < 0 ? '-' : '';
          return $sign.number_format($broken_number[0]).$decimal.$broken_number[1];
       }
    ?>
    function formats numbers of datetime type,
    <?php
    $_GET["zaman"]="1983-8-28 5:5:5";
    function _parseDatetimeToList($datetimeStr) { //datetime format: Y-m-d H-i-s
      $datetimeArray=explode(" ", $datetimeStr);
      $dateArray=explode("-",$datetimeArray[0]);
      $year=str_pad($dateArray[0], 2, "0", STR_PAD_LEFT);
      $month=str_pad($dateArray[1], 2, "0", STR_PAD_LEFT);
      $day=str_pad($dateArray[2], 2, "0", STR_PAD_LEFT);
      $timeArray=explode(":",$datetimeArray[1]);
      $hour=str_pad($timeArray[0], 2, "0", STR_PAD_LEFT);
      $minute=str_pad($timeArray[1], 2, "0", STR_PAD_LEFT);
      $second=str_pad($timeArray[2], 2, "0", STR_PAD_LEFT);
      return array($year, $month, $day, $hour, $minute, $second);
    }
    list($year, $month, $day, $hour, $minute, $second) = _parseDatetimeToList($_GET["zaman"]); // 1983-1-28 5:5:5
    ?>
    I'm not sure if this is the right place anyway, but "ben at last dot fm"'s ordinal function can be simplified further by removing the redundant "floor" (the result of floor is still a float, it's the "%" that's converting to int) and outer switch.
    Note that this version also returns the number with the suffix on the end, not just the suffix. 
    <?php
    function ordinal($num)
    {
      // Special case "teenth"
      if ( ($num / 10) % 10 != 1 )
      {
        // Handle 1st, 2nd, 3rd
        switch( $num % 10 )
        {
          case 1: return $num . 'st';
          case 2: return $num . 'nd';
          case 3: return $num . 'rd'; 
        }
      }
      // Everything else is "nth"
      return $num . 'th';
    }
    ?>
    I was looking for a SIMPLE way to format currency and account for negative values while not losing the calculation properties of my number. Here's my function - it's not rocket science, but maybe can help someone along the way.
    <?php
    function wims_currency($number) {
      if ($number < 0) {
       $print_number = "($ " . str_replace('-', '', number_format ($number, 2, ".", ",")) . ")";
      } else {
       $print_number = "$ " . number_format ($number, 2, ".", ",") ;
      }
      return $print_number;
    }
    ?>
    Sample use:
    <?php
    $pur_po_total = ($pur_po_total + $pur_item_total);
    $print_pur_po_total = wims_currency($pur_po_total);
    ?>
    Returns (for example)  $ 44,561.00 or, if a negative ($ 407,250.00)
    This way, I use my 1st variable for calculations and my 2nd variable for output. I'm sure there are better ways to do it, but this got me back on track.
    Exemplo: Example:
    <?php 
    $number = 1234567.896; 
    echo '1: '.number_format($number, 2, ',', '').'<br>'; 
    echo '2: '.number_format($number, 2, '.', '').'<br>'; 
    echo '3: '.number_format($number, 2, ',', '.').'<br>'; 
    echo '4: '.number_format($number, 2, '.', ',').'<br>'; 
    echo '5: '.number_format($number, 2, ',', ' ').'<br>'; 
    echo '6: '.number_format($number, 2, ',', "'").'<br>'; 
    echo '7: '.number_format($number, 2, '', '').'<br>'; 
    ?>
    Resultado: Result:
     1: 1234567,90  -> Decimal separado por ,
     2: 1234567.90  -> Decimal separado por .
     3: 1.234.567,90 -> Moeda Brasil, Alemanha
     4: 1,234,567.90 -> Inglês, USA
     5: 1 234 567,90 -> França
     6: 1'234'567,90 -> Suíça
     7: 123456790  -> Sem decimal
    A simple funtion to format american dollars.
    <?php
    function formatMoney($money) {
      if($money<1) {
        $money='¢'.$money*100;
      }
      else {
        $dollars=intval($money);
        $cents=$money-$dollars;
        $cents=$cents*100;
        $money='$'.$dollars.' and ¢'.$cents;
      }
      return $money;
    }
    echo formatmoney('52.342');
    ?>
    This will output: "  $52 and ¢34.2 ".
    This is a simple and useful function to convert a byte number in a KB or MB:
    <?
    function filesize_format ($bytes) {
     $bytes=(float)$bytes;
     if ($bytes<1024){
     $numero=number_format($bytes, 0, ',', '.')." Byte";
     return $numero;
     }
     if ($bytes<1048576){
       $numero=number_format($bytes/1024, 2, ',', '.')." KByte";
     return $numero;
     }
     if ($bytes>=1048576){
       $numero=number_format($bytes/1048576, 2, ',', '.')." MByte";
     return $numero;
     }
    }
    ?>
    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,".",",") .",-";
     }
    See also the documentation for localeconv, which will provide values for decimal point and thousands separator from the C standard library.
    Of course localeconv features many more locale information, like indicating to put the negative sign behind the value for some locale settings which can't be used to customize present number_format.
    What do you do if some of your numbers have decimal places, and some don't? You can switch between functions, but if you're building it in a loop, that's not a good solution. Instead, we have the same as below, with a slight change:
    function number_format_unlimited_precision($number,$decimal = '.'){
      $broken_number = explode($decimal,$number);
      if($broken_number[1]==0){
        return number_format($broken_number[0]);
      }else{
        return number_format($broken_number[0]).$decimal.$broken_number[1];
      };
    };
    About the function of j-a-n at gmx dot de: it's useful, but the argument of the function is $number while the logic of the function requires it to be $in.
    if you want &nbsp; as a separator and use windows charset this piece of code may help:
    <?php
    $number=number_format($number,2,'.',chr(0xA0));
    ?>
    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']);
    }
    hope this helps =)
    []'s
    <?php
      function convertNumberToWordsForIndia($number){
        //A function to convert numbers into Indian readable words with Cores, Lakhs and Thousands.
        $words = array(
        '0'=> '' ,'1'=> 'one' ,'2'=> 'two' ,'3' => 'three','4' => 'four','5' => 'five',
        '6' => 'six','7' => 'seven','8' => 'eight','9' => 'nine','10' => 'ten',
        '11' => 'eleven','12' => 'twelve','13' => 'thirteen','14' => 'fouteen','15' => 'fifteen',
        '16' => 'sixteen','17' => 'seventeen','18' => 'eighteen','19' => 'nineteen','20' => 'twenty',
        '30' => 'thirty','40' => 'fourty','50' => 'fifty','60' => 'sixty','70' => 'seventy',
        '80' => 'eighty','90' => 'ninty');
        
        //First find the length of the number
        $number_length = strlen($number);
        //Initialize an empty array
        $number_array = array(0,0,0,0,0,0,0,0,0);    
        $received_number_array = array();
        
        //Store all received numbers into an array
        for($i=0;$i<$number_length;$i++){  $received_number_array[$i] = substr($number,$i,1);  }
        //Populate the empty array with the numbers received - most critical operation
        for($i=9-$number_length,$j=0;$i<9;$i++,$j++){ $number_array[$i] = $received_number_array[$j]; }
        $number_to_words_string = "";    
        //Finding out whether it is teen ? and then multiplying by 10, example 17 is seventeen, so if 1 is preceeded with 7 multiply 1 by 10 and add 7 to it.
        for($i=0,$j=1;$i<9;$i++,$j++){
          if($i==0  ||  $i==2  ||  $i==4  ||  $i==7){
            if($number_array[$i]=="1"){
              $number_array[$j] = 10+$number_array[$j];
              $number_array[$i] = 0;
            }    
          }
        }
        
        $value = "";
        for($i=0;$i<9;$i++){
          if($i==0  ||  $i==2  ||  $i==4  ||  $i==7){  $value = $number_array[$i]*10; }
          else{ $value = $number_array[$i];  }      
          if($value!=0){ $number_to_words_string.= $words["$value"]." "; }
          if($i==1 && $value!=0){  $number_to_words_string.= "Crores "; }
          if($i==3 && $value!=0){  $number_to_words_string.= "Lakhs ";  }
          if($i==5 && $value!=0){  $number_to_words_string.= "Thousand "; }
          if($i==6 && $value!=0){  $number_to_words_string.= "Hundred &amp; "; }
        }
        if($number_length>9){ $number_to_words_string = "Sorry This does not support more than 99 Crores"; }
        return ucwords(strtolower("Indian Rupees ".$number_to_words_string)." Only.");
      }
      echo convertNumberToWordsForIndia("987654321");
      
      //Output ==> Indian Rupees Ninty Eight Crores Seventy Six Lakhs Fifty Four Thousand Three Hundred & Twenty One Only.
    ?>
    When apply number_format on number with separator on thousands, result is wrong. This function accept number of any format
    <?php
    function format_price($number,$decPlaces,$decSep,$thouSep){
        
      //$number - number for format
      //$decPlaces - number of decimal places
      //$decSep - separator for decimals
      //$thouSep - separator for thousands
      
      //first remove all white spaces
      $number=preg_replace('/\s+/', '',$number);
      //split string into array
      $numberArr = str_split($number);
      //reverse array and not preserve key, keys will help to find decimal place
      $numberArrRev=array_reverse($numberArr);
      
      //find first occurrence of non number character, that will be a decimal place
      //store $key into variable $decPointIsHere 
      foreach ($numberArrRev as $key => $value) {
        if(!is_numeric($value)){
          if($decPointIsHere==""){
            $decPointIsHere=$key;
          }      
        }
      }
      
      //decimal comma or whatever it is replace with dot
      //$decPointIsHere is the key of the element that will contain decimal separator dot 
      if($decPointIsHere!=""){
        $numberArrRev[$decPointIsHere]=".";
      }
      
      //again check through array for non numerical characters but skipping allready processed keys
      //if is not number remove from array
      
      foreach ($numberArrRev as $key => $value) {
        if(!is_numeric($value) && $key>$decPointIsHere){
          unset($numberArrRev[$key]);      
        }
      }
      
      //reverse back, at the start reversed array $numberArrRev to $numberArr
      $numberArr=array_reverse($numberArrRev);  
      
      //create string from array
      $numberClean=implode("",$numberArr);
        
      // apply php number_format function
      return number_format($numberClean,$decPlaces,$decSep,$thouSep);
      
    }
    echo format_price("1 225 552, 55",2,',',' ')."<br>";
    echo format_price("1.225.552, 55",2,',',' ')."<br>";
    echo format_price("1'225'552. 55",2,',',' ')."<br>";
    echo format_price("1225552.55",2,',',' ')."<br>";
    ?>
    all results are: 1 225 552,55
    This function is used for reformatting already formatted numbers.
    <?php
    function formatNumber($number, $format=[], $oldDecimalSeparator=",.·'", $multiplier=1) 
    {
      /**
      $format — the array of formatting options, details in the example.
      $oldDecimalSeparator — decimal separator used in the $number. If the separator can meet different characters, then you need to record them all, for example: ',.'.
      $multiplier — typically used to adjust prices up or down.
      */
      if ($format) {
        $format += ['numOfDecimals' => 0, 'decimalSeparator' => '.', 'thousandSeparator' => '']; # Default format 
        # Find decimal separator
        # The decimal separator is the one that is the last and does not occur more than once
        if ($letters = str_replace(' ', '', $number)) { # Replace spaces
          if ($letters = preg_replace('/^-/', '', $letters)) { # Remove minus
            if ($letters = preg_replace('/[0-9]/', '', $letters)) { # Get all non digits
              $lastletter = substr($letters, -1); # Returns last char
              if (substr_count($letters, $lastletter) == 1) {
                if (strpos($oldDecimalSeparator, $lastletter) !== false)
                  $oldDecimalSep = $lastletter;
                else
                  return $number;
              }
            }
          }
        }
        $number = preg_replace('/[^0-9-]/', '', $number); # Remove all non digits except 'minus'
        if ($oldDecimalSep)
          $number = str_replace($oldDecimalSep, '.', $number); # Format to float
        if ($multiplier != 1)
          $number = $number * $multiplier;
        # Convert float to new format
        $number = number_format($number, 
          $format['numOfDecimals'], 
          $format['decimalSeparator'], 
          $format['thousandSeparator']
        ); 
      }
      return $number;  
    }
    /**
    Example. Formatting data in which the decimal separator can occur as the comma and dot. Formatting into Russian format: -12 345,67
    */
    echo formatNumber($number, [
      'numOfDecimals' => 2, 
      'decimalSeparator' => ',', 
      'thousandSeparator' => '&nbsp;'
    ], ',.'); 
    ?>
    //Cep Brasil
      function getCEP($cep){
        return number_format(substr($cep, 0, 5),0,"",".").'-'.substr($cep, 5, 3);
      }
    //Saida 12.345-67
    <?php
    # Function to represent a number like '2nd', '10th', '101st' etc
    function text_number($n)
    {
      # Array holding the teen numbers. If the last 2 numbers of $n are in this array, then we'll add 'th' to the end of $n
      $teen_array = array(11, 12, 13, 14, 15, 16, 17, 18, 19);
      
      # Array holding all the single digit numbers. If the last number of $n, or if $n itself, is a key in this array, then we'll add that key's value to the end of $n
      $single_array = array(1 => 'st', 2 => 'nd', 3 => 'rd', 4 => 'th', 5 => 'th', 6 => 'th', 7 => 'th', 8 => 'th', 9 => 'th', 0 => 'th');
      
      # Store the last 2 digits of $n in order to check if it's a teen number.
      $if_teen = substr($n, -2, 2);
      
      # Store the last digit of $n in order to check if it's a teen number. If $n is a single digit, $single will simply equal $n.
      $single = substr($n, -1, 1);
      
      # If $if_teen is in array $teen_array, store $n with 'th' concantenated onto the end of it into $new_n
      if ( in_array($if_teen, $teen_array) )
      {
        $new_n = $n . 'th';
      }
      # $n is not a teen, so concant the appropriate value of it's $single_array key onto the end of $n and save it into $new_n
      elseif ( $single_array[$single] )
      {
        $new_n = $n . $single_array[$single];  
      }
      
      # Return new 
      return $new_n;
    }
    ?>
    function to convert numbers to words
    indian: thousand,lakh,crore
    Note: function can only convert nos upto 99 crores
    <?php 
     $words = array('0'=> '' ,'1'=> 'one' ,'2'=> 'two' ,'3' => 'three','4' => 'four','5' => 'five','6' => 'six','7' => 'seven','8' => 'eight','9' => 'nine','10' => 'ten','11' => 'eleven','12' => 'twelve','13' => 'thirteen','14' => 'fouteen','15' => 'fifteen','16' => 'sixteen','17' => 'seventeen','18' => 'eighteen','19' => 'nineteen','20' => 'twenty','30' => 'thirty','40' => 'fourty','50' => 'fifty','60' => 'sixty','70' => 'seventy','80' => 'eighty','90' => 'ninty','100' => 'hundred &','1000' => 'thousand','100000' => 'lakh','10000000' => 'crore');
    function no_to_words($no)
    {  global $words;
      if($no == 0)
        return ' ';
      else {      $novalue='';$highno=$no;$remainno=0;$value=100;$value1=1000;    
          while($no>=100)  {
            if(($value <= $no) &&($no < $value1))  {
            $novalue=$words["$value"];
            $highno = (int)($no/$value);
            $remainno = $no % $value;
            break;
            }
            $value= $value1;
            $value1 = $value * 100;
          }    
         if(array_key_exists("$highno",$words))
           return $words["$highno"]." ".$novalue." ".no_to_words($remainno);
         else { 
           $unit=$highno%10;
           $ten =(int)($highno/10)*10;       
           return $words["$ten"]." ".$words["$unit"]." ".$novalue." ".no_to_words($remainno);
          }
      }
    }
    echo no_to_words(999978987);
    ?>
    Using the number_format I'm having some unexpected results. 30% of 14.95 (14.95 * .3) = 4.485. Now 4.485 rounded to two decimal places should give me 4.49. 
    Example:
    <?php
    echo number_format(14.95 * .3, 2, '.', '') . "\n";
    echo number_format(4.485, 2, '.', '') . "\n";
    ?>
    Unexpected Results:
    4.48
    4.49
    People here in India are more used to counting money in Lakhs & Crores .. so here is the code for formatting the commas with thousands for the first time and then with hundred multiples from there after.
    Ex: 1234567 -> 12,34,567
    <?php
    function makecomma($input)
    {
      // This function is written by some anonymous person - I got it from Google
      if(strlen($input)<=2)
      { return $input; }
      $length=substr($input,0,strlen($input)-2);
      $formatted_input = makecomma($length).",".substr($input,-2);
      return $formatted_input;
    }
    function formatInIndianStyle($num){
      // This is my function
      $pos = strpos((string)$num, ".");
      if ($pos === false) { $decimalpart="00";}
      else { $decimalpart= substr($num, $pos+1, 2); $num = substr($num,0,$pos); }
      if(strlen($num)>3 & strlen($num) <= 12){
            $last3digits = substr($num, -3 );
            $numexceptlastdigits = substr($num, 0, -3 );
            $formatted = makecomma($numexceptlastdigits);
            $stringtoreturn = $formatted.",".$last3digits.".".$decimalpart ;
      }elseif(strlen($num)<=3){
            $stringtoreturn = $num.".".$decimalpart ;
      }elseif(strlen($num)>12){
            $stringtoreturn = number_format($num, 2);
      }
      if(substr($stringtoreturn,0,2)=="-,"){$stringtoreturn = "-".substr($stringtoreturn,2 );}
      return $stringtoreturn;
    }
    $num = 1234567;
    echo formatInIndianStyle($num);
    ?>

    上篇:nl2br()

    下篇:ord()