Sas

 
<<< Назад

Скрипт перевода числа текстом(два/три..) в число (2/3)

Скрипт найден на просторах интернета и представляет интерес только для обращения к системе голосом
Использование:

$d=$matches[2];  //передаем два или 2
//$d="одна тысяча девятьсот третьем году"; //Тест
//$d="в две тысячи девятьсот тринадцатом году";//Тест
if(!is_numeric($d)){ //проверяем если не число то скармливаем текст скрипту
include_once "php/include/w2dig.php"; //путь к файлу скрипта
$d=strToNum($d); //функция перевода текста в число из подключаемого файла
sayReply("$d,"1);

Сам скрипт w2dig.php:

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

    );
    $units = array(
        'тысяч'   =>1000,
                'тысячи'   =>1000,
        'тысячный' =>1000,
        'миллион' =>1000000,
        'миллионов' =>1000000,
        'миллионный' =>1000000,
        'миллиард'=>1000000000,
        'миллиардов'=>1000000000,
        'миллиардный'=>1000000000,
    );
    //
    $a = explode(' ', trim(preg_replace('/\s{2,}/',' ', $s )));
    $io = $i3 = 0;
    foreach($a as $k=>$v) {
        if (isset($dict[$v])) { // digit
            $i3 += (int)$dict[$v];
        }
        else {
            foreach($units as $uk=>$uv) {
                if (strpos($v,$uk)!==false) { // unit found!
                    $io += $i3*$uv;
                    $i3=0;
                    break;
                }
            }//foreach
        }
    }//foreach
    $io += $i3;
    return join(' ',str_split($io,7)); // or RETURN $io;
}

Написал второй вариант который работает от обратного. т.е ищет массивом по словам
Теперь должен находить всё. тестируйте

<?php

function strToNum($s) {
    $d = array(
        'нол'=>0,'нул'=>0,'ровно'=>0
        ,'один'=>1,'одн'=>1,'перв'=>1
        ,'дв'=>2,'втор'=>2
        ,'тр'=>3
        ,'четыр'=>4,'четверт'=>4
        ,'пят'=>5
        ,'шест'=>6
        ,'сем'=>7,'седь'=>7
        ,'восем'=>8,'восьм'=>8
        ,'девят'=>9
        ,'десят'=>10
        ,'одиннадц'=>11
        ,'двенадцат'=>12
        ,'тринадцат'=>13
        ,'четырнадцат'=>14
        ,'пятнадцат'=>15
        ,'шестнадцат'=>16
        ,'семнадцат'=>17
        ,'восемнадцат'=>18
        ,'девятнадцат'=>19
        ,'двадцат'=>20
        ,'тридцат'=>30
        ,'сорок'=>40
        ,'пятьдесят'=>50,'пятидесят'=>50
        ,'шестьдесят'=>60,'шестидесят'=>60
        ,'семьдесят'=>70,'семидесят'=>70
        ,'восемьдесят'=>80,'восьмидесят'=>80
        ,'девяност'=>90
        ,'сто'=>100,'сот'=>100
        ,'двест'=>200,'двухсот'=>200
        ,'трист'=>300,'трехсот'=>300
        ,'четырест'=>400,'четырехсот'=>400
        ,'пятьсот'=>500,'пятисот'=>500
        ,'шестьсот'=>600,'шестисот'=>600
        ,'семьсот'=>700,'семисот'=>700
        ,'восемьсот'=>800,'восьмисот'=>800
        ,'девятьсот'=>900,'девятисот'=>900     
    );
    $units = array(
        'тысяч'   =>1000,
        'миллион' =>1000000,
        'миллиард'=>1000000000,
        );

    $a = explode(' ', trim(preg_replace('/\s{2,}/',' ', $s )));
    $io = $i3 = 0;
    foreach( $a as $s) {
        foreach(array_reverse($d) as $w=>$v ) {
            if(preg_match("/^$w/",$s)){
                $i3 += (int)$v;
                break;
            }else {
                foreach($units as $uk=>$uv) {
                    if (strpos($s,$uk)!==false) { 
                        $io += $i3*$uv;
                        $i3=0;
                        break;
                    }
                }
            }
        }
    }
    $io += $i3;
    return join(' ',str_split($io,10));
}

Пример получения числа вторым скриптом

<?php
include_once 'w2dig.php';

$str='двадцать одна тысяча пятьсот семьдесят шесть';
$dig=strToNum($str);
echo "$dig";  \\21576

Обсуждение (4) (6)

Смотрите так же:
01.07.2018 Скрипт анекдотов
11.06.2018 Проверка подключения/отключения устройства к wifi сети из сислога роутера

Люберцы, Россия

На форуме: Sas