[ create a new paste ] login | about

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

PHP, pasted on Oct 30:
<?php
error_reporting(-1);
mb_internal_encoding('utf-8');
 
/*ШАГ ПЕРВЫЙ - Вернуть массив числа*/

function returnNumberArray ($number) {
	if ($number <= 19 and $number >= 11) {
		$numbersArray = array($number);
		return $numbersArray;
	}
	$numbersArray = str_split($number, 1);
	$numbersArray = array_reverse($numbersArray);
	$countOfNumber = count($numbersArray);
	for ($i=0; $i<$countOfNumber; $i++) {
		if ($i == 0) {
			$numbersArray[$i] = $numbersArray[$i];
		}
		$numbersArray[$i] = $numbersArray[$i] * pow(10, $i);
	}
	$numbersArray = array_reverse($numbersArray);
	foreach ($numbersArray as $position => $number) {
		if ($number == 0 and $position !=0) {
			unset($numbersArray[$position]);
		}
	}
	return $numbersArray;
}

/* 
	ШАГ ВТОРОЙ - Преобразовать массив в текст и вернуть строку
	
    Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю, 
    если мы считаем число для мужского рода (один рубль), 
    и 1 — для женского (одна тысяча) 
*/
function smallNumberToText($numbersArray) {
 
    $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   =>  'две'
    );
	/* if ($isFemale > 0) {
			$spelling = array_replace($spelling, $femaleSpelling);
	} */
	
	$numbersArray = array_flip($numbersArray);
	$result = array_intersect_key($spelling, $numbersArray);
	krsort($result);
	$output = implode(" ", $result);
	return $output;
	
}
 
 /* 
	ШАГ ТРИ - определить склонение слова
	Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей 
 */
function inclineWord($numbersArray) {
	$word1 = "рубль";
	$word2 = "рубля";
	$word5 = "рублей";
	$number = implode('', $numbersArray);
	if ($number >= 11 and $number <=19) {
		return $word5;
	}
    $numberCount = count($numbersArray);
	$lastNumberKey = $numberCount - 1;
	$lastNumber = $numbersArray[$lastNumberKey];
	if ($lastNumber == 0 || $lastNumber >=5) {
		return $word5;
	} elseif ($lastNumber == 1) {
		return $word1;
	} elseif ($lastNumber > 0 and $lastNumber < 5) {
		return $word2;
	}
	
}
 
 /*
	ШАГ ЧЕТЫРЕ - Получить результат
 */
function numberToText($number) {
	$numbersArray = returnNumberArray($number);
	$wordNumber = smallNumberToText($numbersArray);
	$word = inclineWord($numbersArray);
	$result = "$wordNumber $word";
	return $result;
 
}
 
/*
	ШАГ ПОСЛЕДНИЙ - Вызов функции
	Вызовем функцию несколько раз 
 */
$amount1 = mt_rand(1,999);
$text1 = numberToText($amount1);
 
echo "На вашем счету {$text1}<br>";
 
$amount2 = mt_rand(1,999);
$text2 = numberToText($amount2);
 
echo "На вашем счету {$text2}<br>";
 
$amount3 = mt_rand(1,999);
$text3 = numberToText($amount3);
 
echo "На вашем счету {$text3}<br>";
 
$amount4 = mt_rand(1,999);
$text4 = numberToText($amount4);
 
echo "На вашем счету {$text4}<br>";

/*
ИТОГИ:
1) Ошибка в четвертом шаге при выпадании маленьких чисел, хотя склонение написано при этом верно
2) Числа от 0 до 999 (бета)
3) Некорректно отображается числа от 11 до 19 в трехзначных числах (Пятьсот десять два)
4) Может еще какие баги хз завтра гляну
*/
?>


Output:
1
2

Fatal error: Call to undefined function mb_internal_encoding() on line 3


Create a new paste based on this one


Comments: