تبدیل عدد به معادل حروف فارسی در SQL Server
تابع تبدیل یک عدد (مثلا 123 (صد و بیست و سه)) به حروف فارسی معادل آن را به زبان TSQL در محیط SQL SERVER 2012 را (به همراه توضیح مختصر ) برای شما آماده کردم .
تابع رو میتونید در ادامه مطلب ببینید.
ادامه مطلب :
----------------------------------------------------------------------------
-- برای اینکه محدودیتی در تعداد ارقام صحیح و اعشاری نداشته باشیم، پارامتر ورودی را از نوع کاراکتری می گیریم
----------------------------------------------------------------------------
CREATE FUNCTION [dbo].[DigitToPersianWord](@Number AS VARCHAR(100))
RETURNS NVARCHAR(2500)
AS
BEGIN
----------------------------------------------------------------------------
-- بررسی تهی یا خالی بودن رشته
----------------------------------------------------------------------------
IF LEN(ISNULL(@Number, '')) = 0 RETURN NULL
----------------------------------------------------------------------------
-- بررسی رشته ورودی برای پیدا کردن کاراکتر غیر عددی، نقطه و منفی
-- بررسی تعداد علامت منفی و نقطه که بیشتر از یک مورد نباشند
-- بررسی اینکه علامت منفی در ابتدای رشته ورودی باشد
----------------------------------------------------------------------------
IF (PATINDEX('%[^0-9.-]%', @Number) > 0)
OR (LEN(@Number) - LEN(REPLACE(@Number, '-', '')) > 1)
OR (LEN(@Number) - LEN(REPLACE(@Number, '.', '')) > 1)
OR (CHARINDEX('-', @Number) > 1)
RETURN 'عدد وارد شده معتبر نمی باشد'
----------------------------------------------------------------------------
-- بررسی صفر بودن ورودی
-- بررسی منفی بودن ورودی
----------------------------------------------------------------------------
IF PATINDEX('%[^0]%', @Number) = 0 RETURN 'صفر'
IF (CHARINDEX('.', @Number) = 1) SET @Number = '0' + @Number
DECLARE @Negative AS VARCHAR(5) = '';
IF LEFT(@Number, 1) = '-'
BEGIN
SET @Number = SUBSTRING(@Number, 2, 100)
SET @Negative = 'منفی '
END
-----------------------------------------------------------------------------
-- درج نام اعداد به فارسی در جدول مربوطه
-----------------------------------------------------------------------------
DECLARE @NumTitle TABLE (val INT,Title NVARCHAR(100));
INSERT INTO @NumTitle (val,Title)
VALUES(0, ''),(1, 'یک') ,(2, 'دو') ,(3, 'سه') ,(4, 'چهار'),(5, 'پنج'),(6, 'شش'),(7, 'هفت'),(8, 'هشت')
,(9, 'نه'),(10, 'ده'),(11, 'یازده'),(12, 'دوازده'),(13, 'سیزده'),(14, 'چهارده') ,(15, 'پانزده'),(16, 'شانزده')
,(17, 'هفده'),(18, 'هجده'),(19, 'نوزده'),(20, 'بیست'),(30, 'سی'),(40, 'چهل'),(50, 'پنجاه'),(60, 'شصت'),(70, 'هفتاد'),(80, 'هشتاد'),(90, 'نود'),(100, 'صد')
,(200, 'دویست'),(300, 'سیصد'),(400, 'چهارصد'),(500, 'پانصد'),(600, 'ششصد'),(700, 'هفتصد'),(800, 'هشتصد'),(900, 'نهصد')
DECLARE @PositionTitle TABLE (id INT,Title NVARCHAR(100));
INSERT INTO @PositionTitle (id,title)
VALUES (1, '') ,(2, 'هزار'),(3, 'میلیون'),(4, 'میلیارد'),(5, 'تریلیون')
,(6, 'کوادریلیون'),(7, 'کوینتیلیون'),(8, 'سیکستیلون'),(9, 'سپتیلیون'),(10, 'اکتیلیون'),(11, 'نونیلیون'),(12, 'دسیلیون')
,(13, 'آندسیلیون'),(14, 'دودسیلیون'),(15, 'تریدسیلیون'),(16, 'کواتردسیلیون'),(17, 'کویندسیلیون'),(18, 'سیکسدسیلیون'),(19, 'سپتندسیلیون'),(20, 'اکتودسیلیوم'),(21, 'نومدسیلیون')
DECLARE @DecimalTitle TABLE (id INT,Title NVARCHAR(100));
INSERT INTO @DecimalTitle (id,Title)
VALUES( 1 ,'دهم' ),(2 , 'صدم'),(3 , 'هزارم'),(4 , 'ده-هزارم'),(5 , 'صد-هزارم'),(6 , 'میلیون ام')
,(7 , 'ده-میلیون ام'),(8 , 'صد-میلیون ام'),(9 , 'میلیاردم'),(10 , 'ده-میلیاردم')
---------------------------------------------------------------------
-- حذف صفرهای غیرضروری موجود در اعشار
---------------------------------------------------------------------
DECLARE @IntegerNumber NVARCHAR(100),
@DecimalNumber NVARCHAR(100),
@PointPosition INT = CASE CHARINDEX('.', @Number) WHEN 0 THEN LEN(@Number) + 1 ELSE CHARINDEX('.', @Number) END
SET @Number = replace(rtrim(replace(@Number,'0',' ')),' ','0');
SET @IntegerNumber = LEFT(@Number, @PointPosition - 1)
SET @DecimalNumber = SUBSTRING(@Number, @PointPosition + 1 , LEN(@Number))
SET @Number= @IntegerNumber
----------------------------------------------------------------------------------
-- جداسازی رقم صحیح و اعشاری
----------------------------------------------------------------------------------
DECLARE @Num AS INT
DECLARE @MyNumbers TABLE (id INT IDENTITY(1, 1), Val1 INT, Val2 INT, Val3 INT)
WHILE (@Number) <> '0'
BEGIN
SET @Num = CAST(SUBSTRING(@Number, LEN(@Number) -2, 3)AS INT)
INSERT INTO @MyNumbers
SELECT (@Num % 1000) -(@Num % 100),
CASE
WHEN @Num % 100 BETWEEN 10 AND 19 THEN @Num % 100
ELSE (@Num % 100) -(@Num % 10)
END,
CASE
WHEN @Num % 100 BETWEEN 10 AND 19 THEN 0
ELSE @Num % 10
END
IF LEN(@Number) > 2
SET @Number = LEFT(@Number, LEN(@Number) -3)
ELSE
SET @Number = '0'
END
-----------------------------------------------------------------------------------
-- جدا کردن سه رقم سه رقم برای بدست آوردن یکان، دهگان و صدگان
-----------------------------------------------------------------------------------
DECLARE @PersianWord AS NVARCHAR(2000) = '';
SELECT @PersianWord += REPLACE(REPLACE(LTRIM(RTRIM(nt1.Title + ' ' + nt2.Title + ' ' + nt3.title)),' ',' '),' ', ' و ')
+ ' ' + pt.title + ' و '
FROM @MyNumbers AS mn
INNER JOIN @PositionTitle pt
ON pt.id = mn.id
INNER JOIN @NumTitle nt1
ON nt1.val = mn.Val1
INNER JOIN @NumTitle nt2
ON nt2.val = mn.Val2
INNER JOIN @NumTitle nt3
ON nt3.val = mn.Val3
WHERE (nt1.val + nt2.val + nt3.val > 0)
ORDER BY pt.id DESC
IF @IntegerNumber ='0'
SET @PersianWord = CASE WHEN PATINDEX('%[^0]%', @DecimalNumber) > 0 THEN @Negative ELSE '' END + 'صفر'
ELSE
SET @PersianWord = @Negative + LEFT (@PersianWord, LEN(@PersianWord) - 2)
DECLARE @PTitle NVARCHAR(100) = ISNULL((SELECT Title FROM @DecimalTitle WHERE id=LEN(@DecimalNumber)),'')
SET @PersianWord += ISNULL(' ممیز '+ [dbo].[DigitToPersianWord](@DecimalNumber) + ' ' + @PTitle,'')
RETURN @PersianWord
END
نمونه کوئری اعمال شده :
SELECT dbo.DigitToPersianWord('321654987496.12345')
نتیجه حاصل :
سیصد و بیست و یک میلیارد و ششصد و پنجاه و چهار میلیون و نهصد و هشتاد و هفت هزار و چهارصد و نود و شش ممیز دوازده هزار و سیصد و چهل و پنج صد-هزارم
- ۹۳/۰۲/۱۵
میشه شمارتونو برای تماس بگید ؟ میخام در مورد پروژه باهاتون صحبت کنم خیلی عجله ایه ؟
ممنون.