create FUNCTION dbo.Num_ToWords (
@Number Numeric (38, 0) -- Input number with as many as 18 digits
) RETURNS VARCHAR(8000)
AS BEGIN
DECLARE @inputNumber VARCHAR(38)
DECLARE @NumbersTable TABLE (number int, word VARCHAR(10))
DECLARE @outputString VARCHAR(8000)
DECLARE @length INT
DECLARE @counter INT
DECLARE @loops INT
DECLARE @position INT
DECLARE @chunk CHAR(3)
DECLARE @tensones CHAR(2)
DECLARE @hundreds CHAR(1)
DECLARE @tens CHAR(1)
DECLARE @ones CHAR(1)
DECLARE @And nvarchar(3)
DECLARE @Neg nvarchar(10)
IF @Number = 0 return 'صفر'
IF Left(@Number ,1) <> '-'
SET @Neg = ' '
ELSE
BEGIN
SET @Neg = 'منفی '
SET @Number = @Number * -1
END
SELECT @inputNumber = CONVERT(varchar(38), @Number)
, @outputString = ''
, @counter = 1
SELECT @length = LEN(@inputNumber)
, @position = LEN(@inputNumber) - 2
, @loops = LEN(@inputNumber)/3
IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1
INSERT INTO @NumbersTable SELECT 0, ''
UNION ALL SELECT 1, ' یک ' UNION ALL SELECT 2, ' دو '
UNION ALL SELECT 3, ' سه ' UNION ALL SELECT 4, ' چهار '
UNION ALL SELECT 5, ' پنج ' UNION ALL SELECT 6, ' شش '
UNION ALL SELECT 7, ' هفت ' UNION ALL SELECT 8, ' هشت '
UNION ALL SELECT 9, ' نه ' UNION ALL SELECT 10, ' ده '
UNION ALL SELECT 11, ' یازده ' UNION ALL SELECT 12, ' دوازده '
UNION ALL SELECT 13, ' سیزده ' UNION ALL SELECT 14, ' چهارده '
UNION ALL SELECT 15, ' پانزده ' UNION ALL SELECT 16, ' شانزده '
UNION ALL SELECT 17, ' هفده ' UNION ALL SELECT 18, ' هیجده '
UNION ALL SELECT 19, ' نوزده ' UNION ALL SELECT 20, ' بیست '
UNION ALL SELECT 30, ' سی ' UNION ALL SELECT 40, ' چهل '
UNION ALL SELECT 50, ' پنجاه ' UNION ALL SELECT 60, ' شصت '
UNION ALL SELECT 70, ' هفتاد ' UNION ALL SELECT 80, ' هشتاد '
UNION ALL SELECT 90, ' نود ' UNION ALL SELECT 100, ' صد '
UNION ALL SELECT 200, ' دویست ' UNION ALL SELECT 300, ' سیصد '
UNION ALL SELECT 400, ' چهارصد ' UNION ALL SELECT 500, ' پانصد '
UNION ALL SELECT 600, ' ششصد ' UNION ALL SELECT 700, ' هفتصد '
UNION ALL SELECT 800, ' هشتصد ' UNION ALL SELECT 900, ' نهصد '
WHILE @counter <= @loops BEGIN
SET @chunk = RIGHT('000' + SUBSTRING(@inputNumber, @position, 3), 3)
IF @chunk <> '000' BEGIN
SELECT @tensones = SUBSTRING(@chunk, 2, 2)
, @hundreds = SUBSTRING(@chunk, 1, 1)
, @tens = SUBSTRING(@chunk, 2, 1)
, @ones = SUBSTRING(@chunk, 3, 1)
IF CONVERT(INT, @tensones) <= 20 OR @Ones='0' BEGIN
if len(@outputString)>0
begin
set @And='و '
end
else
begin
set @And=''
end
SET @outputString = (SELECT word
FROM @NumbersTable
WHERE @hundreds+'00' = number)
+ case @hundreds when '0' then '' else
case @tensones when '00' then '' else 'و' end end+
(
SELECT word
FROM @NumbersTable
WHERE @tensones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN ' هزار ' 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 ' اندسیلیون '
ELSE '' END
+ @And + @outputString
END
ELSE BEGIN
if len(@outputString)>0
begin
set @And='و '
end
else
begin
set @And=''
end
SET @outputString = ' '
+ (SELECT word
FROM @NumbersTable
WHERE @hundreds+'00' = number)
+ case @hundreds when '0' then '' else 'و' end
+ (SELECT word
FROM @NumbersTable
WHERE @tens+'0' = number)
+ 'و'
+ (SELECT word
FROM @NumbersTable
WHERE @ones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN ' هزار ' 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 ' اندسیلیون '
ELSE '' END
+ @And + @outputString
END
END
SELECT @counter = @counter + 1
, @position = @position - 3
END
SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, ' ', ' ')))
SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000)
SET @outputstring = @Neg + @outputstring
RETURN @outputString
END
GO
GRANT EXEC on dbo.Num_ToWords TO PUBLIC
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
تابع date_to_words با سه پارامتر ورودی که سال و ماه و روز را به صورت رشته ای دریافت و یک رشته برمیگرداند . خود کد واضح و نیاز به توضیح نداره . نظر یادتون نشه .
create FUNCTION date_to_words (@year_ as varchar(4),@mon_ as varchar(2),@day_ as varchar(2) ) RETURNS
VARCHAR(100)
as
BEGIN
/*
declare @year_ as varchar(4)
declare @mon_ as varchar(2)
declare @day_ as varchar(2)
set @year_='1390'
set @mon_='01'
set @day_='02'*/
/* Converts date into words */
DECLARE @yr INT
DECLARE @dateval INT
DECLARE @thousand INT
DECLARE @hundred INT
DECLARE @tens INT
DECLARE @mon INT
DECLARE @tensword VARCHAR(10)
DECLARE @onesword VARCHAR(10)
DECLARE @thousandsword VARCHAR(20)
DECLARE @hundredsword VARCHAR(20)
DECLARE @datevalsword VARCHAR(20)
DECLARE @MonWord VARCHAR(20)
SET @yr=cast(@year_ as int)
SET @dateval=cast(@day_ as int)
Set @mon=cast(@mon_ as int)
/* Mon TO WORDS */
SELECT @MonWord =CASE @Mon
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 ' اذر ماه '
WHEN 10 THEN ' دی ماه '
WHEN 11 THEN ' بهمن ماه '
WHEN 12 THEN ' اسفند ماه '
END
/* DAY TO WORDS */
SELECT @datevalsword =CASE @dateval
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 'نهم '
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 'نوزدهم '
WHEN 20 THEN 'بیستم '
WHEN 21 THEN ' بیست و یکم '
WHEN 22 THEN ' بیست و دوم '
WHEN 23 THEN 'بیست و سوم'
WHEN 24 THEN 'بیست و چهارم '
WHEN 25 THEN 'بیست و پنجم '
WHEN 26 THEN 'بیست و ششم '
WHEN 27 THEN 'بیست و هفتم '
WHEN 28 THEN 'بیست و هشتم '
WHEN 29 THEN 'بیست و نهم '
WHEN 30 THEN 'سیم '
WHEN 31 THEN 'سی و یکم '
END
/* YEAR TO WORDS */
set @thousand=floor(@yr/1000)
set @yr = @yr - @thousand * 1000
set @hundred = floor(@yr / 100)
set @yr = @yr - @hundred * 100
IF (@yr > 19)
begin
set @tens = floor(@yr / 10)
set @yr = @yr % 10
end
ELSE
set @tens=0
SELECT @thousandsword=CASE @thousand
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
SELECT @hundredsword=CASE @hundred
WHEN 0 then ''
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
if (@hundred<>'')
set @hundredsword=' و '+@hundredsword
/*@tens To WORDS*/
SELECT @tensword=CASE @tens
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
if (@tens<>'')
set @tensword=' و '+@tensword
/*ONES To WORDS*/
SELECT @onesword=CASE @yr
WHEN 0 THEN ''
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 'نه '
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 'نوزده '
END
if (@yr<>'')
set @onesword=' و '+@onesword
return (@datevalsword+@monWord+@thousandsword+@hundredsword+ @tensword+' '+@onesword)
END