برنامه نویس

به وبلاگ خودتان خوش آمدید.

برنامه نویس

به وبلاگ خودتان خوش آمدید.

تبدیل عدد به حروف در sql


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

تبدیل تاریخ شمسی به حروف در sql

تابع 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