3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?php // Staring straight up into the sky ... oh my my error_reporting(-1); mb_internal_encoding('utf-8'); /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */ function inclineWord($number, $key) { $formsOfWords = array( 0 => array("миллион", "миллиона", "миллионов"), 1 => array("тысяча", "тысячи", "тысяч"), 2 => array("рубль", "рубля", "рублей") ); $number = $number % 10; if ($number >= 11 && $number <= 14){ return $formsOfWords[$key][2]; }if ($number == 1){ return $formsOfWords[$key][0]; } elseif ($number > 1 && $number < 5) { return $formsOfWords[$key][1]; } else { return $formsOfWords[$key][2]; } } /* Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю, если мы считаем число для мужского рода (один рубль), и 1 — для женского (одна тысяча) */ function smallNumberToText($number, $isFemale) { $spelling = array( 0 => 'ноль', 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 => 'девятьсот' ); $femaleSpelling = array( 1 => 'одна', 2 => 'две' ); $digitsByWord = ""; if ($number == 0){ return $spelling[0]; } if ($number >= 100){ $digits = floor($number / 100) * 100; $digitsByWord = $spelling[$digits]; $number = $number % 100; } if ($number > 9 && $number <20){ $digitsByWord = $digitsByWord.' '.$spelling[$number]; return $digitsByWord; } if ($number > 19){ $digits = floor($number / 10) * 10; $digitsByWord = $digitsByWord.' '.$spelling[$digits]; $number = $number % 10; } if ($number > 0){ if ($isFemale == 1 && $number == 1){ $digitsByWord = $digitsByWord.' '.$femaleSpelling[1]; } elseif ($isFemale == 1 && $number == 2) { $digitsByWord = $digitsByWord.' '.$femaleSpelling[2]; } else { $digitsByWord = $digitsByWord.' '.$spelling[$number]; } } return $digitsByWord; } function numberToText($number) { for ($i = 0; $i < 3; $i++){ $threeDigits[$i] = $number % 1000; $number =floor($number / 1000); } $threeDigits = array_reverse($threeDigits); for ($i = 0; $i < 2; $i++){ if ($threeDigits[$i] == 0){ array_shift($threeDigits); } } $threeDigitsWords = array(); foreach ($threeDigits as $key => $value) { if ($key == 1){ $isFemale = 1; } else { $isFemale = 0; } $threeDigitsWords[$key] = smallNumberToText($value, $isFemale); $threeDigitsWords[$key] = $threeDigitsWords[$key].' '.inclineWord($value, $key); } return implode(" ", $threeDigitsWords); } /* Вызовем функцию несколько раз */ $amount1 = 1001; $text1 = numberToText($amount1); echo "На вашем счету {$text1}\n";
based on fK367
Output for 5.6.0 - 5.6.30, hhvm-3.15.4, 7.0.0 - 7.3.0beta1
На вашем счету один миллион одна тысяча