alter 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