برنامه نویس

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

برنامه نویس

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

تبدیل عدد به حروف در 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

نظرات 10 + ارسال نظر
علی جمعه 3 شهریور‌ماه سال 1391 ساعت 12:55 ق.ظ

سلام. ممنون از وبلاگ خوبتون. یک سوال داشتم! من توی دلفی برای تغییر دادن جهت فرم، یعنی راست به چپ کردن فرم راحت میتونم bidimode رو تغییر بدم و فرم راست به چپ میشه. اما مکان آبجکت ها هم میخوام تغییر بکنه. آیا راهی هست که مکان آبجکت ها بطور خودکار تغییر بکنه یا اینکه باید top و left تک تک آبجکت ها رو تغییر بدم؟ ممنون. منتظر پاسخ شما هستم

رهنما دوشنبه 15 آبان‌ماه سال 1391 ساعت 08:48 ق.ظ http://delphihelp.mihanblog.com

سلام. واقعا برنامه جالبی بود. لذت بردم. نمی دونستم توی SQL هم میشه از این کارا کرد.
راستی یه وبلاگ زدم می خوام تجربیات 15 ساله کار با دلفی رو توش بذارم. اگه ممکنه منو یاری کنید.
آدرسشم این زیر برات گذاشتم. تولیت دوستات اضافه کن.
http://delphihelp.mihanblog.com

رضا منصوری دوشنبه 23 بهمن‌ماه سال 1391 ساعت 03:10 ب.ظ http://c-sharp.ir

با عرض سلام و احترام
در صورتی که با تبادل لینک با ما موافق هستید ما را با نام "سی شارپ!" لینک کنید و در بخش نظرات به ما خبر دهید.
با تشکر
C-Sharp.Ir

ابوذر پنج‌شنبه 27 تیر‌ماه سال 1392 ساعت 08:29 ب.ظ

درود برشما
خیلی کارم راه افتاد خدا کارتون رو راه بندازه.

حسین چهارشنبه 10 اردیبهشت‌ماه سال 1393 ساعت 05:46 ب.ظ

عالی بود
ممنون

نگین یکشنبه 28 اردیبهشت‌ماه سال 1393 ساعت 03:04 ب.ظ

سلام.ممنون. اما وقتی تابع رو اجرا میکنم به من علامت سوال نشون میده...چرا؟

حتما سیستم با فونت فارسی مشکل داره . تنظیمات سیستم رو چک کن و زبان فارسی و ایران انتخاب کن .

فا چهارشنبه 20 اردیبهشت‌ماه سال 1396 ساعت 10:19 ق.ظ

عالی بود تشکر

عباس جمعه 8 دی‌ماه سال 1396 ساعت 01:10 ب.ظ

با سلام ممنون از وبلاگتون
حالا از این تابع گونه باید استفاده کنیم (مخصوصاً در کریستال ریپورت)

اسماعیل شنبه 19 آبان‌ماه سال 1397 ساعت 10:36 ب.ظ

عالی بود پسر

مهدی پنج‌شنبه 16 بهمن‌ماه سال 1399 ساعت 04:50 ب.ظ

مشکل فونت فارسی حل شده. با تشکر
create FUNCTION dbo.FN_Num_ToWords (

@Number Numeric (38, 0) -- Input number with as many as 18 digits

) RETURNS NVARCHAR(4000)

AS BEGIN

DECLARE @inputNumber NVARCHAR(38)
DECLARE @NumbersTable TABLE (number int, word NVARCHAR(10))
DECLARE @outputString NVARCHAR(4000)
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 N'صفر'

IF Left(@Number ,1) <> N'-'
SET @Neg = ' '
ELSE
BEGIN
SET @Neg = N'منفی '
SET @Number = @Number * -1
END

SELECT @inputNumber = CONVERT(Nvarchar(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, N' یک ' UNION ALL SELECT 2, N' دو '
UNION ALL SELECT 3, N' سه ' UNION ALL SELECT 4, N' چهار '
UNION ALL SELECT 5, N' پنج ' UNION ALL SELECT 6, N' شش '
UNION ALL SELECT 7, N' هفت ' UNION ALL SELECT 8, N' هشت '
UNION ALL SELECT 9, N' نه ' UNION ALL SELECT 10, N' ده '
UNION ALL SELECT 11, N' یازده ' UNION ALL SELECT 12, N' دوازده '
UNION ALL SELECT 13, N' سیزده ' UNION ALL SELECT 14, N' چهارده '
UNION ALL SELECT 15, N' پانزده ' UNION ALL SELECT 16, N' شانزده '
UNION ALL SELECT 17, N' هفده ' UNION ALL SELECT 18, N' هیجده '
UNION ALL SELECT 19, N' نوزده ' UNION ALL SELECT 20, N' بیست '
UNION ALL SELECT 30, N' سی ' UNION ALL SELECT 40, N' چهل '
UNION ALL SELECT 50, N' پنجاه ' UNION ALL SELECT 60, N' شصت '
UNION ALL SELECT 70, N' هفتاد ' UNION ALL SELECT 80, N' هشتاد '
UNION ALL SELECT 90, N' نود ' UNION ALL SELECT 100, N' صد '
UNION ALL SELECT 200, N' دویست ' UNION ALL SELECT 300, N' سیصد '
UNION ALL SELECT 400, N' چهارصد ' UNION ALL SELECT 500, N' پانصد '
UNION ALL SELECT 600, N' ششصد ' UNION ALL SELECT 700, N' هفتصد '
UNION ALL SELECT 800, N' هشتصد ' UNION ALL SELECT 900, N' نهصد '


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=N'و '
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 N'و' end end+
(
SELECT word
FROM @NumbersTable
WHERE @tensones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN N' هزار ' WHEN 3 THEN N' میلیون '
WHEN 4 THEN N' میلیارد ' WHEN 5 THEN N' بیلیون '
WHEN 6 THEN N' بیلیارد ' WHEN 7 THEN N' کوانتیلیون '
WHEN 8 THEN N' سکستیلیون ' WHEN 9 THEN N' سپتیلیون '
WHEN 10 THEN N' اکتیلیون ' WHEN 11 THEN N' نونیلیون '
WHEN 12 THEN N' دسیلیون ' WHEN 13 THEN N' اندسیلیون '
ELSE '' END
+ @And + @outputString
END

ELSE BEGIN

if len(@outputString)>0
begin
set @And=N'و '
end
else
begin
set @And=''
end



SET @outputString = ' '
+ (SELECT word
FROM @NumbersTable
WHERE @hundreds+'00' = number)
+ case @hundreds when '0' then '' else N'و' end
+ (SELECT word
FROM @NumbersTable
WHERE @tens+'0' = number)
+ N'و'
+ (SELECT word
FROM @NumbersTable
WHERE @ones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN N' هزار ' WHEN 3 THEN N' میلیون '
WHEN 4 THEN N' میلیارد ' WHEN 5 THEN N' بیلیون '
WHEN 6 THEN N' بیلیارد ' WHEN 7 THEN N' کوانتیلیون '
WHEN 8 THEN N' سکستیلیون ' WHEN 9 THEN N' سپتیلیون '
WHEN 10 THEN N' اکتیلیون ' WHEN 11 THEN N' نونیلیون '
WHEN 12 THEN N' دسیلیون ' WHEN 13 THEN N' اندسیلیون '
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



SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد