пятница, 8 апреля 2016 г.

М-системы: нестандартный $tr

Интересный способ использования функции $translate состоит в использовании её в неочевидных на первый взгляд перестановках.


Реверсирование строки.
RE(s) ;$$; ПЕРЕВОРАЧИВАЕТ СТРОКУ
 Q:$L(s)>26 $$RE($E(s,27,$L(s)))_$$RE($E(s,1,26))
 Q $TR("abcdefghijklmnopqrstuvwxyz","zyxwvutsrqponmlkjihgfedcba",s)
Здесь используется $tr для реверса части строки не используя $re.

Перестановки в строке, например замена формата представления даты
w $tr("Dd.Mm.YyUu","YyUuMmDd",$zd($h,8))
31.08.2005
w $tr("Dd Mm YyUu","YyUuMmDd",$zd($h,8))
31 08 2005
Как и в первом случае здесь в качестве конвертируемых данных выступает третий аргумент, второй аргумент задает формат в котором представлен третий, а первый аргумент задает формат к которому следует привести данные.

Посмотреть, какие форматы поддерживаются функциями $zd / $zdt / $zt, можно, например, так:
f i=1:1:12 w i,": ",$zd($h,i),!
1: 08/31/2005
2: 31 Aug 2005
3: 2005-08-31
4: 31/08/2005
5: Aug 31, 2005
6: Aug 31 2005
7: Aug 31 2005
8: 20050831
9: August 31, 2005
10: 3
11: Wed
12: Wednesday
Также можно использовать $tr для реверса формата, например
s date=$tr("Dd.Mm.YyUu","YyUuMmDd",$zd($h,8))
date="01.09.2005"
w $tr("YyUuMmDd","Dd.Mm.YyUu",date)
20050901
Использование $tr для удаления ненужных или оставления нужных символов возможно в двухаргументной форме $tr. Удаление ненужных с заданием ненужных символов:
s x=$tr(string,"ненужные")
Например s string=$tr(string,"0123456789") удалит из строки все цифры.

Удаление ненужных с заданием какие оставить:
s x=$tr(string,$tr(string,"нужные"))
Например s string=$tr(string,$tr(string,"0123456789")) оставит в строке только цифры.

Замечательный пример использования $tr() в функции получения суммы прописью, есть над чем поломать голову чтобы понять:
http://www.mumps.orelnet.ru/zip/routine/spell.zip


Александр Чудновский
Евгений Каратаев

Комментариев нет:

Отправить комментарий