تبدیل اعدد به حروف و نمایش مبلغ پولی در SQL Server با کد T-SQL
گاهی اوقات لازم است مقادیر عددی یا مبالغ پولی را در گزارشات یا فرمهای مختلف به صورت متنی (حروف) نمایش دهید تا خوانایی بهتری برای کاربران داشته باشند. این مقاله نشان میدهد که چگونه میتوانید با استفاده از کد T-SQL در SQL Server، اعداد و واحد پول را به حروف تبدیل کنید. این قابلیت برای سیستمهای مالی، فاکتورها و هر جا که نیاز به نمایش متنی اعداد باشد، بسیار مفید است.
برای شروع، یک تابع در SQL Server ایجاد میکنیم که مسئول تبدیل اعداد صحیح به فرمت متنی آنهاست یعنی تبدیل اعداد به حروف. این تابع یک عدد را به عنوان ورودی دریافت کرده و معادل حروفی آن را بازگرداند.
CREATE FUNCTION dbo.fnNumberToWords (@Number AS BIGINT)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Words VARCHAR(MAX) = ''
DECLARE @Num BIGINT
DECLARE @Part INT
DECLARE @Count INT = 0
DECLARE @Length INT
DECLARE @Temp VARCHAR(20)
DECLARE @Tens TABLE (ID INT, Word VARCHAR(20))
DECLARE @Units TABLE (ID INT, Word VARCHAR(20))
DECLARE @Thousands TABLE (ID INT, Word VARCHAR(20))
INSERT INTO @Tens VALUES (0, ''), (1, 'Ten'), (2, 'Twenty'), (3, 'Thirty'), (4, 'Forty'), (5, 'Fifty'), (6, 'Sixty'), (7, 'Seventy'), (8, 'Eighty'), (9, 'Ninety')
INSERT INTO @Units VALUES (0, ''), (1, 'One'), (2, 'Two'), (3, 'Three'), (4, 'Four'), (5, 'Five'), (6, 'Six'), (7, 'Seven'), (8, 'Eight'), (9, 'Nine'),
(10, 'Ten'), (11, 'Eleven'), (12, 'Twelve'), (13, 'Thirteen'), (14, 'Fourteen'), (15, 'Fifteen'), (16, 'Sixteen'), (17, 'Seventeen'), (18, 'Eighteen'), (19, 'Nineteen')
INSERT INTO @Thousands VALUES (0, ''), (1, 'Thousand'), (2, 'Million'), (3, 'Billion'), (4, 'Trillion'), (5, 'Quadrillion')
SET @Num = @Number
IF @Num = 0
SET @Words = 'Zero'
ELSE
BEGIN
WHILE @Num > 0
BEGIN
SET @Part = @Num % 1000
SET @Num = @Num / 1000
IF @Part > 0
BEGIN
SET @Temp = ''
IF @Part >= 100
BEGIN
SET @Temp = (SELECT Word FROM @Units WHERE ID = @Part / 100) + ' Hundred'
SET @Part = @Part % 100
IF @Part > 0
SET @Temp = @Temp + ' '
END
IF @Part > 0
BEGIN
IF @Part 0 THEN ' ' + (SELECT Word FROM @Units WHERE ID = @Part % 10) ELSE '' END)
END
IF @Count > 0
SET @Temp = @Temp + ' ' + (SELECT Word FROM @Thousands WHERE ID = @Count)
IF @Words = ''
SET @Words = @Temp
ELSE
SET @Words = @Temp + ' ' + @Words
END
SET @Count = @Count + 1
END
END
RETURN @Words
END;
اکنون میتوانید از تابع `dbo.fnNumberToWords` برای تبدیل اعداد به کلمات استفاده کنید. در ادامه چند مثال برای نمایش کاربرد این تابع آورده شده است. این نمونهها نشان میدهند که چگونه اعداد مختلف، از جمله صفر، اعداد کوچک و اعداد بزرگ، به حروف تبدیل میشوند:
SELECT dbo.fnNumberToWords(0) AS ZeroToWords;
SELECT dbo.fnNumberToWords(7) AS SevenToWords;
SELECT dbo.fnNumberToWords(15) AS FifteenToWords;
SELECT dbo.fnNumberToWords(28) AS TwentyEightToWords;
SELECT dbo.fnNumberToWords(100) AS HundredToWords;
SELECT dbo.fnNumberToWords(345) AS ThreeHundredFortyFiveToWords;
SELECT dbo.fnNumberToWords(123456789012345) AS LargeNumberToWords;
علاوه بر تبدیل اعداد، ممکن است نیاز به نمایش مبالغ پولی به صورت حروفی داشته باشید که شامل بخش اعشار و واحد پول مشخصی (مانند دلار، سنت، ریال، تومان) باشد. تابع زیر این کار را انجام میدهد و بخش اصلی و اعشاری مبلغ را جداگانه به حروف تبدیل کرده و سپس با واحد پول ترکیب میکند. این تابع انعطافپذیری بالایی برای نمایش ارزهای مختلف فراهم میکند.
CREATE FUNCTION dbo.fnCurrencyToWords (@Number AS DECIMAL(18, 2), @CurrencyName VARCHAR(50), @SubCurrencyName VARCHAR(50))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Words VARCHAR(MAX)
DECLARE @WholePart BIGINT
DECLARE @DecimalPart INT
SET @WholePart = FLOOR(@Number)
SET @DecimalPart = CAST((@Number - @WholePart) * 100 AS INT)
SET @Words = dbo.fnNumberToWords(@WholePart) + ' ' + @CurrencyName
IF @DecimalPart > 0
BEGIN
SET @Words = @Words + ' and ' + dbo.fnNumberToWords(@DecimalPart) + ' ' + @SubCurrencyName
END
RETURN @Words
END;
اکنون میتوانید از تابع `dbo.fnCurrencyToWords` برای تبدیل مبالغ پولی به حروف استفاده کنید. این مثالها نحوه استفاده از تابع برای مبالغ مختلف با واحد پول “دلار” و “سنت” و همچنین “ریال” و “تومان” را نشان میدهند و به خوبی قابلیت تبدیل ارزی را برای گزارشهای مالی به حروف نمایش میدهند.
SELECT dbo.fnCurrencyToWords(123.45, 'Dollars', 'Cents') AS AmountInDollars;
SELECT dbo.fnCurrencyToWords(789.00, 'Dollars', 'Cents') AS WholeAmountInDollars;
SELECT dbo.fnCurrencyToWords(0.99, 'Dollars', 'Cents') AS LessThanDollar;
SELECT dbo.fnCurrencyToWords(5000000.75, 'Rials', 'Tomans') AS AmountInRials; -- Example for Persian currency (conceptual, requires logic for Rials/Tomans if specific rules needed)