نمایش اعداد بصورت حروف فارسی در 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
موفق باشید