ФЭНДОМ


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

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
одно