SQLSEVER 实现货币数字转中文汉字

SQLSEVER 实现数字转换成中文(货币)

-- =============================================
-- Author:		LearnerPing
-- Create date: 2024/10/18
-- Description:	Change Number to Chinese
-- =============================================
Create FUNCTION GetNumberToChi
(	
	@p_amt NUMERIC(19,6)
)
RETURNS NVARCHAR(200) --返回返回值的数据类型
AS
BEGIN 
    DECLARE @p_amt_str NUMERIC(19,2)
    DECLARE @returnStr NVARCHAR(200);

    -- 如果金额大于等于1亿,则返回 '##########'
    IF (@p_amt >= 1000000000) 	
	        SET @returnStr = N'##########';
	ELSE
        -- 否则,返回 '00000000000'
        SET @returnStr = N'00000000000';

    SET @p_amt_str = ROUND(@p_amt,2)
    -- 将金额转换为12位字符串,并右对齐
    SET @returnStr = RIGHT(@returnStr + CAST(ROUND(@p_amt_str, 11, 2) AS NVARCHAR(12)), 12);

    -- 将数字替换为中文数字
    SET @returnStr = REPLACE(@returnStr, N'0', N'零');
    SET @returnStr = REPLACE(@returnStr, N'1', N'壹');
    SET @returnStr = REPLACE(@returnStr, N'2', N'贰');
    SET @returnStr = REPLACE(@returnStr, N'3', N'叁');
    SET @returnStr = REPLACE(@returnStr, N'4', N'肆');
    SET @returnStr = REPLACE(@returnStr, N'5', N'伍');
    SET @returnStr = REPLACE(@returnStr, N'6', N'陆');
    SET @returnStr = REPLACE(@returnStr, N'7', N'柒');
    SET @returnStr = REPLACE(@returnStr, N'8', N'捌');
    SET @returnStr = REPLACE(@returnStr, N'9', N'玖');

    -- 添加单位
    SET @returnStr = @returnStr + N'分';
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 1, 0, N'角');
    SET @returnStr = REPLACE(@returnStr, N'.', N'元');

    -- 添加金额单位
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 5, 0, N'拾');
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 7, 0, N'佰');
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 9, 0, N'仟');
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 11, 0, N'万');
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 13, 0, N'拾');
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 15, 0, N'佰');
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 17, 0, N'仟');
    SET @returnStr = STUFF(@returnStr, LEN(@returnStr) - 19, 0, N'亿');

    -- 替换零和单位
    SET @returnStr = REPLACE(@returnStr, N'零亿', N'零');
    SET @returnStr = REPLACE(@returnStr, N'零仟', N'零');
    SET @returnStr = REPLACE(@returnStr, N'零佰', N'零');
    SET @returnStr = REPLACE(@returnStr, N'零拾', N'零');
    SET @returnStr = REPLACE(@returnStr, N'零零零', N'零');
    SET @returnStr = REPLACE(@returnStr, N'零零', N'零');
    SET @returnStr = REPLACE(@returnStr, N'零万', N'万');
    SET @returnStr = REPLACE(@returnStr, N'零元', N'元');
    SET @returnStr = REPLACE(@returnStr, N'零角', N'零');
    SET @returnStr = REPLACE(@returnStr, N'零分', N'');

    -- 替换壹拾和佰拾
    SET @returnStr = REPLACE(@returnStr, N'壹拾', N'拾');
    SET @returnStr = REPLACE(@returnStr, N'佰拾', N'佰壹拾');

    -- 去除多余的零
    WHILE (LEFT(@returnStr, 1) = N'零') 
	BEGIN
        SET @returnStr = RIGHT(@returnStr, LEN(@returnStr) - 1);
    END 

    IF (LEFT(@returnStr, 1) = N'万') 
        SET @returnStr = RIGHT(@returnStr, LEN(@returnStr) - 1);
     

    IF (LEFT(@returnStr, 1) = N'元') 
        SET @returnStr = RIGHT(@returnStr, LEN(@returnStr) - 1);
     

    WHILE (LEFT(@returnStr, 1) = N'零') 
	BEGIN	
        SET @returnStr = RIGHT(@returnStr, LEN(@returnStr) - 1);
    END 

    WHILE (RIGHT(@returnStr, 1) = N'零') 
	BEGIN	
        SET @returnStr = LEFT(@returnStr, LEN(@returnStr) - 1);
    END 

    -- 替换亿万和零元
    SET @returnStr = REPLACE(@returnStr, N'亿万', N'亿零');
    SET @returnStr = REPLACE(@returnStr, N'零元', N'元');

    -- 如果返回字符串为空,则返回 '零元'
    IF (@returnStr = N'') 
        SET @returnStr = N'零元';
    

    -- 如果以元结尾,则添加 '正'
    IF (RIGHT(@returnStr, 1) = N'元') 
        SET @returnStr = @returnStr + N'正';
   
    RETURN @returnStr;
END;

可以在保留两位小数的前提下转换

posted @   LearnerPing  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示