public function write conf pattern true convert true array array if co

 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
public function write( $conf, $pattern = true, $convert = true ){
$p = array('%v%','%s%','%n%');
$r = array();
if(!$conf['case'])
$conf['case'] = 0;
$subj = explode(',', $conf['subj']);
$glagol = explode(',',$conf['verb']);
$r[] = $this->w_proper($conf['num'], $glagol);
$r[] = $this->w_proper($conf['num'], $subj);
$convert = is_bool($pattern) ? $pattern : $convert;
if( $convert )
$conf['num'] =
$conf['num'] > 999999999 ? "очень много" : $this->w_convert($conf['num'], $conf['case']);
$r[] = $conf['num'];
return str_replace($p, $r, ( is_bool($pattern) ? $conf['pattern'] : $pattern));
}
private $w_words = array(array('ноль', array ('один', 'одна', 'одно'), array ('два', 'две', 'два'),
'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать','шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'),
array ('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'),
array ('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'),
array ('тысяча', 'тысячи', 'тысяч'), array ('миллион', 'миллиона', 'миллионов'));
private function w_convert($num, $case, $bool = false){
$num = round($num);
$w = &$this->w_words;
$k = (($num<20)?0:(($num<100)?1:(($num<1000)?2:(($num<1000000)?3:4))));
switch( $k ){
case 0:
return (($bool && !$num)?" ":((is_array($a = $w[$k][$num]))?$a[$case]:$a)); break;
case 1:
$p = floor($num / 10);
return implode(' ', array($w[$k][$p], $this->w_convert( $num % 10, $case, true))); break;
case 2:
$p = floor($num / 100);
return implode(' ', array($w[$k][$p], $this->w_convert( $num % 100, $case, true))); break;
case 3:
$p = floor($num / 1000);
return implode(' ', array(
$this->w_convert($p, 1, true),
$this->w_proper($p, $w[$k]),
$this->w_convert($num % 1000, $case, true)
)); break;
default:
$p = floor($num / 1000000);
return implode(' ', array(
$this->w_convert($p, 0, true),
$this->w_proper($p, $w[$k]),
$this->w_convert($num%1000000, $case, true)
)); break;
}
}
private function w_proper($n, $subj) {
return $subj[$n = (($n%10 == 1 && $n%100 != 11)?0:((($n%10 >= 2 && $n%10 <= 4) && ($n%100 < 10 or $n%100 >= 20))?1:2))]?$subj[$n]:$subj[1];
}