powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Преобразование числа в текстовый вид
1 сообщений из 1, страница 1 из 1
Преобразование числа в текстовый вид
    #35063568
Troanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Прорыл множество форумов (в том числе этот), но так и не смог найти функции преобразования чисел в текстовый формат. Имеется в виду преобразование "235" в "двести тридцать пять". Буду признателен, если гуру подскажут более аккуратный код. Если кому не хочется долго искать функцию, привожу свой вариант. Вполне все работает, хотя как-то неаккуратно получилось, на мой взгляд.
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
CREATE OR REPLACE FUNCTION fn_convert_num_to_char(IN _value text)
  RETURNS text AS
$BODY$
declare
	_ret text;
	tmpstr text;
	i int4;
	
	Mas1 text[ 9 ][ 3 ];
	Mas2 text[ 9 ];
	Mas3 text[ 2 ];
	Mas4 text[ 9 ][ 4 ];

begin

SELECT '{{"", "", ""}, {"сто ", "", "один "}, {"двести ", "двадцать ", "два "}, {"триста ", "тридцать ", "три "},
{"четыреста ", "сорок ", "четыре "}, {"пятьсот ", "пятьдесят ", "пять "}, {"шестьсот ", "шестьдесят ", "шесть "}, {"семьсот ", "семьдесят ", "семь "}, 
{"восемьсот ", "восемьдесят ", "восемь "}, {"девятьсот ", "девяносто ", "девять "}}'::text[][] into Mas1;

SELECT '{"десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать "}'::text[] into Mas2; 

SELECT '{"одна ", "две "}'::text[] into Mas3;

select '{{"", "тысяч ", "миллионов ", "миллиардов "}, {"", "тысяча ", "миллион ", "миллиард "}, {"", "тысячи ", "миллиона ", "миллиарда "}, 
{"", "тысячи ", "миллиона ", "миллиарда "},  {"", "тысячи ", "миллиона ", "миллиарда "},  {"", "тысяч ", "миллионов ", "миллиардов "}, 
{"", "тысяч ", "миллионов ", "миллиардов "}, {"", "тысяч ", "миллионов ", "миллиардов "}, {"", "тысяч ", "миллионов ", "миллиардов "}}'::text[][] into Mas4;


_ret:= '';
tmpstr:= $ 1 ;
i:=  1 ;

while i < Length(tmpstr) loop
	if substr(tmpstr, i,  1 ) <> '0' then EXIT; end if;
	i:= i +  1 ;
end loop;
    
if i = Length($ 1 ) then
    _ret:= 'Ноль';
    exit;
end if;

while mod(length(tmpstr),  3 ) <>  0  loop
	tmpstr:= '0'||tmpstr;
end loop;

i:= ((Length(tmpstr)/ 3 )::text)::int4;
while i >=  1  loop

	if (substr(tmpstr,  1 ,  1 ) = '0') and (substr(tmpstr,  2 ,  1 ) = '0') and (substr(tmpstr,  3 ,  1 ) = '0') then
		tmpstr:= substr(tmpstr,  4 , length(tmpstr) -  3 );
		Continue;
	end if;
	_ret:= _ret || Mas1[substr(tmpstr,  1 ,  1 )::int4 +  1 ][ 1 ];

	if substr(tmpstr,  2 ,  1 ) = '1' then
		_ret:= _ret || Mas2[substr(tmpstr,  3 ,  1 )::int4 +  1 ] || Mas4[ 1 ][i];
	else
		_ret:= _ret || Mas1[substr(tmpstr,  2 ,  1 )::int4 +  1 ][ 2 ];
		if (i =  2 ) and (substr(tmpstr,  3 ,  1 ) = '1' or substr(tmpstr,  3 ,  1 ) =  '2') then
			_ret:= _ret || Mas3[substr(tmpstr,  3 ,  1 )::int4 ];
		else
			_ret:= _ret || Mas1[substr(tmpstr,  3 ,  1 )::int4 +  1 ][ 3 ];
		end if;
		
		_ret:= _ret || Mas4[substr(tmpstr,  3 ,  1 )::int4 +  1 ][i];

	end if;

	tmpstr:= substr(tmpstr,  4 , length(tmpstr) -  3 );
	
	i:= i -  1 ;
end loop;


return _ret;

end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Преобразование числа в текстовый вид
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]