-
Notifications
You must be signed in to change notification settings - Fork 0
/
num-to-text.php
172 lines (146 loc) · 5.95 KB
/
num-to-text.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<?php
namespace NumToText;
class NumToText
{
var $Mant = array('', '', '');
var $Expon = array('', '', '');
function NumToText()
{
}
// установка описания мантисс
function SetMant($mant)
{
$this->Mant = $mant;
}
// установка описания экспонент
function SetExpon($expon)
{
$this->Expon = $expon;
}
// функция возвращает необходимый индекс описаний разряда
// ('миллион', 'миллиона', 'миллионов') для числа $ins
// например для 29 вернется 2 (миллионов)
// $ins максимум два числа
function DescrIdx($ins)
{
if(intval($ins/10) == 1) // числа 10 - 19: 10 миллионов, 17 миллионов
return 2;
else
{
// для остальных десятков возьмем единицу
$tmp = $ins%10;
if($tmp == 1) // 1: 21 миллион, 1 миллион
return 0;
else if($tmp >= 2 && $tmp <= 4)
return 1; // 2-4: 62 миллиона
else
return 2; // 5-9 48 миллионов
}
}
// IN: $in - число,
// $raz - разряд числа - 1, 1000, 1000000 и т.д.
// внутри функции число $in меняется
// $ar_descr - массив описаний разряда ('миллион', 'миллиона', 'миллионов') и т.д.
// $fem - признак женского рода разряда числа (true для тысячи)
function DescrSot(&$in, $raz, $ar_descr, $fem = false)
{
$ret = '';
$conv = intval($in / $raz);
$in %= $raz;
$descr = $ar_descr[ $this->DescrIdx($conv%100) ];
if($conv >= 100)
{
$Sot = array('сто', 'двести', 'триста', 'четыреста', 'пятьсот',
'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
$ret = $Sot[intval($conv/100) - 1] . ' ';
$conv %= 100;
}
if($conv >= 10)
{
$i = intval($conv / 10);
if($i == 1)
{
$DesEd = array('десять', 'одиннадцать', 'двенадцать', 'тринадцать',
'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать',
'восемнадцать', 'девятнадцать' );
$ret .= $DesEd[ $conv - 10 ] . ' ';
$ret .= $descr;
// возвращаемся здесь
return $ret;
}
$Des = array('двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят',
'семьдесят', 'восемьдесят', 'девяносто' );
$ret .= $Des[$i - 2] . ' ';
}
$i = $conv % 10;
if($i > 0)
{
if( $fem && ($i==1 || $i==2) )
{
// для женского рода (сто одна тысяча)
$Ed = array('одна', 'две');
$ret .= $Ed[$i - 1] . ' ';
}
else
{
$Ed = array('один', 'два', 'три', 'четыре', 'пять',
'шесть', 'семь', 'восемь', 'девять' );
$ret .= $Ed[$i - 1] . ' ';
}
}
$ret .= $descr;
return $ret;
}
// IN: $sum - число, например 1256.18
function Convert($sum)
{
$ret = '';
// имена данных перменных остались от предыдущей версии
// когда скрипт конвертировал только денежные суммы
$result = 0;
$sum = trim($sum);
// удалим пробелы внутри числа
$sum = str_replace(' ', '', $sum);
// флаг отрицательного числа
$sign = false;
if($sum[0] == '-')
{
$sum = substr($sum, 1);
$sign = true;
}
// заменим запятую на точку, если она есть
$sum = str_replace(',', '.', $sum);
$result = intval($sum);
if($result)
{
// значение $result изменяется внутри функции DescrSot
// новое значение: $result %= 1000000000 для миллиарда
if($result >= 1000000000)
$ret .= $this->DescrSot($result, 1000000000,
array('миллиард', 'миллиарда', 'миллиардов')) . ' ';
if($result >= 1000000)
$ret .= $this->DescrSot($result, 1000000,
array('миллион', 'миллиона', 'миллионов') ) . ' ';
if($result >= 1000)
$ret .= $this->DescrSot($result, 1000,
array('тысяча', 'тысячи', 'тысяч'), true) . ' ';
$ret .= $this->DescrSot($result, 1, $this->Mant) . ' ';
// если необходимо поднимем регистр первой буквы
//$ret[0] = chr( ord($ret[0]) + ord('A') - ord('a') );
// для корректно локализованных систем можно закрыть верхнюю строку
// и раскомментировать следующую (для легкости сопровождения)
// $ret[0] = strtoupper($ret[0]);
} else {
$ret .= 'нуль';
}
//$ret = mb_strtoupper(substr($ret,0,2),"utf-8") . substr($ret,1);
// если число было отрицательным добавим минус
return $ret;
}
}
$convert = new NumToText();
print $convert->Convert(10);
// десять
print $convert->Convert(122223124120);
// сто двадцать два миллиарда двести двадцать три миллиона сто двадцать четыре тысячи сто двадцать
?>