Number format


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{
    .


$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 ? "".

rnum[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
*/

php.net

Заметки

Первый аргумент указывает значение input value. Например, число 5351.

Второй аргумент указывает значение format pattern. Например, строка ‘###.###,00’.

Третий аргумент является необязательным аргументом decimal format name. Он позволяет использовать любой символ в формате строки шаблона. Символ связывается с ролью в элементе <xsl:decimal-format>. Частым значением аргумента decimal format name является european, которое используется для преобразования исходных ролей точки и запятой.

В шаблоне формата поддерживаются следующие символы: «.», «,», «#», «%», «0», а также символ промилле Юникода (#x2030). Символ «#» используется для описания целых чисел. Символы «.» и «,» используются для описания расположения и типа пунктуации. Символ «0» используется для расположения 0 до и после символа «.», если в противном случае позиция не покажет цифру, например 00.3 или 3.00. При усечении чисел справа от десятичного разделителя численное значение округляется. Численное значение слева от десятичного разделителя никогда не округляется.

Должны присутствовать как входное значение, так и строка шаблона формата, в противном случае выдается ошибка. Если входное значение не приводится к численному значению с помощью правил, указанных в функции number(), то функция format-number возвращает значение NaN. Если строка шаблона формата не является допустимой строкой шаблона, функция возвращает неизмененное входное значение.


Если присутствует аргумент decimal format name, он представляет имя десятичного формата, как указано в элементе <xsl:decimal-format>. Имя десятичного формата должно быть полным именем. Если имя десятичного формата задано в функции, то в таблице стилей должен существовать элемент <xsl:decimal-format> с таким же именем.

Элемент <xsl:decimal-format> может переопределить шаблон форматирования чисел по умолчанию. Элемент <xsl:decimal-format> соблюдает шаблоны указателей форматирования класса java.text.DecimalFormat. Примеры использования функции format-number с элементом <xsl:decimal-format> см. в разделе Элемент <xsl:decimal-format>.

Примеры

Следующие строки XSLT возвращают значение «24.535,20»:

<xsl:decimal-format name="european" decimal-separator=',' grouping-separator='.' /> <xsl:value-of select="format-number(24535.2, '###.###,00', 'european')"/> 

При вызове следующей функции возвращается значение «5 351»:

format-number(5351,"#,###") 

При вызове следующей функции возвращается значение «5351,00»:

format-number(5351, "#.00")   

При вызове следующей функции возвращается значение «53,5100»:

format-number(53.51, "#.0000") 

При вызове следующей функции возвращается значение «0053.5100»:

format-number(53.51, "0000.0000") 

При вызове следующей функции возвращается значение «0053.51»:

format-number(53.51, "0000.####") 

При вызове следующей функции возвращается значение «53,6»:

format-number(53.56, "0.0") 

Полный пример применения этой функции к XML-данным с помощью таблицы стилей XSLT см. в разделе Пример использования элемента <xsl:decimal-format>.

msdn.microsoft.com

Форматируемое число

Первый и обязательный аргумент функции number_format() в PHP — это непосредственно число, которое нужно отформатировать. Выражение будет выглядеть так:

string number_format(float $number)

Параметр $number должен представлять собой число с плавающей точкой.

Результатом работы функции станет строка, содержащая исходное число, разбитое по разрядам. Дробная часть будет отброшена с округлением. В качестве разделителя разрядов используется запятая.

<?php  $number1 = 12345678.4321;  $result1 = number_format($number1); // 12,345,678    $number2 = 12345678.5678;  $result2 = number_format($number2); // 12,345,679  ?>  

Во втором примере произошло округление дробной части.

Дробная часть

Если необходимо сохранить дробную часть, в функцию PHP number_format() необходимо передать второй аргумент.

string number_format(float $number, int $decimals)

$decimals — это целое число (integer), определяющее количество знаков после запятой, которое нужно сохранить. По умолчанию оно равно нулю, поэтому при передаче одного аргумента дробная часть отбрасывается.

Приняв два параметра, функция вернет отформатированную строку, использовав для разделителя целой и дробной части точку.

<?php  $number1 = 12345678.4321;  $result1 = number_format($number1, 2); // 12,345,678.43    $number2 = 12345678.5678;  $result2 = number_format($number2, 1); // 12,345,679.6    $number3 = 12345678;  $result3 = number_format($number3, 3); // 12,345,679.000  ?>

В этом случае также происходит округление дробной части. Вместо недостающих цифр подставляются нули.

Пользовательские разделители

Стандартные разделители, используемые функцией PHP number_format() можно заменить на любые другие символы. Третий параметр отвечает за отделитель дробной части, а четвертый — за межразрядный символ.

string number_format(float $number, int $decimals, string $dec_point, string $thousands_sep)  

И $dec_point, и $thousands_sep являются строковыми данными. В качестве разделителя можно передать любой символ, а также пробел или пустую строку. Из последовательности символов будет использован только первый, остальные обрежутся.

Работа функции php number_format в примерах с четырьмя параметрами:

<?php  $number1 = 12345678.4321;  $number2 = 12345678.5678;  $number3 = 12345678;    $result1 = number_format($number1, 5, '.', ','); // 12,345,678.43210    $result2 = number_format($number2, 5, '^', ' '); // 12 345 678:56780    $result3 = number_format($number2, 5, '-', ''); // 12345678-56780    $result4 = number_format($number3, 5, '***', 'xxx'); // 12x345x678*000    ?>

Разделители заменяются пользовательскими, все остальные правила сохраняются.

Функция PHP number_format() предоставляет программисту большой простор в форматировании числовых значений. Для получения адекватного результата важно соблюдать установленный спецификацией синтаксис и помнить о том, что возвращаемое функцией значение имеет строковый тип.

fb.ru

При выводе чисел на веб странице отличным способом улучшить доступность информации является форматирование для облегчения восприятия. Например, число 123,456.78


воспринимается гораздо лучше, чем 123456.784321.

PHP функция number_format() предоставляет лёгкий способ форматировать числа для отображения. Можно отделять тысячи с помощью запятой или другого символа, выбирать символ для десятичной точки и определять количество десятичных знаков в дробной части числа для отображения (можно совсем не выводить дробную часть числа).

Основные опции форматирования чисел

По умолчанию number_format() принимает число для форматирования и возвращает строку, которая содержит отформатированное число, округлённое до ближайшего целого с разделением каждой группы тысяч с помощью запятой:

$myNumber = 1234567.89;    // Выводит "1,234,568"  echo number_format( $myNumber ); 

Так как number_format() возвращает строку, которая содержит символы разделители, то использовать вывод функции number_format() в качестве числовых значений для последующих математических операций или функций нельзя. Поэтому, все вычисления надо производить в оригинальных числовых значениях, а форматировать результат с помощью number_format() только тогда, когда нужно показывать его пользователю.

Задаём количество знаков дробной части числа

Количество знаков в дробной части числа задаётся в качестве второго аргумента функции number_format()


. Функция округляет число вверх или вниз до указанного количества десятичных знаков:

$myNumber = 123456.784321;    // Выводит "123,456.78"  echo number_format( $myNumber, 2 );    // Выводит "123,456.8"  echo number_format( $myNumber, 1 ); 

Использование различных символов разделителей

По умолчанию функция number_format() использует точку для отделения десятичной дробной части и запятую для разделения групп тысяч. Для того, чтобы использовать другие символы, нужно передать новый десятичный разделитель в качестве третьего аргумента в функцию, а новый разделитель тысяч — в качестве четвёртого аргумента.

Следующий пример демонстрирует форматирование чисел в соответствии с Французским стандартом — запятая используется для отделения дробной части числа, а пробел — для отделения групп тысяч.:

$myNumber = 123456.784321;    // Выводит "123 456,78"  echo number_format( $myNumber, 2, ',', ' ' ); 

Если вам нужно выводить числа в соответствии с Английским стандартом, то есть с округлением до двух десятичных знаков в дробной части и без отделения групп тысяч, нужно использовать следующий вызов функции:

$myNumber = 123456.784321;    // Выводит "123456.78"  echo number_format( $myNumber, 2, '.', '' ); 

Вы можете использовать PHP функцию localeconv() для определения текущих установок локали компьютера для десятичной точки и разделителя тысяч — чтобы установить их в функции number_format().

Резюме

Функция number_format() предоставляет лёгкий способ для вывода чисел в удобном для чтения формате.

ruseller.com

For those that need to print the word-form of a number ("twenty-three" instead of "23") I've found the following code to be useful.  This code is an improvement upon that posted in 2004 by armstrong @ rice.  Notably, the previous code did not properly compute large numbers (at least in PHP 4.x that I tested). 

The following code adds another variable to the function, which controls the display of fractional parts, and properly calculates values one thousand and above.

Zak
~ ~ ~

function num2words($num, $c=1) {
   $ZERO = 'zero';
   $MINUS = 'minus';
   $lowName = array(
         /* zero is shown as "" since it is never used in combined forms */
         /* 0 .. 19 */
         "", "one", "two", "three", "four", "five",
         "six", "seven", "eight", "nine", "ten",
         "eleven", "twelve", "thirteen", "fourteen", "fifteen",
         "sixteen", "seventeen", "eighteen", "nineteen");
  
   $tys = array(
         /* 0, 10, 20, 30 ... 90 */
         "", "", "twenty", "thirty", "forty", "fifty",
         "sixty", "seventy", "eighty", "ninety");
  
   $groupName = array(
         /* We only need up to a quintillion, since a long is about 9 * 10 ^ 18 */
         /* American: unit, hundred, thousand, million, billion, trillion, quadrillion, quintillion */
         "", "hundred", "thousand", "million", "billion",
         "trillion", "quadrillion", "quintillion");
  
   $divisor = array(
         /* How many of this group is needed to form one of the succeeding group. */
         /* American: unit, hundred, thousand, million, billion, trillion, quadrillion, quintillion */
         100, 10, 1000, 1000, 1000, 1000, 1000, 1000) ;
  
   $num = str_replace(",","",$num);
   $num = number_format($num,2,'.','');
   $cents = substr($num,strlen($num)-2,strlen($num)-1);
   $num = (int)$num;
  
   $s = "";
  
   if ( $num == 0 ) $s = $ZERO;
   $negative = ($num < 0 );
   if ( $negative ) $num = -$num;
   // Work least significant digit to most, right to left.
   // until high order part is all 0s.
   for ( $i=0; $num>0; $i++ ) {
       $remdr = (int)($num % $divisor[$i]);
       $num = $num / $divisor[$i];
       // check for 1100 .. 1999, 2100..2999, ... 5200..5999
       // but not 1000..1099,  2000..2099, ...
       // Special case written as fifty-nine hundred.
       // e.g. thousands digit is 1..5 and hundreds digit is 1..9
       // Only when no further higher order.
       if ( $i == 1 /* doing hundreds */ && 1 <= $num && $num <= 5 ){
           if ( $remdr > 0 ){
               $remdr = ($num * 10);
               $num = 0;
           } // end if
       } // end if
       if ( $remdr == 0 ){
           continue;
       }
       $t = "";
       if ( $remdr < 20 ){
           $t = $lowName[$remdr];
       }
       else if ( $remdr < 100 ){
           $units = (int)$remdr % 10;
           $tens = (int)$remdr / 10;
           $t = $tys [$tens];
           if ( $units != 0 ){
               $t .= "-" . $lowName[$units];
           }
       }else {
           $t = num2words($remdr, 0);
       }
       $s = $t." ".$groupName[$i]." ".$s;
       $num = (int)$num;
   } // end for
   $s = trim($s);
   if ( $negative ){
       $s = $MINUS . " " . $s;
   }
  
   if ($c == 1) $s .= " and $cents/100";
  
   return $s;
} // end num2words

php.svchat.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.