The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Из циферок в буковки"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Из циферок в буковки"
Сообщение от Vasily emailИскать по авторуВ закладки on 13-Фев-02, 18:10  (MSK)
Приветствую All!
Может кто когда нибудь делал на перле или пхп или ещё на чём конвертацию 1345 в "одна тысяча триста сорок пять" ?
rкиньте в меня сэмплом, плз.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Из циферок в буковки"
Сообщение от mix Искать по авторуВ закладки on 14-Фев-02, 15:11  (MSK)
есть на php. переделать думаю сможешь...

http://www.php.spb.ru/php/propis.html

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Из циферок в буковки"
Сообщение от uldus Искать по авторуВ закладки on 14-Фев-02, 17:33  (MSK)
>Может кто когда нибудь делал на
>перле или пхп или ещё
>на чём конвертацию 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;

}

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру