PHP « Пишем функцию перевода чисел в строки (33 -> Тридцать три) на php и js

Помогите написать функцию, которая получает число с типом (double), например 33.61, а возвращает строку "Тридцать три рубля 61 копейка". Число можно передать любое. Есть мысли как реализовать на PHP или Javascript?

1 ответов


Могут быть ошибки, как пример пойдет.


$rubl = array("рубль","рубля","рублей");
$cops = array("копейка","копейки","копеек");
$thousand = array(
  array(),
  array("тысяча","тысячи","тысяч"),
  array("миллион","миллиона","миллионов")
);
$words = array(
  0 => array("", "один","два","три","четыре"),
  1 => array("", "десять","двадцасть","тридцать","сорок","пятдесят","шестьдесят","семдесят","восемдесят","девяносто","","одинадцать","двенадцать","тринадцвть","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"),
  2 => array("", "сто", "двести", "триста"),
  3 => array("", "одна", "две", "три")
);

$float    = 3318.61;
$integer  = (string)(int)$float;
$fraction = (string)(int)(($float*100)%100);

$str  = array();
$size = strlen($integer);
$degree = 0;
do {
  --$size;
  $num = (int)substr($integer, $size, 1);
  $tens = ($integer%100);
  if($tens>10 && $tens<20 && $degree < 2){
    if($degree == 0){
      --$size;
      ++$degree;
      $str[] = $words[$degree][$tens];
    }
  } else {
    $t = NULL;
    if($degree){
      if($degree%3 == 0){
        $t = $thousand[$degree/3];
      }
    }
   
    if($t){
      $str[] = num2word($num, $t);
    }
   
    $str[] = $words[$degree][$num];
   
  }
 
  ++$degree;
 
 
} while($size);

echo @implode(" ", array_reverse($str))." ".num2word($integer, $rubl)." ".$fraction." ".num2word($fraction, $cops)."\n";
// три тысячи триста восемнадцать рублей 61 копейка
// ---------------------
function num2word($num,$words) {
  $num=$num%100;
  if ($num>19) { $num=$num%10; }
  switch ($num) {
    case 1:  { return($words[0]); }
    case 2: case 3: case 4:  { return($words[1]); }
    default: { return($words[2]); }
  }
}