- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
require_once 'number.php';
class numberspelling extends number {
//put your code here
private $spelling=array(
'nought'=>array(
'eng'=>'nought',
'ukr'=>'нуль',
'rus'=>'ноль'
),
'ones'=>array(
'eng'=>array("", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"),
'ukr'=>array("", "один", "два", "три", "чотири", "п`ять", "шість", "сім", "вісім", "дев`ять"),
'rus'=>array("", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять")
),
'teens'=>array(
'eng'=>array("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"),
'ukr'=>array("десять", "одинадцять", "дванадцять", "тринадцять", "чотирнадцять", "п`ятнадцять", "шістнадцять", "сімнадцять", "вісімнадцять", "дев`ятнадцять"),
'rus'=>array("десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать")
),
'ties'=>array(
'eng'=>array("", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"),
'ukr'=>array("", "десять", "двадцять", "тридцять", "сорок", "п`ятдесят", "шістдесят", "сімдесят", "вісімдесят", "дев`яносто"),
'rus'=>array("", "десять", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семдесят", "восемдесят", "девяносто")
),
'hundreds'=>array(
'eng'=>array("", "hundred", "two hundred", "three hundred", "four hundred", "five hundred", "six hundred", "seven hundred", "eight hundred", "nine hundred"),
'ukr'=>array("", "сто", "двісті", "триста", "чотириста", "п`ятсот", "шістсот", "сімсот", "вісімсот", "дев`ятсот"),
'rus'=>array("", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот")
)
);
private $greatnumbersspelling=array(
'thousands'=>array(
'eng'=>array("", "one thousand", "two thousand", "three thousand", "four thousand", "thousand"),
'ukr'=>array("", "одна тисяча", "дві тисячі", "три тисячі", "чотири тисячі", "тисяч"),
'rus'=>array("", "одна тысяча", "две тысячи", "три тысячи", "четыре тысячи", "тысяч")
),
'millions'=>array(
'eng'=>array("", "one million", "two million", "three million", "four million", "million"),
'ukr'=>array("", "один мільйон", "два мільйони", "три мільйони", "чотири мільйони", "мільйонів"),
'rus'=>array("", "один миллион", "два миллиона", "три миллиона", "четыре миллиона", "миллионов")
)
);
private $signspelling=array(
'negative'=>array(
'eng'=>'minus',
'ukr'=>'мінус',
'rus'=>'минус'
),
'positive'=>array(//для удобства изменения кода при необходимости
'eng'=>'',
'ukr'=>'',
'rus'=>''
)
);
private $language;
public function __construct($number, $language) {
parent::__construct($number);
$this->language=$language;
}
public function spell() {
//spelling
$result="";
if($this->sign==-1)
$result=$result.
$this->signspelling['negative'][$this->language]." ";
else $result.=$this->signspelling['positive'][$this->language]." ";
if(isset($this->digits[6])) {//разряд миллионов
for($i=1; $i<5; $i++) {
if($this->digits[6]==$i) {
$result.=$this->greatnumbersspelling['millions'][$this->language][$i]." ";
}
}
if($this->digits[6]>=5) {
$result.=$this->spelling['ones'][$this->language][$this->digits[6]]." ".$this->greatnumbersspelling['millions'][$this->language][5]." ";
}
}
if(isset($this->digits[5])) {//разряд сотен тысяч
$result.=$this->spelling['hundreds'][$this->language][$this->digits[5]]." ";
if(($this->digits[5]!=0)&($this->digits[4]==0)&($this->digits[3]==0)) $result.=$this->greatnumbersspelling['thousands'][$this->language][5]." ";
}
if(isset($this->digits[4])) {//разряд десятков тысяч
if($this->digits[4]>1) {
$result.=$this->spelling['ties'][$this->language][$this->digits[4]]." ";
if($this->digits[3]==0) $result.=$this->greatnumbersspelling['thousands'][$this->language][5]." ";
}
if($this->digits[4]==1) $result.=$this->spelling['teens'][$this->language][$this->digits[3]]." ".$this->greatnumbersspelling['thousands'][$this->language][5]." ";
}
if(isset($this->digits[3])) {//разряд тысяч
for($i=1; $i<5; $i++) {
if($this->digits[3]==$i) {
if(!isset($this->digits[4])||(isset($this->digits[4])&&$this->digits[4]!=1)) $result.=$this->greatnumbersspelling['thousands'][$this->language][$i]." ";
}
}
if($this->digits[3]>=5) {
if(!isset($this->digits[4])||(isset($this->digits[4])&&$this->digits[4]!=1))
$result.=$this->spelling['ones'][$this->language][$this->digits[3]]." ".$this->greatnumbersspelling['thousands'][$this->language][5]." ";
}
}
if(isset($this->digits[2])) {//разряд сотен
$result.=$this->spelling['hundreds'][$this->language][$this->digits[2]]." ";
Часть программы, которая преобразовывает целое число из промежутка [-9999999; 9999999] в текст (разговорный) на трех языках (Russian, Ukrainian, English). Состоит из трех классов. Это класс numberspelling - основной класс программы. Точнее его часть. Остальное - в следующем посте. Именно он преобразует цифру из уже имеющегося массива number в массив в произношение этой цифры на данном языке, в соответствии с её весом (той степенью числа 10, на которую она умножена). Например, если цифра 5 в уже имеющемся массиве стоит под номером 2, то она будет произносится "пятьсот". Напомню, номер элемента в массиве соответствует степени числа 10, на которую надо умножить элемент.
Например, в татарском «китапларымда» = «в моих книгах» ( -лар = множественное число, -ым = принадлежность, -да = место).
Или в удмуртском: «бригадирмылэнъёсызлэнъёсызлы» = «для тех, которые у тех, кто у нашего бригадира».
Но полная кошмарная жуть тут: https://clck.ru/9PW7r
В общем, в естественных языках можно насочинять столько форм, что даже ифкуиль позавидует.
Кто-нибудь в реальных разговорах генерирует динамически такие довольно противоречивые наслоения?
Помню, была какая-то задача про русский язык из серии "что сказал автор, пока курил", там было что-то вроде "министр отменил мораторий за запрет несоблюдения закона о непринятии отрицания мер протеста против уменьшения объёмов агентств по предупреждению конфликтов из-за отключения горячей воды".
P.S. Для ГК удобно. "Я, %username%, утверждаю, что в коде нет C++ и подтверждаю свой статус олдфага неразрывным написанием слова megszentségteleníthetetlenségeskedéseitekért."