تبدیل اعداد به حروف و مبلغ پولی در SQLSERVER با T-SQL

تبدیل اعدد به حروف و نمایش مبلغ پولی در 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)

من علی دستجردی‌ام؛ عاشق کار با دیتا، از SQL Server تا بیگ‌دیتا و هوش مصنوعی. دغدغه‌ام کشف ارزش داده‌ها و به‌اشتراک‌گذاری تجربه‌هاست. ✦ رزومه من: alidastjerdi.com ✦

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی کامنتها

فوتر سایت

ورود به سایت

sqlyar

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟