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

Откуда:
Сообщений: 85
Сумма прописью

/*	Число прописью:		FloatToWord 	(Значение, Формат, Валюта)
-------------------------------------------------------------------------------------------
Вхд.:	FloatToWord (21.3, 0, NULL)		|	Вхд.:	FloatToWord (21.1, 1, NULL)
Рез.:	Двадцать один				|	Рез.:	Двадцать один, три
-------------------------------------------------------------------------------------------
Вхд.:	FloatToWord (21.3, 0, 810)
Рез.:	Двадцать один руб. три коп.	(доллар, цента. евро, цента)
-------------------------------------------------------------------------------------------
Вхд.:	FloatToWord (21.3, 1, 810)
Рез.:	Двадцать один рубль три копейки (доллар, цента. евро, цента)
-------------------------------------------------------------------------------------------
Вхд.:	FloatToWord (21.3, 2, 810)
Рез.:	Двадцать один руб. 03 коп. (доллар, цента. евро, цента)
-------------------------------------------------------------------------------------------
Вхд.:	FloatToWord (21.3, 3, 810)
Рез.:	Двадцать один рубль 03 копейки (доллар, цента. евро, цента)
-------------------------------------------------------------------------------------------*/
CREATE FUNCTION	FloatToWord	(@Val float, @Frm tinyint, @Cur int)
RETURNS nvarchar(500) AS  
BEGIN 

if @Val is not Null begin
	declare @v0 nvarchar(3), 	-- Дробные
		@v1 nvarchar(3), 	-- Единицы
		@v2 nvarchar(3),	-- Тысячи
		@v3 nvarchar(3), 	-- Миллионы
		@v4 nvarchar(3), 	-- Миллиарды
		@ValS nvarchar(500),	-- Значение строкой
		@Dig  nvarchar(500),	-- Целое
		@Dec  nvarchar(50),	-- Дробь
		@i int

	set @ValS = STR(@Val, 20, 2)
	set @i	  = CHARINDEX('.', @ValS)
	set @Dig  = SUBSTRING(@ValS, 1, @i-1)
	set @Dec  = STUFF(@ValS, 1, @i, '')
	set @v0	  = @Dec

	set @i = 1
	set @Dig= REVERSE(@Dig)
	while @i <= LEN(@Dig) begin
		if (@i >= 1)and(@i <= 3) begin
			if @v1 is null set @v1 = ''
			set @v1 = SUBSTRING(@Dig, @i, 1) + @v1
		end
		if (@i >= 4)and(@i <= 6) begin
			if @v2 is null set @v2 = ''
			set @v2 = SUBSTRING(@Dig, @i, 1) + @v2
		end
		if (@i >= 7)and(@i <= 9) begin
			if @v3 is null set @v3 = ''
			set @v3 = SUBSTRING(@Dig, @i, 1) + @v3
		end
		if (@i >= 10)and(@i <= 12) begin
			if @v4 is null set @v4 = ''
			set @v4 = SUBSTRING(@Dig, @i, 1) + @v4
		end
		set @i = @i + 1
	end

	set @Dig = ''
	set @Dec = ''

	-- Миллиарды ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	if @v4 is not null begin
		if LEN(@v4) = 3 begin
			 set @Dig = @Dig + (select WRD1 from DIGITS where LEN(TYPE) = 3 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v4, 1, 1)) +' '
			 set @i = CONVERT(int, SUBSTRING(@v4, 2, 2))
		end else set @i = CONVERT(int, @v4)

		if (@i >= 1) and (@i <= 20)
			set @Dig = @Dig + (select WRD1 from DIGITS where DIGIT = @i and LEN(TYPE) = 1) +' '
		else begin
			set @Dig = @Dig + (select WRD1 from DIGITS where LEN(TYPE) = 2 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v4, LEN(@v4)-1, 1)) +' '
			set @Dig = @Dig + (select WRD1 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v4, LEN(@v4), 1)) +' '
		end

		if (@i >= 11) and (@i <= 20) set @Dig = @Dig + (select WRD3 from DIGITS where TYPE = 1000000000) +' '		-- Миллиардов
		else begin
			set @i = CONVERT(int, SUBSTRING(@v4, LEN(@v4), 1))
			set @Dig = @Dig + 
				CASE
				WHEN @i = 1 			THEN (select WRD1 from DIGITS where TYPE = 1000000000) +' '	-- Миллиард
				WHEN (@i >= 2) and (@i <= 4)	THEN (select WRD2 from DIGITS where TYPE = 1000000000) +' '	-- Миллиарда
				WHEN (@i = 0) or (@i >= 5)	THEN (select WRD3 from DIGITS where TYPE = 1000000000) +' '	-- Миллиардов
				END
		end
	end

	-- Миллионы ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	if @v3 is not null begin
		if LEN(@v3) = 3 begin
			 set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where LEN(TYPE) = 3 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v3, 1, 1)) +' ', '')
			 set @i = CONVERT(int, SUBSTRING(@v3, 2, 2))
		end else set @i = CONVERT(int, @v3)

		if (@i >= 1) and (@i <= 20)
			set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where DIGIT = @i and LEN(TYPE) = 1) +' ', '')
		else begin
			set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where LEN(TYPE) = 2 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v3, LEN(@v3)-1, 1)) +' ', '')
			set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v3, LEN(@v3), 1)) +' ', '')
		end

		if CONVERT(int, @v3) <> 0
		if (@i >= 11) and (@i <= 20) set @Dig = @Dig + (select WRD3 from DIGITS where TYPE = 1000000) +' '		-- Миллионов
		else begin
			set @i = CONVERT(int, SUBSTRING(@v3, LEN(@v3), 1))
			set @Dig = @Dig + 
				CASE
				WHEN @i = 1 			THEN (select WRD1 from DIGITS where TYPE = 1000000) +' '	-- Миллион
				WHEN (@i >= 2) and (@i <= 4)	THEN (select WRD2 from DIGITS where TYPE = 1000000) +' '	-- Миллиона
				WHEN (@i = 0) or (@i >= 5)	THEN (select WRD3 from DIGITS where TYPE = 1000000) +' '	-- Миллионов
				END
		end
	end

	-- Тысячи ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	if @v2 is not null begin
		if LEN(@v2) = 3 begin
			 set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where LEN(TYPE) = 3 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v2, 1, 1)) +' ', '')
			 set @i = CONVERT(int, SUBSTRING(@v2, 2, 2))
		end else set @i = CONVERT(int, @v2)

		if (@i >= 1) and (@i <= 20)
			set @Dig = @Dig + ISNULL((select WRD2 from DIGITS where DIGIT = @i and LEN(TYPE) = 1) +' ', '')
		else begin
			set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where LEN(TYPE) = 2 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v2, LEN(@v2)-1, 1)) +' ', '')
			set @Dig = @Dig + ISNULL((select WRD2 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v2, LEN(@v2), 1)) +' ', '')
		end

		if CONVERT(int, @v2) <> 0
		if (@i >= 11) and (@i <= 20) set @Dig = @Dig + (select WRD3 from DIGITS where TYPE = 1000) +' '	-- Тысяч
		else begin
			set @i = CONVERT(int, SUBSTRING(@v2, LEN(@v2), 1))
			set @Dig = @Dig + 
				CASE
				WHEN @i = 1 			THEN (select WRD1 from DIGITS where TYPE = 1000) +' '	-- Тысяча
				WHEN (@i >= 2) and (@i <= 4)	THEN (select WRD2 from DIGITS where TYPE = 1000) +' '	-- Тысячи
				WHEN (@i = 0) or (@i >= 5)	THEN (select WRD3 from DIGITS where TYPE = 1000) +' '	-- Тысяч
				END
		end
	end

	-- До тысяч --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	if @v1 is not null begin
		if (LTRIM(RTRIM(@Dig)) = '') and (CONVERT(int, @v1) = 0) set @Dig = 'ноль ' else begin
			if LEN(@v1) = 3 begin
				 set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where LEN(TYPE) = 3 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v1, 1, 1)) +' ', '')
				 set @i = CONVERT(int, SUBSTRING(@v1, 2, 2))
			end else set @i = CONVERT(int, @v1)

			if (@i >= 1) and (@i <= 20)
				set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where DIGIT = CONVERT(nvarchar(20), @i) and LEN(TYPE) = 1), '')
			else begin
				set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where LEN(TYPE) = 2 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v1, LEN(@v1)-1, 1)) +' ', '')
				set @Dig = @Dig + ISNULL((select WRD1 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v1, LEN(@v1), 1)), '')
			end
		end

		set @ValS = ''
		if @Cur is not NULL begin
			if (@i >= 11) and (@i <= 20) set @ValS = (select WRD3 from DIGITS where CONVERT(int, TYPE) = @Cur)		-- Рублей
			else begin
				set @i = CONVERT(int, SUBSTRING(@v1, LEN(@v1), 1))
				set @ValS =
					CASE
					WHEN @i = 1			THEN (select WRD1 from DIGITS where TYPE = CONVERT(char(3), @Cur))-- Рубль
					WHEN (@i >= 2) and (@i <= 4)	THEN (select WRD2 from DIGITS where TYPE = CONVERT(char(3), @Cur))-- Рубля
					WHEN (@i = 0) or (@i >= 5)	THEN (select WRD3 from DIGITS where TYPE = CONVERT(char(3), @Cur))-- Рублей
					END
			end
			if @Frm = 0 set @ValS = SUBSTRING(@ValS, 1, 3) +'. '
		end

		set @Dig = RTRIM(@Dig) +' '+ @ValS
		if (@Frm = 1)and(@Cur is NULL) set @Dig = RTRIM(@Dig) +','
	end

	-- Дробные ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	if not ((@Frm = 0) and (@Cur is NULL)) begin
		set @i = CONVERT(int, @v0)
		if @Frm = 2 or @Frm = 3 begin
			set @Dec = @v0
		end else begin
			if (LTRIM(RTRIM(@Dec)) = '') and (@i = 0) set @Dec = 'ноль' else begin
				if (@i >= 11) and (@i <= 20)
					set @Dec = @Dec + ISNULL((select WRD1 from DIGITS where DIGIT = @i and LEN(TYPE) = 1), '')
				else begin
					set @Dec = @Dec + ISNULL((select WRD1 from DIGITS where LEN(TYPE) = 2 and SUBSTRING(DIGIT, 1, 1) = SUBSTRING(@v0, LEN(@v0)-1, 1)) +' ', '')
					if @Cur = 810 begin
						set @Dec = @Dec + 
						CASE	WHEN	SUBSTRING(@v0, LEN(@v0), 1) = 1
							THEN	ISNULL((select WRD2 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v0, LEN(@v0), 1)), '')-- копейка
							WHEN	SUBSTRING(@v0, LEN(@v0), 1) >= 2 and SUBSTRING(@v0, LEN(@v0), 1) <= 4
							THEN	ISNULL((select WRD2 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v0, LEN(@v0), 1)), '')-- копейки
							WHEN	SUBSTRING(@v0, LEN(@v0), 1) = 0 or SUBSTRING(@v0, LEN(@v0), 1) >= 5
							THEN	ISNULL((select WRD3 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v0, LEN(@v0), 1)), '')-- копеек
							END
					end else begin
						set @Dec = @Dec + 
						CASE	WHEN	(SUBSTRING(@v0, LEN(@v0), 1) >= 1) and (SUBSTRING(@v0, LEN(@v0), 1) <= 4)
							THEN	ISNULL((select WRD1 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v0, LEN(@v0), 1)), '')-- цент
							WHEN	SUBSTRING(@v0, LEN(@v0), 1) = 0 or SUBSTRING(@v0, LEN(@v0), 1) >= 5
							THEN	ISNULL((select WRD3 from DIGITS where TYPE = 1 and DIGIT = SUBSTRING(@v0, LEN(@v0), 1)), '')-- центов
							END
					end
					set @Dec = RTRIM(@Dec)
				end
			end
		end

		set @ValS = ''
		if @Cur is not NULL begin
			if (@i >= 11) and (@i <= 20) set @ValS = (select WRD3 from DIGITS where TYPE = CONVERT(char(3), @Cur)+CONVERT(char(3), @Cur))-- копеек
			else begin
				set @i = CONVERT(int, SUBSTRING(@v0, LEN(@v0), 1))
				set @ValS =
					CASE
					WHEN @i = 1 			
					THEN (select WRD1 from DIGITS where TYPE = CONVERT(char(3), @Cur)+CONVERT(char(3), @Cur))	-- копейка
					WHEN (@i >= 2) and (@i <= 4)	
					THEN (select WRD2 from DIGITS where TYPE = CONVERT(char(3), @Cur)+CONVERT(char(3), @Cur))	-- копейки
					WHEN (@i = 0) or (@i >= 5)	
					THEN (select WRD3 from DIGITS where TYPE = CONVERT(char(3), @Cur)+CONVERT(char(3), @Cur))	-- копеек
					END
			end
			if @Frm = 0 or @Frm = 2 set @ValS = SUBSTRING(@ValS, 1, 3) +'.'
		end
		set @Dec = @Dec +' '+ @ValS
	end

	-- Результат --
	set @ValS = RTRIM(RTRIM(@Dig) +' '+ RTRIM(@Dec))
	set @ValS = UPPER(SUBSTRING(@ValS, 1, 1)) + SUBSTRING(@ValS, 2, LEN(@ValS)-1)
end
RETURN @ValS
END

 



if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DIGITS]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[DIGITS]
GO

CREATE TABLE [dbo].[DIGITS] (
	[DIGIT] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1251_CI_AS NULL ,
	[WRD1] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1251_CI_AS NULL ,
	[WRD2] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1251_CI_AS NULL ,
	[WRD3] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1251_CI_AS NULL ,
	[TYPE] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1251_CI_AS NULL ,
	[NOTE] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1251_CI_AS NULL ,
	[UID] [int] NOT NULL 
) ON [PRIMARY]
GO



---
содержимое


[SQL]
DIGIT WRD1 WRD2 WRD3 TYPE NOTE UID

insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '1','один','одна','одну', 1 ,'', 1 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '2','два','две','две', 1 ,'', 2 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '3','три','три','три', 1 ,'', 3 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '4','четыре','четыре','четыре', 1 ,'', 4 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '5','пять','пять','пять', 1 ,'', 5 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '6','шесть','шесть','шесть', 1 ,'', 6 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '7','семь','семь','семь', 1 ,'', 7 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '8','восемь','восемь','восемь', 1 ,'', 8 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '9','девять','девять','девять', 1 ,'', 9 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '10','десять','десять','десять', 1 ,'', 10 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '11','одиннадцать','одиннадцать','одиннадцать', 2 ,'', 11 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '12','двенадцать','двенадцать','двенадцать', 2 ,'', 12 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '13','тринадцать','тринадцать','тринадцать', 2 ,'', 13 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '14','четырнадцать','четырнадцать','четырнадцать', 2 ,'', 14 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '15','пятнадцать','пятнадцать','пятнадцать', 2 ,'', 15 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '16','шестнадцать','шестнадцать','шестнадцать', 2 ,'', 16 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '17','семнадцать','семнадцать','семнадцать', 2 ,'', 17 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '18','восемнадцать','восемнадцать','восемнадцать', 2 ,'', 18 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '19','девятнадцать','девятнадцать','девятнадцать', 2 ,'', 19 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '20','двадцать','двадцать','двадцать', 2 ,'', 20 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '10','десять','десять','десять', 10 ,'', 21 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '20','двадцать','двадцать','двадцать', 10 ,'', 22 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '30','тридцать','тридцать','тридцать', 10 ,'', 23 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '40','сорок','сорок','сорок', 10 ,'', 24 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '50','пятьдесят','пятьдесят','пятьдесят', 10 ,'', 25 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '60','шестьдесят','шестьдесят','шестьдесят', 10 ,'', 26 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '70','семьдесят','семьдесят','семьдесят', 10 ,'', 27 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '80','восемьдесят','восемьдесят','восемьдесят', 10 ,'', 28 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '90','девяносто','девяносто','девяносто', 10 ,'', 29 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '100','сто','сто','сто', 100 ,'', 30 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '200','двести','двести','двести', 100 ,'', 31 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '300','триста','триста','триста', 100 ,'', 32 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '400','четыреста','четыреста','четыреста', 100 ,'', 33 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '500','пятьсот','пятьсот','пятьсот', 100 ,'', 34 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '600','шестьсот','шестьсот','шестьсот', 100 ,'', 35 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '700','семьсот','семьсот','семьсот', 100 ,'', 36 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '800','восемьсот','восемьсот','восемьсот', 100 ,'', 37 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '900','девятьсот','девятьсот','девятьсот', 100 ,'', 38 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '1000','тысяча','тысячи','тысяч', 1000 ,'', 39 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '1000000','миллион','миллиона','миллионов', 1000000 ,'', 40 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '1000000000','миллиард','миллиарда','миллиардов', 1000000000 ,'', 41 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','рубль','рубля','рублей', 810 ,'', 42 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','копейка','копейки','копеек', 810810 ,'', 43 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','доллар','доллара','долларов', 840 ,'', 44 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','цент','цента','центов', 840840 ,'', 45 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','евро','евро','евро', 978 ,'', 46 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','цент','цента','центов', 978978 ,'', 47 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','фунт стерлингов','фунта стрелингов','фунтов стерлингов', 826 ,'', 48 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','пенс','пенса','пенсов', 826826 ,'', 49 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','швейцарский франк','швейцарских франка','швейцарских франков', 756 ,'', 50 )
insert into DIGITS (DIGIT,WRD1,WRD2,WRD3,TYPE,NOTE,UID) value ( '','сантим','сантима','сантимов', 756756 ,'', 51 )




[/SQL]
(51 row(s) affected)
20 мар 14, 10:09    [15757242]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
проходящий.
Guest
Yura_Z,

жуть...

Я видел реализацию сей функции размером менее 200 байт.
20 мар 14, 10:32    [15757406]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
проходящий.
Yura_Z,

жуть...

Я видел реализацию сей функции размером менее 200 байт.
Кстати, помню, мы ж тут где-то мерялись...
20 мар 14, 10:38    [15757453]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
+ оффтоп

фунта стрелингов - гы... наверно те, что "настрелял" в электричке
20 мар 14, 11:54    [15758102]     Ответить | Цитировать Сообщить модератору
 Re: Сумма прописью  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Yura_Z, за желание поделится +100, за реализацию -1000, перемножаем, плюс нежелание искать готовое (FAQ) перед выкладыванием ещё -500.
Профит = -100500. Эпический фейл.

iap
проходящий.
Я видел реализацию сей функции размером менее 200 байт.
Кстати, помню, мы ж тут где-то мерялись...
Найти можете?

+ Малдаванский вариант
CREATE FUNCTION [dbo].[fnSumInWordsOrder] (
	@Amount	SmallInt
,	@Order	TinyInt
) RETURNS TABLE AS RETURN
WITH Numbers AS (SELECT * FROM (VALUES
	(1,'unu'  )	-- Una (Mie, Suta), Un (sprezece)
,	(2,'doua' )	-- Doi (Lei)
,	(3,'trei' )
,	(4,'patru')
,	(5,'cinci')
,	(6,'sase' )
,	(7,'sapte')
,	(8,'opt'  )
,	(9,'noua' )
	) N (Num,Name)
), Orders AS (SELECT * FROM (VALUES
	( 0,NULL	,NULL		,1)	-- Currency
--,	( 1,'zeci'	,'zece'		,0)	-- sprezece
--,	( 2,'sute'	,'suta'		,0)
,	( 3,'Mii'	,'mie'		,0)
,	( 6,'Milioane'	,'milion'	,NULL)
,	( 9,'Miliarde'	,'miliard'	,NULL)
,	(12,'Trilioane'	,'trillion'	,NULL)
	) O (Ord,Plural,Singular,Kind)
)
SELECT	IsNull(X.T + ' ','')
+	CASE	WHEN A.Tens	>= 20	THEN S.Name +  'zeci' + IsNull(' si ' + X.F,'') + ' '
		WHEN A.Tens	>  10	THEN X.S + 'sprezece '
		WHEN A.Tens	 = 10	THEN           'zece '
		WHEN A.Amount	>   0	THEN IsNull(X.F + ' ','')
		END
+	IsNull(X.D + ' ','')	AS Name
FROM	(SELECT @Amount,@Amount % 100)	A (Amount,Tens)
	LEFT JOIN Orders	D ON D.Ord = @Order
	LEFT JOIN Numbers	F ON F.Num = A.Amount / 1   % 10
	LEFT JOIN Numbers	S ON S.Num = A.Amount / 10  % 10
	LEFT JOIN Numbers	T ON T.Num = A.Amount / 100 % 10
	CROSS APPLY (SELECT
		CASE WHEN A.Amount = 1	THEN D.Singular	ELSE D.Plural		END
	,	CASE WHEN A.Amount = 1	AND D.Ord = 3	THEN 'una'
		     WHEN F.Num = 2	AND D.Ord = 0	THEN 'doi'
							ELSE F.Name		END
	,	CASE WHEN F.Num = 1	THEN 'un'	ELSE F.Name		END
	,	CASE WHEN T.Num = 1	THEN 'una suta'	ELSE T.Name + ' sute'	END
			)	X (D,F,S,T)
GO
CREATE FUNCTION [dbo].[fnSumInWords] (
	@Amount		Money
--,	@Currency	SmallInt
) RETURNS VarChar(255) WITH RETURNS NULL ON NULL INPUT AS BEGIN RETURN (	-- SELECT dbo.fnSumInWords(1234.56,840)
SELECT	CASE	WHEN @Amount < 1
		THEN 'Zero '
		ELSE Stuff(X.Name,1,1,Upper(Left(X.Name,1)))
		END --+ C.Name + ' ' + S.Coins + ' ' + C.NameCoins
FROM	(SELECT	Left (Str(@Amount,18,2),15)
	,	Right(Str(@Amount,18,2),2)
--	,	Len(@Amount) - 4
	WHERE	@Amount > 0
	AND	@Amount % .01 = 0				)	S(Amount,Coins)
	CROSS APPLY dbo.fnSumInWordsOrder(SubString(S.Amount, 1,3),12)	N4
	CROSS APPLY dbo.fnSumInWordsOrder(SubString(S.Amount, 4,3), 9)	N3
	CROSS APPLY dbo.fnSumInWordsOrder(SubString(S.Amount, 7,3), 6)	N2
	CROSS APPLY dbo.fnSumInWordsOrder(SubString(S.Amount,10,3), 3)	N1
	CROSS APPLY dbo.fnSumInWordsOrder(SubString(S.Amount,13,3), 0)	N0
--	LEFT  JOIN  dbo.Currency					C ON C.ID = @Currency
	CROSS APPLY (SELECT
		IsNull(N4.Name,'')
	+	IsNull(N3.Name,'')
	+	IsNull(N2.Name,'')
	+	IsNull(N1.Name,'')
	+	IsNull(N0.Name,'')				)	X (Name)
) END
GO
Romanian, Румынский, Молдова, Молдавский, сумма прописью
Показываю как идею подхода.
ЗЫ, в этой версии нет Коинов и их спряжения (не требуется).
21 мар 14, 01:07    [15763476]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить