parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Определения знака зодиака

Den Kulikoff 16.03.2005 16:10

Как-то потребовался метод для определения знака зодиака по дню и месяцу рождения.

Вот что вышло:
############
#	Метод @zodiac[date;land]
#		По месяцу и дню рождения определяет знак зодиака.
#		date - дата рождения в формате mm-dd
#		lang - язык названия знака (en - английский, по умочанию - русский) если указать id, то вернет порядковый номер знака (1-12)
#		в методе при создании дат год (2000) выбран произвольно
############
@zodiac[date;lang][periods;birth_date;bdate;edate]

# Таблица соответствия периодов названиям знаков зодиака
$periods[^table::create{id	begin	end	ru_name	en_name
1	03-21	04-20	Овен	Aries
2	04-21	05-20	Телец	Taurus
3	05-21	06-21	Близнецы	Gemini
4	06-22	07-22	Рак	Cancer
5	07-23	08-23	Лев	Leo
6	08-24	09-23	Дева	Virgo
7	09-24	10-23	Весы	Libra
8	10-24	11-22	Скорпион	Scorpio
9	11-23	12-21	Стрелец	Sagittarius
10	12-22	01-20	Козерог	Carpicorn
11	01-21	02-20	Водолей	Aquarius
12	02-21	03-20	Рыбы	Pisces}]

^try{
	$birth_date[^date::create[2000-$date]]
}{
	^throw[parser.runtime;zodiac;'$date' is invalid date. Date format is %mm-%dd]
}	

^periods.menu{
	$bdate[^date::create[2000-$periods.begin]]

# Т.к. у козерога начало периода в одном году, а окончание в другом, то при создании даты для него делаем не 2000 год, а 2001	
	$edate[^date::create[^if($periods.id==10){2001}{2000}-$periods.end]]

	^if($birth_date >= $bdate && $birth_date <= $edate){
		^switch[$lang]{
			^case[id]{$result[$periods.id]}
			^case[en]{$result[$periods.en_name]}
			^case[DEFAULT]{$result[$periods.ru_name]}
		}
	}
}
Если эта реализация никуда не годится - кидайте в меня свои ругательства :)