<?php
setlocale(LC_ALL, 'ru_RU', 'ru_RU.cp1251');
header("Content-Type: text/html; charset=windows-1251");
class Num2rub {
public $def = array (
'form' => array('1' => 0, '2' => 1, '1f' => 0, '2f' => 1, '3' => 1, '4' => 1),
'rank' => array(
0 => array('рубль', 'рубля', 'рублей', 'f' => ''),
1 => array('тысяча', 'тысячи', 'тысяч', 'f' => 'f'),
2 => array('миллион', 'миллиона', 'миллионов', 'f' => ''),
3 => array('миллиард', 'миллиарда', 'миллиардов', 'f' => ''),
'k' => array('копейка', 'копейки', 'копеек', 'f' => 'f')
),
'words' => array(
'0' => array( '', 'десять', '', ''),
'1' => array( 'один', 'одиннадцать', '', 'сто'),
'2' => array( 'два', 'двенадцать', 'двадцать', 'двести'),
'1f' => array( 'одна', '', '', ''),
'2f' => array( 'две', '', '', ''),
'3' => array( 'три', 'тринадцать', 'тридцать', 'триста'),
'4' => array( 'четыре', 'четырнадцать', 'сорок', 'четыреста'),
'5' => array( 'пять', 'пятнадцать', 'пятьдесят', 'пятьсот'),
'6' => array( 'шесть', 'шестнадцать', 'шестьдесят', 'шестьсот'),
'7' => array( 'семь', 'семнадцать', 'семьдесят', 'семьсот'),
'8' => array( 'восемь', 'восемнадцать', 'восемьдесят', 'восемьсот'),
'9' => array( 'девять', 'девятнадцать', 'девяносто', 'девятьсот')
)
);
public static function doit($str) {
$num2rub = new Num2rub();
$str = number_format($str, 2, '.', ',');
$rubkop = explode('.', $str);
$rub = $rubkop[0];
$kop = (isset($rubkop[1])) ? $rubkop[1] : '00';
$rub = (strlen($rub) == 1) ? '0' . $rub : $rub;
$rub = explode(',', $rub);
$rub = array_reverse($rub);
$word = array();
$word[] = $num2rub->dvig($kop, 'k', false);
foreach($rub as $key => $value) {
if (intval($value) > 0 || $key == 0) //подсказал skrabus (http://forum.dklab.ru/profile.php?mode=viewprofile&u=22791)
$word[] = $num2rub->dvig($value, $key);
}
$word = array_reverse($word);
return ucfirst(trim(implode(' ', $word)));
}
public function dvig($str, $key, $do_word = true) {
//$key - разряды
$def =& $this->def;
$words = $def['words'];
$form = $def['form'];
if (!isset($def['rank'][$key])) return '!razriad';
$rank = $def['rank'][$key];
$sotni = '';
$word = '';
$num_word = '';
$str = (strlen($str) == 1) ? '0' . $str : $str;
$dig = str_split($str);
$dig = array_reverse($dig);
if (1 == $dig[1]) {
$num_word = ($do_word) ? $words[$dig[0]][1] : $dig[1] . $dig[0];
$word = $rank[2];
}
else {
//$rank[3] - famale
if ($dig[0] != 1 && $dig[0] != 2) $rank['f'] = '';
$num_word = ($do_word)
? $words[$dig[1]][2] . ' ' . $words[$dig[0] . $rank['f']][0]
: $dig[1] . $dig[0];
$key = (isset($form[$dig[0]])) ? $form[$dig[0]] : false;
$word = ($key !== false) ? $rank[$key] : $rank[2];
}
$sotni = (isset($dig[2])) ? (($do_word) ? $words[$dig[2]][3] : $dig[2]) : '';
if ($sotni && $do_word) $sotni .= ' ';
return $sotni . $num_word . ' ' . $word;
} //function dvig
} //class Num2rub()
//Отображение исходного кода
if (isset($_GET['code'])) {
echo '<title>Исходный код файла "' . $_SERVER['REQUEST_URI'] . '"</title>';
highlight_file(__FILE__);
exit;
}
//Пример использования:
$number = isset($_GET['number']) ? floatval($_GET['number']) : 34101119.22;
$numbervis = htmlspecialchars($number, ENT_QUOTES);
if ($number) echo "<center><p>" . Num2rub::doit($number) . "</p></center>";
echo "
<center><form action='' method='get'>Введите число: <input name='number' value='$numbervis'> <input type='submit' value='Написать прописью'></form>
<p><a href='?code'>Исходный php-код файла</a>
";