Перевод числа в пpописной вид (perl)
Ключевые слова: perl , (найти похожие документы )
Date: Tue, 28 Jan 2003 12:42:32 +0500
From: Michael Babakov <[email protected] >
Newsgroups: ftn.ru.perl
Subject: Перевод числа в пpописной вид
> Hаpод, как на пеpле сделать пеpевод из числа в пpопись, т.е. напpимеp
> кидаеш ей 151 - а тебе в ответ "стопятьдесят один" ну и так далее!
Мылом выслал, но мне интерсно кто автор этого скрипта. Сколько пользуюсь, а
не знаю. Скажите, пожалуйста.
=== cut ===
#!/usr/bin/perl -w
use integer;
my @T = (
"",
"тысяч",
"миллион",
"миллиард",
"триллион"
);
my @S = (
"",
"сто ",
"двести ",
"триста ",
"четыреста ",
"пятьсот ",
"шестьсот ",
"семьсот ",
"восемьсот ",
"девятьсот "
);
my @D = (
"",
"",
"двадцать ",
"тридцать ",
"сорок ",
"пятьдесят ",
"шестьдесят ",
"семьдесят ",
"восемьдесят ",
"девяносто "
);
my @E = (
"",
"один ",
"два ",
"три ",
"четыре ",
"пять ",
"шесть ",
"семь ",
"восемь ",
"девять ",
"десять ",
"одиннадцать ",
"двенадцать ",
"тринадцать ",
"четырнадцать ",
"пятнадцать ",
"шестнадцать ",
"семнадцать ",
"восемнадцать ",
"девятнадцать "
);
my @G = (
"",
"одна ",
"две "
);
my @K = (
"а ",
"и ",
" ",
"а ",
"ов "
);
sub propis {
my $Nai = $_[1];
my $Num = $_[0];
my $rod = $_[2];
my $Otv = "";
my $Div = 1000000000;
my ($MyN, $Myk, $Gi, $i);
for ($i = 3; $i >= 0; $i--) {
if ($i > 0) {
$MyN = $Num / $Div;
} else {
$MyN = ($Num % 1000);
}
if ($MyN != 0) {
$Myk = $MyN / 100;
if ($Myk != 0) {
$Otv = $Otv . $S[$Myk];
}
$Myk = ($MyN % 100) / 10;
if ($Myk > 1) {
$Otv = $Otv . $D[$Myk];
$Myk = $MyN % 10;
} else {
$Myk = $MyN % 20;
}
if ((($i == 1) || ($rod == 1) ) && ($Myk < 3)) {
$Otv = $Otv . $G[$Myk];
} else {
$Otv = $Otv . $E[$Myk];
}
$Otv .= $T[$i];
if ($i > 0) {
if ($i == 1) { $Gi = 0; }
else { $Gi = 2; }
if ( (($Myk % 10) == 1) && ($Myk != 11) ) { # // was == 1
$Otv = $Otv . $K[$Gi];
} elsif ( ($Myk != 0) && (($Myk % 10) < 5) && ($Myk / 10 != 1) ) {
$Otv = $Otv . $K[$Gi + 1];
} else {
$Otv = $Otv . $K[$Gi + 2];
}
}
} else {
$Myk = 0;
}
if ($i == 0) {
if ($Myk > 4) {
$Otv .= $Nai->[0]; #"рублей";
} elsif ($Myk == 1) {
$Otv .= $Nai->[1]; #"рубль";
} elsif ($Myk > 0) {
$Otv .= $Nai->[2]; #"рубля";
} elsif ($Num > 0) {
$Otv .= $Nai->[3]; #"рублей";
}
}
while ($Num >= $Div) {
$Num -= $Div;
}
$Div = $Div / 1000;
}
return $Otv;
}
sub FirstCap {
my $Otv = shift;
my $R = substr($Otv, 0, 1);
$R =~
tr/йцукенгшщзхъфывапролджэячсмитьбюё/ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ/;
$R .= substr($Otv, 1);
return $R;
}
1;
=== cut ===
1 , reLexx (? ), 11:32, 12/05/2011 [ответить ]
+ /–
При условии if ($MyN != 0) у меня выдавались слова "триллион миллиард" даже если чило умеет меньше разрядов. В результате сделал
($MyN > 1) - все заработало правильно.