>Может кто когда нибудь делал на
>перле или пхп или ещё
>на чём конвертацию 1345 в
>"одна тысяча триста сорок пять"
>?
>rкиньте в меня сэмплом, плз.
############################################################################
# Ниже расположены функции перевода числового написания в строчное
sub RubKopPropis{
my $self = shift if (ref($_[0]));
my $n = shift;
return dbtostr($n,4|8|1,1);
}
sub RubPropis
{
my $self = shift if (ref($_[0]));;
my $n = shift;
return dbtostr($n,4|1,1);
}
sub numberform{
my $n = shift;
$n %= 100;
($n>=10) and ($n<=20) and (return 3); # тысяч
$n %= 10;
($n==1) and (return 1); # тысяча
($n>1) and ($n<=4) and (return 2); # тысячи
return 3; # тысяч
}
sub numtostr($$)
{
my $val = shift;
my $gender = shift;
my @unit1_2 = ( "одно","два","три","четыре","пять","шесть","семь","восемь","девять");
my @unit1_0 = ( "одна","две","три","четыре","пять","шесть","семь","восемь","девять");
my @unit1 = ( "один","два","три","четыре","пять","шесть","семь","восемь","девять");
my @unit11 = ( "десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",
"шестнадцать","семнадцать","восемнадцать","девятнадцать");
my @unit10 = ( "","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто");
my @unit100 = ( "сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот");
($val <= 0 or $val > 999) and (return "ноль ");
my $ret_str;
($val >= 100) and ($ret_str = $unit100[$val/100 - 1] . ' ');
$val %= 100;
($val >= 10) and ($val < 20) and ($ret_str .= $unit11[$val] . ' ') and (return $ret_str);
($val >= 20) and ($ret_str .= $unit10[$val/10 - 1] . ' ');
$val %= 10;
if ($val > 0) {
if ($gender==1) {
$ret_str .= $unit1[$val - 1] . ' ';
}
elsif ($gender==0) {
$ret_str .= $unit1_0[$val - 1] . ' ';
}
else {
$ret_str .= $unit1_2[$val - 1] . ' ';
}
}
return $ret_str;
}
sub dbtostr($$$)
{
my ($numb,$option,$gender) = @_;
my $next_number; # Оставшееся число
my $curr_number; # Текущее число
my $cents;
my $dollars;
my $KOP=8;
my $DENGA=4;
my $UPPER_1ST = 1;
my $UPPER_ALL = 2;
my @thou = ("тыс. ","тысяча ","тысячи ","тысяч ");
my @mill = ("млн. ","миллион ","миллиона ","миллионов ");
my @mlrd = ("млрд. ","миллиард ","миллиарда ","миллиардов ");
my @rub = ("руб. ","рубль ","рубля ","рублей ");
my @kop = (" коп. "," копейка "," копейки "," копеек ");
my $ret_str;
my $centstr;
if ($numb < 0) {
$ret_str = "минус ";
$numb = -$numb;
}
if ($numb >= 1e12) {
$ret_str ="очень много ";
return $ret_str;
}
$dollars = int($numb);
$cents = $numb - $dollars;
if ($option & $DENGA) {
$cents = int($cents*100+0.5);
$centstr = sprintf("d", $cents);
}
if ($dollars == 0) {
if ($option & $DENGA) {
$ret_str .= "ноль руб. ";
$ret_str .= $centstr;
$ret_str .= " коп.";
}
else {
$ret_str .= "ноль ";
}
return $ret_str;
}
$next_number = $dollars;
$curr_number = int($next_number / 1000000000) ;
if ($curr_number > 0) {
$ret_str .= numtostr($curr_number, 1);
$ret_str .= $mlrd[numberform($curr_number,$option)];
$next_number = $next_number - $curr_number*1000000000;
}
$curr_number = int($next_number / 1000000) ;
if ($curr_number > 0) {
$ret_str .= numtostr($curr_number, 1);
$ret_str .= $mill[numberform($curr_number,$option)];
$next_number = $next_number - $curr_number*1000000;
}
$curr_number = int($next_number / 1000) ;
if ($curr_number > 0) {
$ret_str .= numtostr($curr_number, 0);
$ret_str .= $thou[numberform($curr_number,$option)];
$next_number = $next_number - $curr_number*1000;
}
$curr_number = $next_number;
($curr_number > 0) and ($ret_str .= numtostr($curr_number, $gender));
($option & $DENGA) and ($ret_str .= $rub[numberform($curr_number,$option)]);
if ($option & $KOP ) {
$ret_str .= $centstr;
$ret_str .= $kop[0];
}
if ($option & ($UPPER_1ST|$UPPER_ALL)) {
if ($option & $UPPER_ALL) {
$ret_str = uc($ret_str);
}
if ($option & $UPPER_1ST) {
my $s = uc(substr($ret_str,0,1));
$ret_str = $s . substr($ret_str,1);
}
}
return $ret_str;
}