Въведено число от клавиятурата в интервала от 1 до 1000, числото да се изведе словом.
Например: 123, се извежда като : сто, двадесет и три.
Задачата за преобразуването на число в думи не е тривиална, заради многото изключения в правилата за образуване на названията: Решението ми е грозно и може и да бърка на моменти, но е някакво начало:
$php slovom.php 0: нула 1: едно 2: две 3: три 10: десет 11: единадесет 12: дванадесет 15: петнадесет 23: двадесет и три 400: четиристотин 567: петстотин шестдесет и седем 120: сто и двадесет 121: сто двадесет и едно 123: сто двадесет и три 999: деветстотин деветдесет и девет 1000: хиляда
15: петдесет?
ОтговорИзтриванеКодът е оправен
ОтговорИзтриванеТози коментар бе премахнат от автора.
ОтговорИзтриванеclass NumMapper {
ОтговорИзтриванеprivate static $nums = array(
0 => '',
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six',
7 => 'seven',
8 => 'eight',
9 => 'nine',
10 => 'ten',
11 => 'eleven',
12 => 'twelve',
13 => 'thirteen',
15 => 'fifteen',
18 => 'eighteen',
20 => 'twenty',
30 => 'thirty',
50 => 'fifty',
80 => 'eighty',
1000 => 'one thousand'
);
private $num;
public function __construct($num) {
if ($num == 0) {
$this->num = 'zero';
return;
}
if (array_key_exists($num, self::$nums)) {
$this->num = self::$nums[$num];
return;
}
if ($num > 13 && $num < 20) {
$this->num = self::$nums[($num % 10)] . 'teen';
return;
}
if ($num < 100) {
if ($num % 10 == 0) {
$this->num = self::$nums[$num/10] . 'ty';;
return;
}
$tens = (int) ($num/10);
$tens = array_key_exists($tens . '0', self::$nums) ? self::$nums[$tens . '0'] . ' ' : self::$nums[(int)$num/10] . 'ty ';
$this->num = $tens . self::$nums[$num%10];
return;
}
if ($num % 100 == 0) {
$this->num = self::$nums[$num/100] . ' hundread';
return;
}
$hundreads = self::$nums[$num/100] . ' hundread and ';
$reminder = substr($num,1);
if (isset(self::$nums[$reminder])) {
$this->num = $hundreads . self::$nums[$reminder];
return;
}
if ($reminder > 13 && $reminder < 20) {
$this->num = $hundreads . self::$nums[($reminder % 10)] . 'teen';
return;
}
if ($reminder % 10 == 0) {
$this->num = $hundreads . self::$nums[$reminder/10] . 'ty';
return;
}
if ($reminder[0] == '0') {
$this->num = $hundreads . self::$nums[$reminder%10];
return;
}
$tens = (int) ($reminder/10);
$tens = array_key_exists($tens . '0', self::$nums) ? self::$nums[$tens . '0'] . ' ' : self::$nums[(int)$reminder/10] . 'ty ';
$this->num = $hundreads . $tens . self::$nums[$reminder%10];
}
public function __toString() {
return $this->num;
}
}
// test
$nums = array();
for ($i = 0; $i < 100; $i++) {
$nums[] = rand(0, 1000);
}
foreach ($nums as $n) {
echo $n . ': ' . new NumMapper($n) . '
';
}