Скрипт для преобразования числа в текст типа 321 - триста двадцать один.
Все комментарии указаны в коде.
Примечание. Передавать в функцию следует неотформатированное число без пробелов и точек/запятых
PHP
function number2string($number) {
// обозначаем словарь в виде статической переменной функции, чтобы
// при повторном использовании функции его не определять заново
static $dic = array(
// словарь необходимых чисел
array(
-2 => 'две',
-1 => 'одна',
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 => 'девятьсот'
),
// словарь порядков со склонениями для плюрализации
array(
array('рубль', 'рубля', 'рублей'),
array('тысяча', 'тысячи', 'тысяч'),
array('миллион', 'миллиона', 'миллионов'),
array('миллиард', 'миллиарда', 'миллиардов'),
array('триллион', 'триллиона', 'триллионов'),
array('квадриллион', 'квадриллиона', 'квадриллионов'),
// квинтиллион, секстиллион и т.д.
),
// карта плюрализации
array(
2, 0, 1, 1, 1, 2
)
);
// обозначаем переменную в которую будем писать сгенерированный текст
$string = array();
// дополняем число нулями слева до количества цифр кратного трем,
// например 1234, преобразуется в 001234
$number = str_pad($number, ceil(strlen($number)/3)*3, 0, STR_PAD_LEFT);
// разбиваем число на части из 3 цифр (порядки) и инвертируем порядок частей,
// т.к. мы не знаем максимальный порядок числа и будем бежать снизу
// единицы, тысячи, миллионы и т.д.
$parts = array_reverse(str_split($number,3));
// бежим по каждой части
foreach($parts as $i=>$part) {
// если часть не равна нулю, нам надо преобразовать ее в текст
if($part>0) {
// обозначаем переменную в которую будем писать составные числа для текущей части
$digits = array();
// если число треххзначное, запоминаем количество сотен
if($part>99) {
$digits[] = floor($part/100)*100;
}
// если последние 2 цифры не равны нулю, продолжаем искать составные числа
// (данный блок прокомментирую при необходимости)
if($mod1=$part%100) {
$mod2 = $part%10;
$flag = $i==1 && $mod1!=11 && $mod1!=12 && $mod2<3 ? -1 : 1;
if($mod1<20 || !$mod2) {
$digits[] = $flag*$mod1;
} else {
$digits[] = floor($mod1/10)*10;
$digits[] = $flag*$mod2;
}
}
// берем последнее составное число, для плюрализации
$last = abs(end($digits));
// преобразуем все составные числа в слова
foreach($digits as $j=>$digit) {
$digits[$j] = $dic[0][$digit];
}
// добавляем обозначение порядка или валюту
$digits[] = $dic[1][$i][(($last%=100)>4 && $last<20) ? 2 : $dic[2][min($last%10,5)]];
// объединяем составные числа в единый текст и добавляем в переменную, которую вернет функция
array_unshift($string, join(' ', $digits));
}
}
// преобразуем переменную в текст и возвращаем из функции, ура!
return join(' ', $string);
}
Пример
echo number2string(123456789); // сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять рублей
Источник
Взято отсюда - https://habr.com/ru/sandbox/94515/