| 
            |  |  | 
            | Raven Пользователь
 
 Откуда: Владик
 Регистрация: Февр. 2004
 
 Всего: 408 сообщений
 | Итак, начинаю потихоньку выносить на форум содержимое TeamX-Tech. В хронологическом порядке и с переосмыслением :-) Исследованием это не назовёшь - зато наработка :-)
 
 Сегодняшняя тема: Генерация правильных окончаний при использовании чисел в диалогах.
 
 Предположим, ваш критер должен назвать число - денег, дней - чего угодно. Число генерируется автоматически, не прописано заранее. После числа - наименование подсчитанного объекта: напр., 15 дней.
 
 Скорее всего, вы сделаете это так (пусть get_value - процедура-генератор числа):
 
 display_msg(get_value+" дней");
 
 Неприятность в том, что если get_value вернёт 1, 2, 3, 24, 51 и т.д. вы получите царапающее глаза "1 дней", "24 дней" и т.д.
 
 Для борьбы с этим можно воспользоваться такой вот процедурой:
 -------------------------------------
 procedure generate_ending(variable num) begin
 variable last_digit;  //последняя цифра
 variable tens_last_digit; //предпоследняя цифра
 
 last_digit:=days%10;
 tens_last_digit:=days%100-last_digit;
 
 //1 день, 21 день, но 11 *дней*. Т.е. если tens_last_digit==1, то окончание "дней"
 if  last_digit==1 and
 (tens_last_digit>1 or tens_last_digit==0)
 then return days+mstr(100);
 
 //Выбираем окончание
 else if last_digit>=2 and last_digit<=4 and
 (tens_last_digit>1 or tens_last_digit==0)
 then return days+mstr(101);
 
 else return days+mstr(102);
 end
 -------------------------------------
 -------------------------------------
 {100}{}{ день}
 {101}{}{ дня}
 {102}{}{ дней}
 -------------------------------------
 
 Меняем первоначальный вариант на:
 
 display_msg(generate_days(get_value));
 
 и всё.
 
 Теперь будет "21 день", "54 дня", "714 дней"и даже  "2567821 день" :-)
 
 Аналогично - для монет, патронов и чего угодно ещё. Для этого не придётся менять ничего, кроме msg-файла.
 |  | Отправлено: 10:44 - 25 Янв., 2005
 |  |  | 
            | Oleg1969 Пользователь
 
 Откуда: Саратов
 Регистрация: Май 2006
 
 Всего: 168 сообщений
 | Извините, что поднимаю старую тему, но данный скрипт нормально не работает...
  Попробуйте ему скормить цифирь 14 или 13... 
 Будет работать тока если заменить на
 
 tens_last_digit:=(days%100-last_digit)/10;
 
 или на
 
 (tens_last_digit>10 or tens_last_digit==0)
 
 тогна нормальное окончание выводит...
 
 -----
 За сим прощаюсь, Олег.
 |  | Отправлено: 15:45 - 3 Авг., 2006
 |  |  |  |  |