<?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);
preferences:
27.68 ms | 402 KiB | 5 Q