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

SQL Server 金額阿拉伯數字轉中文大寫預存程序:完整程式碼與邏輯解析

     編輯:PHP 相關知識

財務系統常需將數字金額轉為中文大寫 (壹貳參肆伍陸柒捌玖拾佰仟萬億)。本文提供完整預存程序 AtoC 程式碼與核心邏輯解析。

核心演算法

  1. 金額 × 100 → 整數 (保留角分),轉字串 @String4。
  2. 依位數長度 @J 從右對齊單位字串 @String2 = '萬仟佰拾億仟佰拾萬仟佰拾元角分'。
  3. 逐位迴圈:數字字元 → 中文數字 (@String1 = '零壹貳參肆伍陸柒捌玖') + 對應單位。
  4. 零值處理:連續零合併為單一「零」、單位位 (元/萬/億) 強制顯示單位避免漏讀。
  5. 特殊單位 (億/萬) 邊界處理:跨組時重置零計數、補上單位。

完整預存程序碼 (已修正語法)

CREATE PROCEDURE AtoC
  @ChangeMoney MONEY
AS
SET NOCOUNT ON
DECLARE @String1 CHAR(20) = '零壹貳參肆伍陸柒捌玖'
DECLARE @String2 CHAR(30) = '萬仟佰拾億仟佰拾萬仟佰拾元角分'
DECLARE @String4 VARCHAR(100) = CAST(@ChangeMoney * 100 AS INT)
DECLARE @J INT = LEN(@String4)
DECLARE @String2Adj VARCHAR(30) = RIGHT(@String2, @J)
DECLARE @i INT = 1
DECLARE @Zero INT = 0
DECLARE @ReturnValue VARCHAR(100) = ''
DECLARE @String3 CHAR(1), @Ch1 VARCHAR(10), @Ch2 VARCHAR(10)

WHILE @i <= @J
BEGIN
  SET @String3 = SUBSTRING(@String4, @i, 1)
  IF @String3 <> '0'
  BEGIN
    SET @Ch1 = SUBSTRING(@String1, CAST(@String3 AS INT) + 1, 1)
    SET @Ch2 = SUBSTRING(@String2Adj, @i, 1)
    SET @Zero = 0
  END
  ELSE
  BEGIN
    IF (@Zero = 0) OR (@i = @J - 9) OR (@i = @J - 5) OR (@i = @J - 1)
      SET @Ch1 = '零'
    ELSE
      SET @Ch1 = ''
    SET @Zero = @Zero + 1
    SET @Ch2 = ''
    -- 億/萬 邊界
    IF @i = @J - 10 BEGIN SET @Ch2 = '億'; SET @Zero = 0 END
    IF @i = @J - 6  BEGIN SET @Ch2 = '萬'; SET @Zero = 0 END
  END
  SET @ReturnValue = @ReturnValue + @Ch1 + @Ch2
  SET @i = @i + 1
END

-- 移除首尾多餘「零」
SET @ReturnValue = REPLACE(@ReturnValue, '零零', '零')
IF LEFT(@ReturnValue, 1) = '零' SET @ReturnValue = SUBSTRING(@ReturnValue, 2, 100)
IF RIGHT(@ReturnValue, 1) = '零' SET @ReturnValue = LEFT(@ReturnValue, LEN(@ReturnValue)-1)

SELECT @ReturnValue AS ChineseAmount
GO

測試範例

EXEC AtoC 1234567.89
-- 結果:壹佰貳拾叁萬肆仟伍佰陸拾柒元捌角玖分

EXEC AtoC 1000000.00
-- 結果:壹佰萬圓整 (需後處理「元」→「圓」、「角分」為零時補「整」)

擴展與維護提醒

  • 支援更大金額:延長 @String2 單位字串 (兆、京、垓...)。
  • 小數位數:目前固定 2 位 (角分),若需更多位請調整乘數與單位字串。
  • 負數處理:前置「負」字,傳入絕對值轉換。
  • 效能:單筆轉換極快,批次轉換建議改為純函數 dbo.fn_MoneyToChinese 內聯呼叫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved