Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Партизан

Оценить эту запись

Termination

Запись от Партизан размещена 27.11.2010 в 15:01

Часто бывает необходимым вывести юзеру количество чего-либо, например найденного с помощью поиска(в последнем моем случае, это были рекламные конструкции). И тут подстерегает засада. Окончание этих самых конструкци[й], потому как различать нужно где одна конструкци[я], а где к примеру, целых две конструкци[и]. Когда-то, еще на as2, я писал функцию которая справлялась с этим на ура. Чем я и решил воспользоваться и на этот раз.

0 конструкци[й]
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 конструкци[й]

Это результат исполнения теста этого класса: (Termination.test('конструкци',['я', 'й', 'и']))
Код AS3:
package utils
{
	/**
	 * ...
	 * @author Mikhail Klabukov (SaintPartizan) Q_QWERT@mail.ru
	 *
	 *
	 */
	public class Termination
	{
		public static function check(number:int,terminations:Array):String {
			var nb:String = String(number);
			var num:uint;
			var v:Number = Number(nb.substr(-1, 1));
			if (Number(nb.substr(-2, 2))>=20 || Number(nb.substr(-2, 2))<=10) {
				if (v>=2 && v<5) {
					num = 2;
				}
				if (v>=5 || v == 0) {
					num = 1;
				}
				if (v == 1) {
					num = 0;
				}
			} else {
				num = 1;
			}
			return terminations[num];
		}
 
                public static function test(word:String, arr:Array = null):void { 
			if (!arr) arr = [1, 2, 3];
			for (var i:int = 0; i < 30; i++) 
			{
				var term:String = Termination.check(i, arr);
				trace(i, word+'[' + term + ']');
			}
		}
	}
 
}
Termination.check(int, Array<String>) передается два параметра: Первым само число, вторым массив из окончаний(три элемента), в примере теста ['я', 'й', 'и'].
Окончание лучше всего подбирать под каждое конкретное слово тестовой функцией, чтобы было наглядно видно, куда и что подставить. Например для слова "час" уже по первым трем строчкам теста
Код:
0 час[2]
1 час[1]
2 час[3]
будет видно что массив окончаний должен быть ['','ов','а']

Короче говоря полезные мелочи, и приятно
Всего комментариев 2

Комментарии

Старый 27.11.2010 15:55 iNils вне форума
iNils
 
Аватар для iNils
Поскольку у нас может быть только три разных окончания (или вообще слова, например день, дней, дня), то лучше передавать не массив, а сразу три параметра, имя которых будет отражать к чему окончания привязывается. Типа word0 (ноль дней), word1 (один день), word2 (два дня), это будет подсказкой.
И поскольку данный Termination отражает особенность русского языка, то класс можно назвать TerminationRus
Старый 24.12.2010 20:17 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Сейчас использовать буду)
Спасибо!
 
Последние записи от Партизан

 


Часовой пояс GMT +4, время: 12:30.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.