Перевод чисел в текстовый вариант

174
06 февраля 2020, 14:20

Сразу предупреждаю - у меня очень плохой код (надеюсь,пока что),ваша помощь будет заключаться не в том,чтобы скинуть мне ссылку на код с ООП,весь такой красивый,чтобы я ничего не понял,вы поможете если найдете решение именно в моем говнянном коде. Суть в том,что необходимо было написать программу,переводящую число до 1000 000 не включительно в текстовой вариант,соблюдая падежи и красоту,число вводится в сам код.Проблема в том,что у меня не получатся засунуть слова ОДНА и ДВЕ так,как нужно($jenskchisla-массив,не могу применить правильно),остальное (наверное) работает,помогите понять,как это сделать.

<?php
mb_internal_encoding('utf-8');
function Osnova($text)
{

$chisla= array (                                   10  =>  'десять',       100 =>  'сто',
        1   =>  'один',         11  =>  'одиннадцать',      20  =>  'двадцать',     200 =>  'двести',
        2   =>  'два',          12  =>  'двенадцать',       30  =>  'тридцать',     300 =>  'триста',
        3   =>  'три',          13  =>  'тринадцать',       40  =>  'сорок',        400 =>  'четыреста',
        4   =>  'четыре',       14  =>  'четырнадцать',     50  =>  'пятьдесят',    500 =>  'пятьсот',
        5   =>  'пять',         15  =>  'пятнадцать',       60  =>  'шестьдесят',   600 =>  'шестьсот',
        6   =>  'шесть',        16  =>  'шестнадцать',      70  =>  'семьдесят',    700 =>  'семьсот',    
        7   =>  'семь',         17  =>  'семнадцать',       80  =>  'восемьдесят',   800 =>  'восемьсот',
        8   =>  'восемь',       18  =>  'восемнадцать',     90  =>  'девяносто',     900 =>  'девятьсот',
        9   =>  'девять',       19  =>  'девятнадцать'   , 

);
$jenskchisla= array (
1 => 'одна' ,2   =>  'две'
);
$bro=array(); // создаем массив под готовую строку 
$text=str_split ($text,PREG_SPLIT_NO_EMPTY); // разделяем вводимый пользователем текст на массив 
echo "<br><br>";

if ( count($text)==3 ){ // если колличество элементов массива равно 3 (значит сотни)
     $kof=100; //задаем коэффициент на который нужно умножать чтобы получились сотни и десятки 
for ($i=0;$i<count($text);$i++){ //цикл прохода по каждому элементу массива 
    $k=($text[$i]); //записываем элемент массива в переменную-ключ для соответствия с массивом чисел 
    $k=$k*$kof; //умножаем на коэфффиуиент 
    $kof=($kof*0.1);    //изменяем коэффициент  
    $bro[$i]=$chisla[$k]; // записываем в новый массив слово из массива числен с соответствующим значением 
}
$bro=implode(" ",$bro);// собираем итоговый массив слов в строку 
}
if ( count($text)==2 ){ // если колличество элементов массива равно 3 (значит сотни)
$kof=10; //задаем коэффициент на который нужно умножать чтобы получились сотни и десятки 
for ($i=0;$i<count($text);$i++){ //цикл прохода по каждому элементу массива 
    $k=($text[$i]); //записываем элемент массива в переменную-ключ для соответствия с массивом чисел 
    $k=$k*$kof; //умножаем на коэфффиуиент 
    $kof=($kof*0.1);    //изменяем коэффициент 
    $bro[$i]=$chisla[$k]; // записываем в новый массив слово из массива числен с соответствующим значением 
}
$bro=implode(" ",$bro);// собираем итоговый массив слов в строку 
}

if ( count($text)==1 ){ // если колличество элементов массива равно 3 (значит сотни)
for ($i=0;$i<count($text);$i++){ //цикл прохода по каждому элементу массива 
    $k=($text[$i]); //записываем элемент массива в переменную-ключ для соответствия с массивом чисел    
    $bro[$i]=$chisla[$k]; // записываем в новый массив слово из массива числен с соответствующим значением 
}
$bro=implode(" ",$bro);// собираем итоговый массив слов в строку 
}
return $bro;
}




function PoTri($text){   
    if(($text)==0){
        echo "Введен ноль";
        end;
    }
    $result=strrev($text);  // переворачиваем сроку 
    $result = str_split($result, 3); // разделяем эту строку по 3 элемента 
    foreach ($result as $key=>$value){
        $result[$key]=strrev($result[$key]); //проходимся по массиву и переворачиваем каждый элемент 
    }
    $reversed = array_reverse($result);
if(count($reversed)==2){ //если в массиве 2 числа 
        $a=Osnova($reversed[0]);// вызываем функцию озвучивания числа первого элемента 
        $c=Tis($reversed[0]); //вызываем функицю определения последнего элемента с добавлением тысячи 
        $b=Osnova($reversed[1]);// вызываем функцию озвучивания числа второго элемента
$rEZ=$a.' '.$c.' '.$b;      
}
    if(count($reversed)==1){ //если в массиве 1 числа 
        $b=Osnova($reversed[0]);// вызываем функцию озвучивания числа второго элемента
$rEZ=$b;        
}
    return $rEZ;
}



function Tis($t){
    $v= str_split ($t,PREG_SPLIT_NO_EMPTY); //разделяем элемент массива на массив 
    $reversed1 = array_reverse($v); //переворачиваем массив
    foreach ($reversed1 as $key=>$value){ //проходим по массиву и сравниваем первый элемент с числом,далее заканчиваем цикл 
        if (($reversed1[0]==0)||($reversed1[0]==5)||($reversed1[0]==6)||($reversed1[0]==7)||($reversed1[0]==8)||($reversed1[0]==9))
        {
    $t='тысяч';
        }
    if (($reversed1[0]==2)||($reversed1[0]==3)||($reversed1[0]==4))
        {
    $t='тысячи';
        }
        if ($reversed1[0]==1){
            $t='тысяча';
        }
    end;
    }
    return $t;
}

$text='10000';
$b=PoTri($text);
 echo " Введенный пользователем текст:$text <br>";
 echo " На вашем счету: $b <br>";

`
Answer 1

Источник Habr

/**
 * Возвращает сумму прописью
 * @author runcore
 * @uses morph(...)
 */
function num2str($num) {
    $nul='ноль';
    $ten=array(
        array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
        array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
    );
    $a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
    $tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
    $hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
    $unit=array( // Units
        array('копейка' ,'копейки' ,'копеек',    1),
        array('рубль'   ,'рубля'   ,'рублей'    ,0),
        array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
        array('миллион' ,'миллиона','миллионов' ,0),
        array('миллиард','милиарда','миллиардов',0),
    );
    //
    list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
    $out = array();
    if (intval($rub)>0) {
        foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
            if (!intval($v)) continue;
            $uk = sizeof($unit)-$uk-1; // unit key
            $gender = $unit[$uk][3];
            list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
            // mega-logic
            $out[] = $hundred[$i1]; # 1xx-9xx
            if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
            else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
            // units without rub & kop
            if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
        } //foreach
    }
    else $out[] = $nul;
    $out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
    $out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
    return trim(preg_replace('/ {2,}/', ' ', join(' ',$out)));
}
/**
 * Склоняем словоформу
 * @ author runcore
 */
function morph($n, $f1, $f2, $f5) {
    $n = abs(intval($n)) % 100;
    if ($n>10 && $n<20) return $f5;
    $n = $n % 10;
    if ($n>1 && $n<5) return $f2;
    if ($n==1) return $f1;
    return $f5;
}

С версии 5.3 есть решение

$f = new NumberFormatter("ru", NumberFormatter::SPELLOUT);
echo $f->format(123456);// сто двадцать три тысяч четыреста пятьдесят шесть
READ ALSO
Как передать переменную в php с помощью axios

Как передать переменную в php с помощью axios

Никак не могу разобраться как передать данные собранные с помощью Vuejs в php переменную

151
Безопасность при загрузке фото

Безопасность при загрузке фото

Что я не учёл для соблюдения безопасности при загрузки файла на сервер?

184
Ограниченный вывод в цикле

Ограниченный вывод в цикле

Добрй деньЕсть код, который выводит пагинацию на сайте

153
Как реализовать поиск по txt файлу? VK API PHP

Как реализовать поиск по txt файлу? VK API PHP

Суть проблемы/идеи такова

191