Może się komuś przyda, napisałem sobie do generowania słownej reprezentacji liczb (do faktur / rachunków etc).
Operuje na liczbach typu integer, obsługuje ujemne i dodatnie liczby. Dodatkowo można go używać do tworzenia liczby mnogiej dla wyrazów.
Nie odpowiadam za ewentualne błędy, ale wygląda na to, że spisuje się całkiem nieźle. Jeśli znajdziecie błąd piszcie, poprawi się
<?php /** * Number to words converter (polish language) * * @author programista.it * @package Number2Words */ class Number2WordsPL { /** * Converts number to words in polish language * * @param integer $number The number * * @return string Words representation */ static function convert($number) { // check if number is negative $negative = false; if($number < 0) { $negative = true; $number = abs($number); // turn to positive } if($number == 0) { // if zero return zero return 'zero'; } $i = -1; // our numberMap key $result = ''; while($number >= 1) { $token = $number % 1000; // get 3 digits $number = ($number - $token) / 1000; // cut the number if($i >= 0) { // if numberMap key is greater than equal thousands list($first, $second, $third) = self::$numberMap[$i]; // get plural values from numberMap $pluralize = self::pluralize($token, $first, $second, $third); // pluralize } else { $pluralize = ''; } if($token != 0) { // for zero we don't write anything to output $hundredsOf = self::hundredsOf($token) . ' '; // convert 3 digit token $result = $hundredsOf . $pluralize . ' ' . $result ; // add to output string } $i++; } return trim($negative ? 'minus ' . $result : $result); } /** * Pluralize the word * * @param integer $number The number with word would be pluralized * @param string $first The first variety of the word * @param string $second The second variety of the word * @param string $third The third variety of the word * * @return string Pluralized word */ static function pluralize($number, $first, $second, $third) { $number = abs($number); // get absolute value, for negative numbers algoritm is the same if($number > 20) { // if number is greater than 20 $number %= 10; // get the last digit if($number == 1) { // for 21, 31, 41, ... result is the same as for 0 $number--; } } if($number == 1) { // 1 - first case return $first; } else if($number >= 2 && $number <= 4) { // 2,3,4 - second case return $second; } else { // 0,6,7,8,9 - third case return $third; } } protected static $numberMap = array( array('tysiąc', 'tysiące', 'tysięcy'), array('milion', 'miliony', 'milionów'), array('miliard', 'miliardy', 'miliardów'), array('bilion', 'biliony', 'bilionów'), array('biliard', 'biliardy', 'biliardów'), array('trylion', 'tryliony', 'trylionów'), array('tryliard', 'tryliardy', 'tryliardów') ); protected static $ones = array( 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć' ); protected static $tens = array( 'dziesięć', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt' ); protected static $specialTens = array( 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siedemnaście', 'osiemnaście', 'dziewiętnaście' ); protected static $hundreds = array( 'sto', 'dwieście', 'trzysta', 'czterysta', 'pięćset', 'sześćset', 'siedemset', 'osiemset', 'dziewięćset' ); protected static function hundredsOf($number) { $ones = $number % 10; $tens = (($number % 100) - $ones); $hundreds = ($number - $tens - $ones) / 100; $tens /= 10; $result = ''; if($hundreds != 0) { $result .= self::$hundreds[$hundreds - 1] . ' '; } if($tens == 1 && $ones != 0) { $result .= self::$specialTens[$ones - 1] . ' '; } else { if($tens != 0) { $result .= self::$tens[$tens - 1] . ' '; } if($ones != 0) { $result .= self::$ones[$ones - 1] . ' '; } } return trim($result); } }
Howto:
<?php echo Number2WordsPL::convert(1029007438124892645);
daje nam: jeden trylion dwadzieścia dziewięć biliardów siedem bilionów czterysta trzydzieści osiem miliardów sto dwadzieścia cztery miliony osiemset dziewięćdziesiąt dwa tysiące sześćset czterdzieści pięć