|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Oleg Bakiev 2:5061/109.58 17 Oct 2000 18:02:21 To : Artem Chuprina Subject : Число в строку ( по-русски) -------------------------------------------------------------------------------- 17 Oct 00 15:46, Artem Chuprina wrote to bil@vniief.ru: bvr>> PS. Есть какой-то отстой в 800 строк на VB. Руки не опускаются bvr>> это править. AC> Случайно нет. Могу случайно написать за пару часов. Hо это случайно AC> будет стоить тебе денег. Зачем писать то, что уже написано и не раз? === Cut === # (Ц) мой и неизвестного автора программы на VB, с которой это слизано # параметры: число, род единицы измерения (1 - М, 0 - Ж), # ссылка на список из трех названий в соотв. падежах # (род. множ., именит. единств., родит. множ. # (по образцу заполнения @names) или несклоняемое название sub StrNum { my ($n,$m,$cases) = @_; my ($nn,$n1,$n2,$num,$s); my $i; my $ind; my @names = ($cases, ["тысяч","тысяча","тысячи"], ["миллионов", "миллион", "миллиона"], ["миллиардов", "миллиард", "миллиарда"], ["триллионов", "триллион", "триллиона"]); my @sex = ($m,0,1,1,1); $nn = $n+0; for ($i = 0; $nn > 0; $i ++) { $num = substr("000$nn", -3,3); $n1 = substr($num,-1); $n2 = substr($num,-2,1); if ($n2 == 1) { $ind = 0; } else { if ($n1 == 1) { $ind = 1; } elsif ($n1 >= 2 && $n1 <= 4) { $ind = 2; } else { $ind = 0; } } $s = ' ' . S1000($num, $sex[$i]) . ' ' . (ref $names[$i] ? $names[$i] -> [$ind] : $names[$i]) . $s; $nn = substr("000$nn",0, length($nn)); } return $s; } sub S1000 { my ($n,$m) = @_; #' m - индикатор male/female рода предмета my ($nn,$s); my ($n3,$n2,$n1) = unpack('AAA',substr("000$n",-3)); my @ar_n3 = qw(сто двести триста четыреста пятьсот шестьсот семьсот восемьсот девятьсот); my @ar_n2n1 = qw(десять одиннадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать); my @ar_n2 = qw(хмм двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто); my @ar_n1 = ($m ? ('один','два') : ('одна','две'),"три","четыре", "пять","шесть", "семь","восемь","девять"); $n3 --; $n2 --; $n1 --; $s = $ar_n3[$n3] if ($n3 >= 0); if ($n2 == 0) { $s .= ' ' . $ar_n2n1[$n1 + 1]; return $s; } elsif ($n2 > 0) { $s .= " $ar_n2[$n2]"; } $s .= ' ' if (($n3 >= 0 || $n2 > 0) && $n1 >= 0); $s .= $ar_n1[$n1] if ($n1 >= 0); return $s; } === Cut === WBR, Oleg --- GoldED/W32 3.0.1 * Origin: >>> Можно я лягу? <<< (2:5061/109.58) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/400639ec871f.html, оценка из 5, голосов 10
|