Фэндом

Банк скриптов для голосового движка Festival Wiki

Числа прописью

13статей на
этой вики
Добавить новую страницу
Обсуждение1 Поделиться

Скрипт для написания количественных числительных в заданом роде:

number_case.php:

#!/usr/bin/php
<?php
    // remove + if you don't need it, it slows doen rendering
    global $N0, $Ne0, $Ne1, $Ne2, $Ne3, $Ne6;
    $N0    = 'н+оль';
    $Ne0   = array(
         0 => array( "","од+ин","дв+а","тр+и","чет+ыре","п+ять","ш+есть",
                    "с+емь","в+осемь","д+евять","д+есять","од+иннадцать",
                    "двен+адцать","трин+адцать","чет+ырнадцать","пятн+адцать",
                    "шестн+адцать","семн+адцать","восемн+адцать","девятн+адцать"),
         1 => array( "","одн+а","дв+е","тр+и","чет+ыре","п+ять","ш+есть",
                    "с+емь","в+осемь","д+евять","д+есять","од+иннадцать",
                    "двен+адцать","трин+адцать","чет+ырнадцать","пятн+адцать",
                    "шестн+адцать","семн+адцать","восемн+адцать","девятн+адцать"),
         2 => array( "","одн+о","дв+е","тр+и","чет+ыре","п+ять","ш+есть",
                    "с+емь","в+осемь","д+евять","д+есять","од+иннадцать",
                    "двен+адцать","трин+адцать","чет+ырнадцать","пятн+адцать",
                    "шестн+адцать","семн+адцать","восемн+адцать","девятн+адцать")
    );
    $Ne1   = array(   "","д+есять","дв+адцать","тр+идцать","с+орок","пятьдес+ят",
                    "шестьдес+ят","с+емьдесят","в+осемьдесят","девян+осто");
    $Ne2   = array(   "","сто","дв+ести","тр+иста","чет+ыреста","пятьс+от",
                    "шестьс+от","семьс+от","восемьс+от","девятьс+от");
    $Ne3   = array(1 => "т+ысяча", 2 => "т+ысячи", 5 => "т+ысяч");
    $Ne6   = array(1 => "милли+он", 2 => "милли+она", 5 => "милли+онов");
    
    
    function written_number($i, $female) {
        global $N0;
        if ( ($i<0) || ($i>=1e9) || !is_int($i) ) {
            return false; // Аргумент должен быть неотрицательным целым числом, не превышающим 1 миллион
        }
        if($i==0) {
            return $N0;
        }
        else {
            return preg_replace( array("/s+/","/\s$/"),
            array(" ",""),
            num1e9($i, $female));
            return num1e9($i, $female);
        }
    }
    
    function num_125($n) {
        /* форма склонения слова, существительное с числительным склоняется
        одним из трех способов: 1 миллион, 2 миллиона, 5 миллионов */
        $n100 = $n % 100;
        $n10 = $n % 10;
        if( ($n100 > 10) && ($n100 < 20) ) {
            return 5;
        }
        elseif( $n10 == 1) {
            return 1;
        }
        elseif( ($n10 >= 2) && ($n10 <= 4) ) {
            return 2;
        }
        else {
            return 5;
        }
    }
    
    function num1e9($i, $female) {
        global $Ne6;
        if($i<1e6) {
            return num1e6($i, $female);
        }
        else {
            return num1000(intval($i/1e6), false) . " " .
            $Ne6[num_125(intval($i/1e6))] . " " . num1e6($i%1e6, $female);
        }
    }
    
    function num1e6($i, $female) {
        global $Ne3;
        if($i<1000) {
            return num1000($i, $female);
        }
        else {
            return num1000(intval($i/1000), true) . " " .
            $Ne3[num_125(intval($i/1000))] . " " . num1000($i%1000, $female);
        }
    }
    
    function num1000($i, $female) {
        global $Ne2;
        if( $i<100) {
            return num100($i, $female);
        }
        else {
            return $Ne2[intval($i/100)] . (($i%100)?(" ". num100($i%100, $female)):"");
        }
    }
    
    function num100($i, $female) {
        global $Ne0, $Ne1;
            $gender = $female;
        if ($i<20) {
            return $Ne0[$gender][$i];
        }
        else {
            return $Ne1[intval($i/10)] . (($i%10)?(" " . $Ne0[$gender][$i%10]):"");
        }
    }
    
    $gen=($argv[1]=="female")?1:(($argv[1]=="mid")?2:0);
    $num_=(int)$argv[2];
    echo written_number($num_,$gen);
?>

Даем права выполнения:

$ chmod u+x number_case.php

Пример использования:

$ ./number_case.php female 2
две
$ ./number_case.php male 2
два
$ ./number_case.php mid 1
одно

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики