PSPCommunity.org ورود | ثبت نام | كمك

مهدي شيخي (Mahdi Sheikhi)

SharePoint Blog نگاهي بر مايکروسافت شرپوينت

بيشترين بازديد شده

نمایش اعداد بصورت حروف فارسی در Sql Server

 

نمایش اعداد بصورت حروف فارسی

در آخرین پروژه ای که کار میکردم نیاز بود که داده های عددی  را بصورت کاراکترهای فارسی یا بهتر بگویم به حروف فارسی نمایش بدهم . تا به حال این کار را در خیلی از نرم افزارها با استفاده از توابعی که با زبانهای سطح بالاتر مثل c# یا Delphi  و ... نوشته شده بود انجام می دادیم اما اینجا نیاز به این تبدیل تا سطح پایگاه داده پایین اومده بود .

فکر کردم شاید دوستان دیگری هم به همچینین موردی برخورد کنند در زیر این تابع آورده شده است.

همانطور که میدانید اصطلاحا به توابع در پایگاه داده UDF  یا User Define Function  میگویند. در زیر نحوه استفاده و خروجی تابع را مشاهده میکنید.

 

صدا کردن تابع :

Select dbo. NumberToPersianWords(654321)

خروجی تابع :   ششصد و پنجاه و چهار هزار و سیصد و بیست و یک

مثال استفاده در Query

Select  FactorNumber , dbo. NumberToPersianWords(Amount)

From Factor

 

 

Create FUNCTION dbo.NumberToPersianWords(@Number Numeric (38, 0))

RETURNS VARCHAR(8000)

AS BEGIN

DECLARE @inputNumber VARCHAR(38)

DECLARE @NumbersTable TABLE (number CHAR(2), word VARCHAR(10))

DECLARE @outputString VARCHAR(8000)

DECLARE @length INT

DECLARE @counter INT

DECLARE @loops INT

DECLARE @position INT

DECLARE @chunk CHAR(3) -- for chunks of 3 numbers

DECLARE @tensones CHAR(2)

DECLARE @hundreds CHAR(1)

DECLARE @tens CHAR(1)

DECLARE @ones CHAR(1)

 

IF @Number = 0 Return 'صفر'

 

-- initialize the variables

SELECT @inputNumber = CONVERT(varchar(38), @Number)

     , @outputString = ''

     , @counter = 1

SELECT @length   = LEN(@inputNumber)

     , @position = LEN(@inputNumber) - 2

     , @loops    = LEN(@inputNumber)/3

 

-- make sure there is an extra loop added for the remaining numbers

IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1

 

-- insert data for the numbers and words

INSERT INTO @NumbersTable   SELECT '00', ''

    UNION ALL SELECT '01', 'يك'      UNION ALL SELECT '02', 'دو'

    UNION ALL SELECT '03', 'سه'    UNION ALL SELECT '04', 'چهار'

    UNION ALL SELECT '05', 'پنج'     UNION ALL SELECT '06', 'شش'

    UNION ALL SELECT '07', 'هفت'    UNION ALL SELECT '08', 'هشت'

    UNION ALL SELECT '09', 'نه'     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', 'نود'  

 

WHILE @counter <= @loops BEGIN

 

      -- get chunks of 3 numbers at a time, padded with leading zeros

      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 twenty or less, use the word directly from @NumbersTable

            IF CONVERT(INT, @tensones) <= 20 OR @Ones='0' BEGIN

                  SET @outputString = (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

                               + @outputString

                END

             ELSE BEGIN -- break down the ones and the tens separately

 

             SET @outputString = ' '

                            + (SELECT word

                                    FROM @NumbersTable

                                    WHERE @tens + '0' = number)

                                       + ' و '

                             + (SELECT word

                                    FROM @NumbersTable

                                    WHERE '0'+ @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

                            + @outputString

            END

 

            -- now get the hundreds

            IF @hundreds <> '0' BEGIN

                  SET @outputString  = (SELECT word

                                      FROM @NumbersTable

                                      WHERE '0' + @hundreds = number)

                                          + ' صد '

                                + @outputString

            END

      END

 

      SELECT @counter = @counter + 1

           , @position = @position - 3

 

END

 

-- Remove any double spaces

SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, '  ', ' ')))

SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000)

 

 

RETURN @outputString -- return the result

END

GO

 

GRANT EXEC on DBO.NumberToPersianWords TO PUBLIC

GO

 

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

 

موفق باشید

 

Posted: Tuesday, May 11, 2010 11:25 PM توسط Mahdi

نظرات

محسن گفته:

تابع بسیار مفیدی است

ممنون از شما

# May 30, 2010 3:08 PM

روح الله دلپاک گفته:

جالب و آموزنده بود. با تشکر از شما.

# July 4, 2010 4:48 PM

delphiboy گفته:

سلام. شماکه زحمت کشیدید در یک سورس انگلیسی کلمات را با معادل فارسی عوض کردید، باید به این نکته توجه میکردید که two hundred در فارسی میشود دویست، نه دو صد!!!

# June 7, 2011 12:36 AM

محسن گفته:

دست گلتون درد نکنه ... ممنون

# July 19, 2011 8:25 PM

شیخی گفته:

سلام

اقای شیخی ببخشیدشما از کدام شیخی ها هستید؟ gasemsadgee@ymail.com

# December 16, 2011 9:04 PM

shamimm گفته:

سلام

آقای شیخی میشه منو راهنمایی کنید؟

ببینید من میخوام اعداد رو به صورت فارسی بنویسم

نه به صورت حروف

یعنی اگه مینوسم 1 ... این عدد 1 به صورت فارسی نوشته بشه نه به صورت انگلیسی

دقیقا مثل اینکه توی دستور insert برای فارسی نوشتن فیلدها اولش N اضافه میکردیم حالا چطوری اعدادمون رو فارسی کنیم؟ اگه راهنمایی دقیق کنید ممنون میشم یا به ایمیلم بفرستید البته با مثال بهم بگید که به استادمون بگم

# December 27, 2012 1:37 AM
نظرات افراد ناشناس غير فعال مي باشد