Добро пожаловать в форум, 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


Сообщение было отредактировано: 14 мар 19, 18:25
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

Откуда: Москва (Муром)
Сообщений: 74927
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
14 мар 19, 18:25    [21832923]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
AndrF
Member

Откуда:
Сообщений: 2119
злой программер
Могу кинуть модулек на 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, 11:39
15 мар 19, 10:18    [21833361]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
bamper78
Member

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

+
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, 11:39
15 мар 19, 10:41    [21833389]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
Khrupchik Eugeny
Member

Откуда:
Сообщений: 37
bamper78,

Ну раз такая жара пошла, то лучше вообще так, и намного быстрее работает:


SELECT n [ЧислоПрописью] from
(SELECT n1000.n + n100.n + case when n10.n = ' десять' and n1.n != ''
then
case n1.n when ' два' then ' две'
when ' четыре' then ' четыр'
else n1.n end
+ 'надцать'
else n10.n + n1.n
END [n]
,n1.c + n10.c + n100.c + n1000.c [c]
FROM (VALUES('',0),(' сто',100),(' двести',200),(' триста',300),(' четыреста',400),(' пятьсот',500),(' шестьсот',600),(' семьсот',700),(' восемьсот',800),(' девятьсот',900)) n100(n,c),
(VALUES('',0),(' один',1),(' два',2),(' три',3),(' четыре',4),(' пять',5),(' шесть',6),(' семь',7),(' восемь',8),(' девять',9)) n1(n,c),
(VALUES('',0),(' десять',10),(' двадцать',20),(' тридцать',30),(' сорок',40),(' пятьдесят',50),(' шестьдесят',60),(' семьдесят',70),(' восемьдесят',80),(' девяносто',90)) n10(n,c),
(VALUES('',0),(' одна тысяча',1000),(' две тысячи',2000),(' три тысячи',3000),(' четыре тысячи',4000),(' пять тысяч',5000),(' шесть тысяч',6000),(' семь тысяч',7000),(' восемь тысяч',8000),(' девять тысяч',9000)) n1000(n,c)
) a
WHERE c = 5234 --сюда написать число которое надо пропсью
22 авг 19, 14:47    [21955567]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Khrupchik Eugeny, что делать с падежными окончаниями?
22 авг 19, 16:46    [21955745]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить