[ create a new paste ] login | about

Link: http://codepad.org/pG9rHz2m    [ raw code | output | fork ]

PHP, pasted on Aug 18:
<?php

// Staring straight up into the sky ... oh my my
error_reporting(-1);
//mb_internal_encoding('utf-8');
header("Content-Type: text/plain; charset=UTF-8");

/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord($number, $word1, $word2, $word5) {
    $numLastDigits = $number % 100;
    if (!($numLastDigits > 10 && $numLastDigits < 20)) {
        if (($numLastDigits % 10) == 1) {
            return $word1;
        } elseif (($numLastDigits % 10) > 1 && ($numLastDigits % 10) < 5) {
            return $word2;
        } else {
            return $word5;
        }
    } else {
        return $word5;
    }
}

/* 
    Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю, 
    если мы считаем число для мужского рода (один рубль), 
    и 1 — для женского (одна тысяча) 
*/
function smallNumberToText($number, $isFemale) {

    $spelling = array(
        0   =>  'ноль',                                     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  =>  'девятнадцать'    
    );
    
    $femaleSpelling = array(
        1   =>  'одна',        2   =>  'две'
    );

    $number = intval($number);

    $result = array();

    if ($number < 20) {
        if ($isFemale && $number <= 2 && $number > 0) {
        $result[] = $femaleSpelling[$number];
        } else {
        $result[] = $spelling[$number];
        }
    } else {
            $numberLastDigit = $number % 10;
            $numberTens = $number % 100;

            $numberTensRound = $numberTens - $numberLastDigit;
            $numberHunsRound = $number - $numberTens;

        if ($number >= 20 && $number < 100) {
            $result[] = $spelling[$numberTensRound];

            if ($numberLastDigit != 0) {
                if ($isFemale && $numberLastDigit <= 2) {
                $result[] = $femaleSpelling[$numberLastDigit];
                } else {
                $result[] = $spelling[$numberLastDigit];
                }
            }   
        } elseif ($number >= 100) {
            $result[] = $spelling[$numberHunsRound];
            if ($numberTens != 0 ) {
                if ($numberTens < 20 || ($numberTens % 10) == 0) {
                    $result[] = $spelling[$numberTens];
                } else {
                    $result[] = $spelling[$numberTensRound];
                    if ($isFemale && $numberLastDigit <= 2) {
                    $result[] = $femaleSpelling[$numberLastDigit];
                    } else {
                    $result[] = $spelling[$numberLastDigit];
                    }  
                }
            }
        }
    }
    $result = implode(" ", $result);
    return $result;
}

function numberToText($number) {
    if ($number == 0) {
        return 'ноль (0) рублей';
    }
    $number = number_format($number);
    $numberSplit = preg_split('/,/', $number);

    $i = count($numberSplit);

    $result = array();

    foreach($numberSplit as $num) {
        $fem = 0;
        $add = ' ';

        if ($i == 3) {
            $add .= inclineWord($num, "миллион", "миллиона", "миллионов");
        } elseif ($i == 2) {
            $fem = 1;
            $add .= inclineWord($num, "тысяча", "тысячи", "тысяч");
        } else {
            $add = '';
        }

        $i--;

        if ($num == 0) {
            continue;
        }
            $result[] = smallNumberToText($num, $fem) . "$add";

    }
    $add = "($number) " . inclineWord($num, "рубль", "рубля", "рублей");
    $result = implode(" ", $result) . " $add";
    return $result;
}

/* Вызовем функцию несколько раз */

for ($i=0; $i<20; $i++) {
    $rand = mt_rand(1, 9999999) * $i;
    echo numberToText($rand) . "\n\n";
}

echo numberToText(10000) . "\n\n";
echo numberToText(10010) . "\n\n";
echo numberToText(1001001) . "\n\n";
echo numberToText(1001000) . "\n\n";
echo numberToText(1000001) . "\n\n";


Output:
ноль (0) рублей

шесть миллионов девятьсот пятьдесят три тысячи восемнадцать (6,953,018) рублей

тринадцать миллионов сто восемь тысяч сто восемьдесят (13,108,180) рублей

девятнадцать миллионов семьсот шестьдесят три тысячи триста сорок девять (19,763,349) рублей

тридцать два миллиона четыреста девяносто тысяч пятьсот сорок (32,490,540) рублей

двадцать четыре миллиона сорок три тысячи девятьсот пятьдесят (24,043,950) рублей

тридцать три миллиона шестьсот шестьдесят две тысячи пятьсот шестьдесят восемь (33,662,568) рублей

пятьдесят девять миллионов шестьдесят шесть тысяч пятьсот девяносто пять (59,066,595) рублей

шестнадцать миллионов пятьдесят пять тысяч пятьсот семьдесят шесть (16,055,576) рублей

шестьдесят четыре миллиона четыреста семьдесят две тысячи сто три (64,472,103) рубля

тринадцать миллионов сто девяносто четыре тысячи девятьсот девяносто (13,194,990) рублей

шестьдесят три миллиона девятьсот пятнадцать тысяч пятьсот семьдесят семь (63,915,577) рублей

сто восемь миллионов сто два тысячи тридцать шесть (108,102,036) рублей

пятьдесят пять миллионов девятьсот тридцать семь тысяч восемьсот шестьдесят девять (55,937,869) рублей

пятьдесят миллионов двести шестьдесят три тысячи восемьсот девяносто два (50,263,892) рубля

восемьдесят четыре миллиона пятьсот восемьдесят шесть тысяч пятьсот (84,586,500) рублей

двадцать семь миллионов двести семьдесят четыре тысячи восемьсот тридцать два (27,274,832) рубля

сто шестьдесят два миллиона семьсот тридцать пять тысяч шестьсот семьдесят девять (162,735,679) рублей

двадцать шесть миллионов сто тридцать шесть тысяч семьсот двадцать (26,136,720) рублей

семьдесят шесть миллионов шестьсот двадцать одна тысяча семьсот семьдесят пять (76,621,775) рублей

десять тысяч (10,000) рублей

десять тысяч десять (10,010) рублей

один миллион одна тысяча один (1,001,001) рубль

один миллион одна тысяча (1,001,000) рублей

один миллион один (1,000,001) рубль



Create a new paste based on this one


Comments: