首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 數字金額轉中文大寫函數(L2U)

     編輯:關於SqlServer

函數用途

將數值型別的金額(如 1234.56)轉換為中文大寫金額格式(壹仟貳佰參拾肆元伍角陸分),適用於發票列印、財務報表、支票列印等場景。

完整函數定義


IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[L2U]') AND xtype IN (N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[L2U];
GO

CREATE FUNCTION [dbo].[L2U] (@amount NUMERIC(18,2))
RETURNS NVARCHAR(200)
AS
BEGIN
    DECLARE @result NVARCHAR(200) = N'';
    DECLARE @digits NVARCHAR(20) = N'零壹貳參肆伍陸柒捌玖';
    DECLARE @units NVARCHAR(20) = N'拾佰仟';
    DECLARE @bigUnits NVARCHAR(20) = N'萬億兆';
    DECLARE @intPart BIGINT = FLOOR(@amount);
    DECLARE @decPart INT = ROUND((@amount - @intPart) * 100, 0);
    DECLARE @str NVARCHAR(50) = CAST(@intPart AS NVARCHAR(50));
    DECLARE @len INT = LEN(@str);
    DECLARE @i INT = 1;
    DECLARE @zeroFlag BIT = 0;

    -- 整數部分轉換(簡易版,實務建議用遞迴或查表法處理萬/億進位)
    WHILE @i <= @len
    BEGIN
        DECLARE @d INT = CAST(SUBSTRING(@str, @len - @i + 1, 1) AS INT);
        DECLARE @u NVARCHAR(1) = CASE WHEN @i = 1 THEN N'' ELSE SUBSTRING(@units, (@i - 1) % 4, 1) END;
        DECLARE @bu NVARCHAR(1) = CASE WHEN @i % 4 = 1 AND @i > 1 THEN SUBSTRING(@bigUnits, @i / 4, 1) ELSE N'' END;

        IF @d = 0
        BEGIN
            IF @zeroFlag = 0 AND @i < @len
                SET @result = N'零' + @result;
            SET @zeroFlag = 1;
        END
        ELSE
        BEGIN
            SET @result = SUBSTRING(@digits, @d + 1, 1) + @u + @bu + @result;
            SET @zeroFlag = 0;
        END
        SET @i = @i + 1;
    END

    -- 處理小數部分(角、分)
    IF @decPart > 0
    BEGIN
        DECLARE @jiao INT = @decPart / 10;
        DECLARE @fen INT = @decPart % 10;
        IF @jiao > 0 SET @result = @result + N'元' + SUBSTRING(@digits, @jiao + 1, 1) + N'角';
        ELSE SET @result = @result + N'元零';
        IF @fen > 0 SET @result = @result + SUBSTRING(@digits, @fen + 1, 1) + N'分';
        ELSE SET @result = @result + N'整';
    END
    ELSE
    BEGIN
        SET @result = @result + N'元整';
    END

    RETURN @result;
END;
GO

使用範例


SELECT dbo.L2U(0)          -- 零元整
SELECT dbo.L2U(1234.56)    -- 壹仟貳佰參拾肆元伍角陸分
SELECT dbo.L2U(10000.00)   -- 壹萬元整
SELECT dbo.L2U(1000000.01) -- 壹佰萬元零壹分

注意事項

  • 輸入參數型別為 NUMERIC(18,2),超出範圍會截斷或報錯。
  • 函數為標量函數,大量資料列呼叫時效能較差,建議在應用層轉換或使用 CLR 函數優化。
  • 大數位(兆以上)邏輯需依實際業務擴充 @bigUnits。
  • 可搭配 REPLACE 處理「零零」→「零」、「零角」→「零」等邊界情況。

替代方案

  • CLR 整合:以 C# 實作 NumberToChinese 註冊為 SQL CLR 函數,效能更佳且邏輯更清晰。
  • 前端格式化:在報表工具(SSRS、Crystal Reports)或應用程式(C#、Java)層轉換,資料庫僅存儲數值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved