Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сумма прописью  [new]
Drunk Sr.
Member

Откуда:
Сообщений: 83
Поделитесь UDF или SP для преобразованя числового поля в строковый
(руб. коп.). Или на худой случай направте в правильном направлении.
12 ноя 04, 17:09    [1102897]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
Drunk Sr.
Поделитесь UDF или SP для преобразованя числового поля в строковый
(руб. коп.). Или на худой случай направте в правильном направлении.


А чего тут направлять? За представление данных должен отвечать клиент, а не сервер. Вот там и нужно это реализовывать
12 ноя 04, 17:12    [1102903]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
злой программер
Member

Откуда:
Сообщений: 226
Могу кинуть модулек на Delphi, а на SQL такое реализовывать, по моему изврат
12 ноя 04, 17:27    [1102950]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
Taffy
Member

Откуда:
Сообщений: 20510
+
/****** Object:  Stored Procedure dbo.numeral    Script Date: 16.02.00 17:17:16 ******/
CREATE procedure numeral @summa money, @res Varchar(255) output as
set nocount on
Declare @A1 Varchar(40),@A2 char(3), @b1 char(1), @b2 char(1), @b3 char(1)
Declare @i integer
--Declare @res Varchar(255)
select @a1=Convert(VarChar(255),abs(@summa))
select @i=CharIndex('.',@a1)
if @i>0
 select @a1=Substring(@a1,1,@i-1)
select @a1=Replicate(' ',20)+@a1
Select @a2=Right(@a1,3)
Select @b1=Substring(@a2,1,1)
Select @b2=Substring(@a2,2,1)
Select @b3=Substring(@a2,3,1)
-- единицы
if @b3='1' and @b2<>'1' 
 select @Res=' рубль' 
else if @b3 in ('2','3','4') and @b2<>'1' 
 select @Res=' рубля'
else 
 select @Res=' рублей'
if @b2='1' 
  begin
    if @b3='0'  select @Res=' десять'+@Res else
    if @b3='1'  select @Res=' одиннадцать'+@Res else
    if @b3='2'  select @Res=' двенадцать'+@Res else
    if @b3='3'  select @Res=' тринадцать'+@Res else
    if @b3='4'  select @Res=' четырнадцать'+@Res else
    if @b3='5'  select @Res=' пятнадцать'+@Res else
    if @b3='6'  select @Res=' шестнадцать'+@Res else
    if @b3='7'  select @Res=' семнадцать'+@Res else
    if @b3='8'  select @Res=' восемнадцать'+@Res else
    if @b3='9'  select @Res=' девятнадцать'+@Res
  end
else
  begin
    if @b3='1'  select @Res=' один'+@Res else
    if @b3='2'  select @Res=' два'+@Res else
    if @b3='3'  select @Res=' три'+@Res else
    if @b3='4'  select @Res=' четыре'+@Res else
    if @b3='5'  select @Res=' пять'+@Res else
    if @b3='6'  select @Res=' шесть'+@Res else
    if @b3='7'  select @Res=' семь'+@Res else
    if @b3='8'  select @Res=' восемь'+@Res else
    if @b3='9'  select @Res=' девять'+@Res
    if @b2='2'  select @Res=' двадцать'+@Res else
    if @b2='3'  select @Res=' тридцать'+@Res else
    if @b2='4'  select @Res=' сорок'+@Res else
    if @b2='5'  select @Res=' пятьдесят'+@Res else
    if @b2='6'  select @Res=' шестьдесят'+@Res else
    if @b2='7'  select @Res=' семьдесят'+@Res else
    if @b2='8'  select @Res=' восемьдесят'+@Res else
    if @b2='9'  select @Res=' девяносто'+@Res
  end
    if @b1='1'  select @Res=' сто'+@Res else
    if @b1='2'  select @Res=' двести'+@Res else
    if @b1='3'  select @Res=' триста'+@Res else
    if @b1='4'  select @Res=' четыреста'+@Res else
    if @b1='5'  select @Res=' пятьсот'+@Res else
    if @b1='6'  select @Res=' шестьсот'+@Res else
    if @b1='7'  select @Res=' семьсот'+@Res else
    if @b1='8'  select @Res=' восемьсот'+@Res else
    if @b1='9'  select @Res=' девятьсот'+@Res
Select @a1=Substring(@a1,1,datalength(@a1)-3)
Select @a2=Right(@a1,3)
Select @b1=Substring(@a2,1,1)
Select @b2=Substring(@a2,2,1)
Select @b3=Substring(@a2,3,1)
if @b3 = '0' and @b2 = '0' and @b1 = '0'
 select @res = @res
else
begin
 if @b3='1' and @b2<>'1' 
  select @Res=' тысяча'+@Res 
 else if @b3 in ('2','3','4') and @b2<>'1' 
  select @Res=' тысячи'+@Res
 else if @a2 <> '   '
  select @Res=' тысяч'+@Res
end
if @b2='1' 
  begin
    if @b3='0'  select @Res=' десять'+@Res else
    if @b3='1'  select @Res=' одиннадцать'+@Res else
    if @b3='2'  select @Res=' двенадцать'+@Res else
    if @b3='3'  select @Res=' тринадцать'+@Res else
    if @b3='4'  select @Res=' четырнадцать'+@Res else
    if @b3='5'  select @Res=' пятнадцать'+@Res else
    if @b3='6'  select @Res=' шестнадцать'+@Res else
    if @b3='7'  select @Res=' семнадцать'+@Res else
    if @b3='8'  select @Res=' восемнадцать'+@Res else
    if @b3='9'  select @Res=' девятнадцать'+@Res
  end
else
  begin
    if @b3='1'  select @Res=' одна'+@Res else
    if @b3='2'  select @Res=' две'+@Res else
    if @b3='3'  select @Res=' три'+@Res else
    if @b3='4'  select @Res=' четыре'+@Res else
    if @b3='5'  select @Res=' пять'+@Res else
    if @b3='6'  select @Res=' шесть'+@Res else
    if @b3='7'  select @Res=' семь'+@Res else
    if @b3='8'  select @Res=' восемь'+@Res else
    if @b3='9'  select @Res=' девять'+@Res
    if @b2='2'  select @Res=' двадцать'+@Res else
    if @b2='3'  select @Res=' тридцать'+@Res else
    if @b2='4'  select @Res=' сорок'+@Res else
    if @b2='5'  select @Res=' пятьдесят'+@Res else
    if @b2='6'  select @Res=' шестьдесят'+@Res else
    if @b2='7'  select @Res=' семьдесят'+@Res else
    if @b2='8'  select @Res=' восемьдесят'+@Res else
    if @b2='9'  select @Res=' девяносто'+@Res
  end
    if @b1='1'  select @Res=' сто'+@Res else
    if @b1='2'  select @Res=' двести'+@Res else
    if @b1='3'  select @Res=' триста'+@Res else
    if @b1='4'  select @Res=' четыреста'+@Res else
    if @b1='5'  select @Res=' пятьсот'+@Res else
    if @b1='6'  select @Res=' шестьсот'+@Res else
    if @b1='7'  select @Res=' семьсот'+@Res else
    if @b1='8'  select @Res=' восемьсот'+@Res else
    if @b1='9'  select @Res=' девятьсот'+@Res
-- миллионы
Select @a1=Substring(@a1,1,datalength(@a1)-3)
Select @a2=Right(@a1,3)
Select @b1=Substring(@a2,1,1)
Select @b2=Substring(@a2,2,1)
Select @b3=Substring(@a2,3,1)
if @b3 = '0' and @b2 = '0' and @b1 = '0'
 select @res = @res
else
begin
if @b3='1' and @b2<>'1' 
 select @Res=' миллион' +@Res
else if @b3 in ('2','3','4') and @b2<>'1' 
 select @Res=' миллиона'+@Res
else if @a2 <> '   '
 select @Res=' миллионов'+@Res
end
if @b2='1' 
  begin
    if @b3='0'  select @Res=' десять'+@Res else
    if @b3='1'  select @Res=' одиннадцать'+@Res else
    if @b3='2'  select @Res=' двенадцать'+@Res else
    if @b3='3'  select @Res=' тринадцать'+@Res else
    if @b3='4'  select @Res=' четырнадцать'+@Res else
    if @b3='5'  select @Res=' пятнадцать'+@Res else
    if @b3='6'  select @Res=' шестнадцать'+@Res else
    if @b3='7'  select @Res=' семнадцать'+@Res else
    if @b3='8'  select @Res=' восемнадцать'+@Res else
    if @b3='9'  select @Res=' девятнадцать'+@Res
  end
else
  begin
    if @b3='1'  select @Res=' один'+@Res else
    if @b3='2'  select @Res=' два'+@Res else
    if @b3='3'  select @Res=' три'+@Res else
    if @b3='4'  select @Res=' четыре'+@Res else
    if @b3='5'  select @Res=' пять'+@Res else
    if @b3='6'  select @Res=' шесть'+@Res else
    if @b3='7'  select @Res=' семь'+@Res else
    if @b3='8'  select @Res=' восемь'+@Res else
    if @b3='9'  select @Res=' девять'+@Res
    if @b2='2'  select @Res=' двадцать'+@Res else
    if @b2='3'  select @Res=' тридцать'+@Res else
    if @b2='4'  select @Res=' сорок'+@Res else
    if @b2='5'  select @Res=' пятьдесят'+@Res else
    if @b2='6'  select @Res=' шестьдесят'+@Res else
    if @b2='7'  select @Res=' семьдесят'+@Res else
    if @b2='8'  select @Res=' восемьдесят'+@Res else
    if @b2='9'  select @Res=' девяносто'+@Res
  end
    if @b1='1'  select @Res=' сто'+@Res else
    if @b1='2'  select @Res=' двести'+@Res else
    if @b1='3'  select @Res=' триста'+@Res else
    if @b1='4'  select @Res=' четыреста'+@Res else
    if @b1='5'  select @Res=' пятьсот'+@Res else
    if @b1='6'  select @Res=' шестьсот'+@Res else
    if @b1='7'  select @Res=' семьсот'+@Res else
    if @b1='8'  select @Res=' восемьсот'+@Res else
    if @b1='9'  select @Res=' девятьсот'+@Res
-- миллиарды
Select @a1=Substring(@a1,1,datalength(@a1)-3)
Select @a2=Right(@a1,3)
Select @b1=Substring(@a2,1,1)
Select @b2=Substring(@a2,2,1)
Select @b3=Substring(@a2,3,1)
if @b3 = '0' and @b2 = '0' and @b1 = '0'
 select @res = @res
else
begin
if @b3='1' and @b2<>'1' 
 select @Res=' миллиард' +@Res
else if @b3 in ('2','3','4') and @b2<>'1' 
 select @Res=' миллиарда'+@Res
else if @a2 <> '   '
 select @Res=' миллиардов'+@Res
end
if @b2='1' 
  begin
    if @b3='0'  select @Res=' десять'+@Res else
    if @b3='1'  select @Res=' одиннадцать'+@Res else
    if @b3='2'  select @Res=' двенадцать'+@Res else
    if @b3='3'  select @Res=' тринадцать'+@Res else
    if @b3='4'  select @Res=' четырнадцать'+@Res else
    if @b3='5'  select @Res=' пятнадцать'+@Res else
    if @b3='6'  select @Res=' шестнадцать'+@Res else
    if @b3='7'  select @Res=' семнадцать'+@Res else
    if @b3='8'  select @Res=' восемнадцать'+@Res else
    if @b3='9'  select @Res=' девятнадцать'+@Res
  end
else
  begin
    if @b3='1'  select @Res=' один'+@Res else
    if @b3='2'  select @Res=' два'+@Res else
    if @b3='3'  select @Res=' три'+@Res else
    if @b3='4'  select @Res=' четыре'+@Res else
    if @b3='5'  select @Res=' пять'+@Res else
    if @b3='6'  select @Res=' шесть'+@Res else
    if @b3='7'  select @Res=' семь'+@Res else
    if @b3='8'  select @Res=' восемь'+@Res else
    if @b3='9'  select @Res=' девять'+@Res
    if @b2='2'  select @Res=' двадцать'+@Res else
    if @b2='3'  select @Res=' тридцать'+@Res else
    if @b2='4'  select @Res=' сорок'+@Res else
    if @b2='5'  select @Res=' пятьдесят'+@Res else
    if @b2='6'  select @Res=' шестьдесят'+@Res else
    if @b2='7'  select @Res=' семьдесят'+@Res else
    if @b2='8'  select @Res=' восемьдесят'+@Res else
    if @b2='9'  select @Res=' девяносто'+@Res
  end
    if @b1='1'  select @Res=' сто'+@Res else
    if @b1='2'  select @Res=' двести'+@Res else
    if @b1='3'  select @Res=' триста'+@Res else
    if @b1='4'  select @Res=' четыреста'+@Res else
    if @b1='5'  select @Res=' пятьсот'+@Res else
    if @b1='6'  select @Res=' шестьсот'+@Res else
    if @b1='7'  select @Res=' семьсот'+@Res else
    if @b1='8'  select @Res=' восемьсот'+@Res else
    if @b1='9'  select @Res=' девятьсот'+@Res
declare @mb char(50), @bb char(50)
select @mb='абвгдеёжзийклмнопрстуфхцчшщьыъэюя'
select @bb='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ'
select @i=CharIndex(substring(@Res,1,1),@mb)
select @Res=Substring(@bb,@i,1)+Substring(@Res,2,255)
select @Res=upper(Substring(@Res,1,1)) + Substring(@Res,2, 254)
--select @Res=@Res+' '+Right(convert(varchar(255),abs(@summa)),2)+' коп.'
--select kop
declare @kop varchar(2)
declare @mkop money
declare @suffix varchar(20)
select @kop=right(convert(varchar(255),abs(@summa)),2)
select @mkop=convert(money,@kop)
select @suffix=
case
 when @mkop=0 then 'копеек'
 when @mkop>10 and @mkop<20 then 'копеек'
 when right(@kop,1)='1' then 'копейка'
 when right(@kop,1)>'1' and  right(@kop,1)<'5' then 'копейки'
 else 'копеек'
end
select @Res=@Res+' '+case when @mkop=0 then ' ' else @kop+' '+@suffix end
select @Res= upper(Substring(Ltrim(@Res),1,1)) + Substring(ltrim(@Res),2, 254)


GO
12 ноя 04, 17:52    [1103034]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
Drunk Sr.
Member

Откуда:
Сообщений: 83
Благодарствую за ХП.
14 ноя 04, 18:56    [1104612]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сумма прописью  [new]
MSSQLuserK1
Member

Откуда:
Сообщений: 14
Доброе время суток!
Подскажите, пожалуйста
При вызове:
declare @m money = 62
declare @result varchar = 'рублей';

execute dbo.numeral
	 @m, @result output
print @result

Выводит букву "Ш", некорректный вызов?
30 янв 17, 11:02    [20160497]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74901
MSSQLuserK1
Доброе время суток!
Подскажите, пожалуйста
При вызове:
declare @m money = 62
declare @result varchar = 'рублей';

execute dbo.numeral
	 @m, @result output
print @result

Выводит букву "Ш", некорректный вызов?


declare @result varchar

Эквивалентно:
declare @result varchar(1)
30 янв 17, 13:20    [20161375]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сумма прописью  [new]
Dmitriy Bulanov
Member

Откуда:
Сообщений: 2
+
create function dbo.NumToString(@summa money) Returns varchar(255) as 
begin 
declare  @res Varchar(255) 
	Declare @A1 Varchar(40),@A2 char(3), @b1 char(1), @b2 char(1), @b3 char(1), @i integer, @num int =0

	select @a1=Convert(VarChar(255),abs(@summa))
	select @i=CharIndex('.',@a1)
	if @i>0
	 set @a1=Substring(@a1,1,@i-1)
	set @a1=Replicate(' ',20)+@a1


	set @Res='';
	while (ltrim(@a1)<>'')
	 begin
		select @num=@num+1,  @a2=right(@a1,3), @a1=substring(@a1,1,len(@a1)-3)

		select @b1=substring(@a2,1,1), @b2=substring(@a2,2,1), @b3=substring(@a2,3,1)

		if @b3 = '0' and @b2 = '0' and @b1 = '0'
			continue;

		set @Res= case  when @num=1 then
							case when @b3='1' and @b2<>'1' then ' рубль' 
								 when @b3 in ('2','3','4') and @b2<>'1'  then ' рубля'
								 else  ' рублей'
							end 
						when @num=2 then 
							case when @b3='1' and @b2<>'1'  then ' тысяча'
								 when @b3 in ('2','3','4') and @b2<>'1' then ' тысячи'
								 when @a2 <> '   ' then ' тысяч' else '' end
					  when @num=3 then
						  case  when @b3='1' and @b2<>'1' then ' миллион'
								when @b3 in ('2','3','4') and @b2<>'1' then ' миллиона'
								when @a2 <> '   ' then ' миллионов' else '' end

					 when @num=4 then
						  case  when @b3='1' and @b2<>'1' then ' миллиард'
								when @b3 in ('2','3','4') and @b2<>'1' then ' миллиарда'
								when @a2 <> '   ' then ' миллиардов'else ''  end
					else ''
		end + @Res;

			if @b2='1' 
				set @Res= case  when @b3='0' then ' десять' 
								when @b3='1' then ' одиннадцать'
								when @b3='2' then ' двенадцать'
								when @b3='3' then ' тринадцать'
								when @b3='4' then ' четырнадцать'
								when @b3='5' then ' пятнадцать'
								when @b3='6' then ' шестнадцать'
								when @b3='7' then ' семнадцать'
								when @b3='8' then ' восемнадцать'
								when @b3='9' then ' девятнадцать' else '' end +@Res
			else
			  set @Res= case    when @b2='2'  then ' двадцать'
								when @b2='3'  then ' тридцать'
								when @b2='4'  then ' сорок'
								when @b2='5'  then ' пятьдесят'
								when @b2='6'  then ' шестьдесят'
								when @b2='7'  then ' семьдесят'
								when @b2='8'  then ' восемьдесят'
								when @b2='9'  then ' девяносто' else '' end +

						  case  when @b3='1'  then case when @num=2 then ' одна' else ' один' end
								when @b3='2'  then case when @num=2 then ' две' else ' два' end
								when @b3='3'  then ' три'
								when @b3='4'  then ' четыре'
								when @b3='5'  then ' пять'
								when @b3='6'  then ' шесть'
								when @b3='7'  then ' семь'
								when @b3='8'  then ' восемь'
								when @b3='9'  then ' девять' else '' end +@Res

			set @Res= case  when @b1='1' then ' сто'
							when @b1='2' then ' двести'
							when @b1='3' then ' триста'
							when @b1='4' then ' четыреста'
							when @b1='5' then ' пятьсот'
							when @b1='6' then ' шестьсот'
							when @b1='7' then ' семьсот'
							when @b1='8' then ' восемьсот'
							when @b1='9' then ' девятьсот' else '' end +@Res

	 end

 
	declare @mb char(50)='абвгдеёжзийклмнопрстуфхцчшщьыъэюя', @bb char(50)='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ'

	select @i=CharIndex(substring(@Res,1,1),@mb), 
		 @Res=Substring(@bb,@i,1)+Substring(@Res,2,255)
	select @Res=upper(Substring(@Res,1,1)) + Substring(@Res,2, 254)

	declare @kop varchar(2), @mkop money, @suffix varchar(20)

	select @kop=right(convert(varchar(255),abs(@summa)),2)
	select @mkop=convert(money,@kop)
	select @suffix=case when @mkop=0 then 'копеек'
						when @mkop>10 and @mkop<20 then 'копеек'
						when right(@kop,1)='1' then 'копейка'
						when right(@kop,1)>'1' and  right(@kop,1)<'5' then 'копейки'
						else 'копеек'
					end
	select @Res=@Res+' '+case when @mkop=0 then ' ' else @kop+' '+@suffix end
	 
	select @Res= upper(Substring(Ltrim(@Res),1,1)) + Substring(ltrim(@Res),2, 254)
	
	return @Res
end
14 мар 19, 18:25    [21832923]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
AndrF
Member

Откуда:
Сообщений: 2055
злой программер
Могу кинуть модулек на Delphi, а на SQL такое реализовывать, по моему изврат


При желании - легко делается. Но на скорую руку найти не могу - это надо свою древнюю базу развертывать...

Как вариант - можно сделать clr-функцию. Взяв за основу следующий пример (то же делал фиг знает когда):

+
    Public Sub Main() 
        Debug.WriteLine(ЧислоПрописью(3456832.71)) 
        Debug.WriteLine(ЧислоПрописью(3.2, "м;метр;метра;метров", "м;дециметр;дециметра;дециметров;1,0")) 
        Debug.WriteLine(ЧислоПрописью(3.71, "м;метр;метра;метров", "м;милиметр;милиметра;милиметров;2,0")) 
        Debug.WriteLine(ЧислоПрописью(32.102, "ж|тонна|тонны|тонн", "м|килограмм|киллограмма|киллограмм|3 и ещё 0")) 
        Debug.WriteLine(ЧислоПрописью(32, "м;человек|человека|человек")) 
        Debug.WriteLine(ЧислоПрописью(21, "с;окно|окна|окон")) 
        Debug.WriteLine(ЧислоПрописью(21, "ж;дубинка|дубинки|дубинок")) 
        Debug.WriteLine(ЧислоПрописью(21, "ж;бутылка молока|бутылки молока|бутылок молока")) 
        Debug.WriteLine(ЧислоПрописью(1277, "ж;бутылка молока|бутылки молока|бутылок молока")) 

        'Три миллиона четыреста пятьдесят шесть тысяч восемьсот тридцать два рубля 71 копейка 
        'Три метра, 2 дециметра 
        'Три метра, 71 милиметр 
        'Тридцать две тонны и ещё 102 киллограмма 
        'Тридцать два человека 
        'Двадцать одно окно 
        'Двадцать одна дубинка 
        'Двадцать одна бутылка молока 
        'Одна тысяча двести семьдесят семь бутылок молока 
    End Sub 


    ' "ж|копейка|копейки|копеек|2,00" 
    '                           ^ - кол-во значащих знаков после запятой 
    '                            ^ - символ-разделитель (пробел если не нужен) 
    '                             ^^ - формат вывода числа дробной части 
    '  ^ - род наименования 
    '    ^^^^^^^ - именительный падеж 
    '            ^^^^^^^ - родительный падеж 
    '                    ^^^^^^ - родительный падеж множественного числа 
    Public Function ЧислоПрописью(ByVal xsu As Object, _ 
                         Optional ByVal PString1 As String = "м|рубль|рубля|рублей", _ 
                         Optional ByVal PString2 As String = vbNullString) As String 

        Dim ssu As String, nsu As Byte, edi As Byte, des As Byte, sot As Byte, ind As Byte, i As Integer, v() As String, j As Integer, sb As New System.Text.StringBuilder 
        Dim r1 As String = "м", r10 As String = vbNullString, r11 As String = vbNullString, r12 As String = vbNullString 
        Dim r2 As String = vbNullString, r20 As String = vbNullString, r21 As String = vbNullString, r22 As String = vbNullString, _ 
            r2_ As String = vbNullString, r2n As Short = 2, r2s As String = "00" 

        On Error GoTo Err_ 
        If Not IsNumeric(xsu) Then ЧислоПрописью = vbNullString : Exit Function 
        If xsu >= 10000000000000 Then ЧислоПрописью = "Слишком большое число" : Exit Function 

        If PString1 Is Nothing Then 
            PString2 = vbNullString 
        Else 
            PString1 = PString1.ToLower.Replace(";", "|") 
            If Not PString2 Is Nothing Then PString2 = PString2.ToLower.Replace(";", "|") 
            v = PString1.Split("|") 
            If v.Length >= 4 Then 
                If 0 = PString1.CompareTo("м|рубль|рубля|рублей") And PString2 Is Nothing Then 
                    PString2 = "ж|копейка|копейки|копеек|2 00" 
                End If 
                r1 = v(0).Substring(0, 1) 
                r10 = v(1) 
                r11 = v(2) 
                r12 = v(3) 
            End If 
        End If 

        If Not PString2 Is Nothing Then 
            v = PString2.Split("|") 
            If v.Length = 4 Or v.Length = 5 Then 
                r2 = v(0).Substring(0, 1) 
                r20 = v(1) 
                r21 = v(2) 
                r22 = v(3) 
                If v.Length = 5 Then 
                    r2n = CShort(v(4).Substring(0, 1)) 
                    r2_ = v(4).Substring(1, 1).Trim 
                    r2s = v(4).Substring(2).Trim 
                    If r2s.Length = 0 Then r2s = "0" 
                End If 
            End If 
        End If 

        If Fix(xsu) = 0 Then 
            sb.Append("ноль " & r12 & " ") 
        Else 
            If xsu < 0 Then sb.Append("минус ") 
            ssu = Fix(System.Math.Abs(xsu)).ToString       ' строка рублей без знака 
            nsu = (ssu.Length + 2) \ 3                     ' количество троек цифр 
            ssu = Right$("00", nsu * 3 - ssu.Length) + ssu ' добавляем нулями 
            For i = nsu To 1 Step -1 
                j = (nsu - i) * 3 
                sot = CByte(ssu.Substring(j, 1))     ' сотни 
                des = CByte(ssu.Substring(j + 1, 1)) ' десятки 
                edi = CByte(ssu.Substring(j + 2, 1)) ' единицы 
                If sot + des + edi > 0 Or i = 1 Then 
                    If sot > 0 Then 
                        sb.Append(Choose(sot, "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот") + " ") 
                    End If 
                    If des = 1 Then 
                        sb.Append(Choose(edi + 1, "десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать") + " ") 
                        ind = 3 
                    Else 
                        If des <> 0 Then 
                            sb.Append(Choose(des - 1, "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто") + " ") 
                        End If 
                        If edi <> 0 Then ' вычисляем индекс для тысяч (одна,две) 
                            ind = IIf(i = 2 And (edi = 1 Or edi = 2), 9, 0) 
                            Select Case r1 
                                Case "м" : sb.Append(Choose(edi + ind, "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "одна", "две") + " ") 
                                Case "ж" : sb.Append(Choose(edi + ind, "одна", "две", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "одна", "две") + " ") 
                                Case Else : sb.Append(Choose(edi + ind, "одно", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "одна", "две") + " ") 
                            End Select 
                        End If 
                        Select Case edi 
                            Case 1 : ind = 1 
                            Case 2 To 4 : ind = 2 
                            Case Else : ind = 3 
                        End Select 
                    End If 
                    sb.Append(Choose((i - 1) * 3 + ind, r10, r11, r12, "тысяча", "тысячи", "тысяч", "миллион", "миллиона", "миллионов", "миллиард", "миллиарда", "миллиардов", "триллион", "триллиона", "триллионов") & " ") 
                End If 
            Next i 
        End If 
        If Not r2 Is Nothing Then 
            ssu = Right(Format(xsu, ".000".Substring(0, r2n + 1)), r2n) 
            If r2n > 1 Then des = CByte(ssu.Substring(r2n - 2, 1)) Else des = 0 
            edi = CByte(ssu.Substring(r2n - 1, 1)) 
            xsu = CShort((xsu - Fix(xsu)) * (10 ^ r2n)) 
            If des = 1 Then 
                ind = 3 
            Else 
                Select Case edi 
                    Case 1 : ind = 1 
                    Case 2 To 4 : ind = 2 
                    Case Else : ind = 3 
                End Select 
            End If 
            If r2.Length > 0 And Not r2_ Is Nothing Then 
                If r2_.Length > 0 And sb.Length Then sb.Insert(sb.Length - 1, r2_) 
            End If 
            sb.Append(Format(xsu, r2s) & " " & Choose(ind, r20, r21, r22)) 
        End If 
        ЧислоПрописью = sb.ToString.TrimEnd : sb = Nothing 
        Mid(ЧислоПрописью, 1, 1) = Mid(ЧислоПрописью, 1, 1).ToUpper 
        Exit Function 

Err_: 
        ЧислоПрописью = "Ошибка числа прописью" 
    End Function 
15 мар 19, 10:18    [21833361]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
bamper78
Member

Откуда:
Сообщений: 106
Используйте функцию

+
CREATE function [dbo].[NumPhrase] (@Num BIGINT, @IsMaleGender bit=1)
returns varchar(255)
as
begin
  declare @nword varchar(255), @th tinyint, @gr smallint, @d3 tinyint, @d2
tinyint, @d1 tinyint
  if @Num<0 return '*** Error: Negative value' else if @Num=0 return 'Ноль'
/* особый случай */
  while @Num>0
  begin
    set @th=IsNull(@th,0)+1    set @gr=@Num%1000    set @Num=(@Num-@gr)/1000
    if @gr>0
    begin
      set @d3=(@gr-@gr%100)/100
      set @d1=@gr%10
      set @d2=(@gr-@d3*100-@d1)/10
      if @d2=1 set @d1=10+@d1
      set @nword=
			case @d3
				when 1 then ' сто' 
				when 2 then ' двести' 
				when 3 then ' триста'
				when 4 then ' четыреста' 
				when 5 then ' пятьсот' 
				when 6 then ' шестьсот'
				when 7 then ' семьсот' 
				when 8 then ' восемьсот' 
				when 9 then ' девятьсот' 
				else '' 
			end +
			case @d2
				when 2 then ' двадцать' 
				when 3 then ' тридцать' 
				when 4 then ' сорок'
				when 5 then ' пятьдесят' 
				when 6 then ' шестьдесят' 
				when 7 then ' семьдесят'
				when 8 then ' восемьдесят' 
				when 9 then ' девяносто' 
				else '' 
			end +
			case @d1
				when 1 then (case when @th=2 or (@th=1 and @IsMaleGender=0) then ' одна' else ' один' end)
				when 2 then (case when @th=2 or (@th=1 and @IsMaleGender=0) then ' две' else ' два' end)
				when 3 then ' три' 
				when 4 then ' четыре' 
				when 5 then ' пять'
				when 6 then ' шесть' 
				when 7 then ' семь' 
				when 8 then ' восемь'
				when 9 then ' девять' 
				when 10 then ' десять' 
				when 11 then ' одиннадцать'
				when 12 then ' двенадцать' 
				when 13 then ' тринадцать' 
				when 14 then ' четырнадцать'
				when 15 then ' пятнадцать' 
				when 16 then ' шестнадцать'
				when 17 then ' семнадцать'
                when 18 then ' восемнадцать' 
				when 19 then ' девятнадцать'
				else '' 
			end +
			case @th
				when 2 then ' тысяч' + (
					case 
						when @d1=1 then 'а' 
						when @d1 in (2,3,4) 
						then 'и' 
						else ''   
					end)
				when 3 then ' миллион' 
				when 4 then ' миллиард' 
				when 5 then ' триллион' 
				when 6 then ' квадрилион' 
				when 7 then ' квинтилион'
				else '' 
			end +
			case 
				when @th in (3,4,5,6,7) then (
					case 
						when @d1=1 then '' 
						when @d1 in (2,3,4) then 'а' 
						else 'ов' 
					end) 
				else '' 
			end
            + IsNull(@nword,'')
		end
	end
  return upper(substring(@nword,2,1))+substring(@nword,3,len(@nword)-2)
end
15 мар 19, 10:41    [21833389]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить