Loading:

PHP 7 News & Updates v7.0 - 7.4 - book

funkcja do zamiany liczby na jej słowną reprezentację

Przykład działania:

1 jeden
2 dwa
5 pięć
10 dziesięć
11 jedenaście
17 siedemnaście
20 dwadzieścia
21 dwadzieścia jeden
25 dwadzieścia pięć
100 sto
101 sto jeden
102 sto dwa
110 sto dziesięć
111 sto jedenaście
119 sto dziewiętnaście
123 sto dwadzieścia trzy
170 sto siedemdziesiąt
1000 jeden tysiąc
1001 jeden tysiąc jeden
1010 jeden tysiąc dziesięć
1111 jeden tysiąc sto jedenaście
1125 jeden tysiąc sto dwadzieścia pięć
6666 sześć tysięcy sześćset sześćdziesiąt sześć
10000 dziesięć tysięcy
10001 dziesięć tysięcy jeden
10010 dziesięć tysięcy dziesięć
12345 dwanaście tysięcy trzysta czterdzieści pięć
100000 sto tysięcy
100001 sto tysięcy jeden
100011 sto tysięcy jedenaście
120000 sto dwadzieścia tysięcy
111111 sto jedenaście tysięcy sto jedenaście
7654321 siedem milionów sześćset pięćdziesiąt cztery tysiące trzysta dwadzieścia jeden
9876543 dziewięć milionów osiemset siedemdziesiąt sześć tysięcy pięćset czterdzieści trzy
9000001 dziewięć milionów jeden
9999999 dziewięć milionów dziewięćset dziewięćdziesiąt dziewięć tysięcy dziewięćset dziewięćdziesiąt dziewięć



Napisz Artykuł

Listing

<?php
/**
 * Rozszerza klasę num o dodatkowe funkcjonalności.
 *
 * @package helpers
 * @author Michał "phpion" Płonka
 */

class num extends num_Core {
        /**
         * Zwraca słowną reprezentację liczby.
         *
         * Obsługuje liczby od 0 do 9999999.
         *
         * @param int $number Liczba.
         * @param string $imploder Ciag znaków jakim zostaną połączone ze sobą poszczególne segementy liczby.
         * @return string Słowna reprezentacja liczby.
         */

        public static function say($number, $imploder = ' ') {
                $number = (int)$number;
               
                if ($number == 0) {
                        return 'zero';
                }
               
                $levels = array(
                        '0' => array('', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć'),
                        '0a' => array('', 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siedemnaście', 'osiemnaście', 'dziewiętnaście'),
                        '1' => array('', 'dziesięć', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt'),
                        '2' => array('', 'sto', 'dwieście', 'trzysta', 'czterysta', 'pięćset', 'sześćset', 'siedemset', 'osiemset', 'dziewięćset'),
                        '3' => array('', 'jeden tysiąc', 'dwa tysiące', 'trzy tysiące', 'cztery tysiące', 'pięć tysięcy', 'sześć tysięcy', 'siedem tysięcy', 'osiem tysięcy', 'dziewięć tysięcy'),
                        '3a' => array('', 'jedenaście tysięcy', 'dwanaście tysięcy', 'trzynaście tysięcy', 'czternaście tysięcy', 'piętnaście tysięcy', 'szesnaście tysięcy', 'siedemnaście tysięcy', 'osiemnaście tysięcy', 'dziewiętnaście tysięcy'),
                        '4' => array('', 'dziesięć tysięcy', 'dwadzieścia tysięcy', 'trzydzieści tysięcy', 'czterdzieści tysięcy', 'pięćdziesiąt tysięcy', 'sześćdziesiąt tysięcy', 'siedemdziesiąt tysięcy', 'osiemdziesiąt tysięcy', 'dziewięćdziesiąt tysięcy'),
                        '5' => array('', 'sto tysięcy', 'dwieście tysięcy', 'trzysta tysięcy', 'czterysta tysięcy', 'pięćset tysięcy', 'sześćset tysięcy', 'siedemset tysięcy', 'osiemset tysięcy', 'dziewięćset tysięcy'),
                        '6' => array('', 'jeden milion', 'dwa miliony', 'trzy miliony', 'cztery miliony', 'pięć milionów', 'sześć milionów', 'siedem milionów', 'osiem milionów', 'dziewięć milionów')
                );
               
                $return = array();
                $skip_next_level = FALSE;

                $number = (string)$number;
               
                // Pętla przypisująca słowne odpowiedniki cyfrom na określonych miejscach.
                for ($i=0, $strlen=strlen($number); $i<$strlen; $i++) {
                        if ($skip_next_level === TRUE) {
                                $return[] = '';
                                $skip_next_level = FALSE;
                               
                                continue;
                        }
                       
                        $l = $strlen - $i - 1;
                        $n = (int)$number[$i];
                       
                        if ($n == 1 && isset($levels[($l - 1).'a'])) {
                                $next_number = (int)$number[$i + 1];
                               
                                if ($next_number != 0) {
                                        $l = ($l - 1).'a';
                                        $n = (int)$number[$i + 1];
                                }
                               
                                $return[] = $levels[$l][(string)$n];
                               
                                $skip_next_level = TRUE;
                        }
                        else {
                                $return[] = $levels[$l][(string)$n];
                        }
                }
                //
               
                // Usunięcie powtórzeń typu "sto tysięcy jedenaście tysięcy" do postaci "sto jedenaście tysięcy".
                $c = 0;
                $remove_after_space = FALSE;
               
                for ($i=$strlen-1; $i>=0; $i--) {
                        $strpos = strpos($return[$i], ' ');
                       
                        if ($strpos > 0) {
                                if ($remove_after_space === TRUE) {
                                        $return[$i] = substr($return[$i], 0, $strpos);
                                }
                                else {
                                        $remove_after_space = TRUE;
                                }
                        }
                       
                        if ($c == 2) {
                                $remove_after_space = FALSE;
                                $c = 0;
                        }
                        else {
                                $c++;
                        }
                }
                //
               
                return implode($imploder, $return);
        }
}


Ten wpis posiada swój wątek na forum

Wszystkie pytania prosimy kierować właśnie tam ponieważ komentarze to miejsce na poprawki do kodu lub alternatywne rozwiązania i pytania nie będą publikowane

http://forum.funkcje.net/forum/viewtopic.php?f=3&t=12315

Dane do logowania na forum są takie same jak na funkcje.net



Dodano przez: tyrael Ranga: Poziom 3 Punktów: 50
Komentarze użytkowników
Mało przydatne rozwiązanie ale warto wiedzieć jak wykonać.
autor: croos22 | 12320 | 2011-03-06 10:29:35


    • Treść komentarza
      Kod do komentarza (opcjonalnie)
      PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
      Autor
      Token
      token

       

       








funkcje.net
Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-17 v.1.5 | design: diviXdesign & rainbowcolors