当前位置: 首页 > news >正文

MsSQL 函数,实现数字转换成人民币大写

MsSQL 函数,实现数字转换成人民币大写

-- 如果函数已存在则删除
IF OBJECT_ID('dbo.ConvertToRMBChineseNew', 'FN') IS NOT NULLDROP FUNCTION dbo.ConvertToRMBChineseNew
GOCREATE FUNCTION dbo.ConvertToRMBChineseNew
(@NumberInput SQL_VARIANT -- 使用 SQL_VARIANT 兼容数字和字符串输入
)
RETURNS NVARCHAR(200)
AS
BEGINDECLARE @Result NVARCHAR(200)DECLARE @NumStr NVARCHAR(50)DECLARE @IntegerPart NVARCHAR(20)DECLARE @DecimalPart NVARCHAR(2)DECLARE @TempStr NVARCHAR(20)DECLARE @Index INTDECLARE @Len INTDECLARE @Char NCHAR(1)DECLARE @UnitIndex INTDECLARE @ZeroFlag BIT-- 初始化结果SET @Result = N''SET @IntegerPart = N''SET @DecimalPart = N''SET @ZeroFlag = 0-- 定义大写数字和单位DECLARE @Digits TABLE (Digit INT, Char NVARCHAR(1))INSERT INTO @Digits VALUES (0, N'零'), (1, N'壹'), (2, N'贰'), (3, N'叁'), (4, N'肆'), (5, N'伍'), (6, N'陆'), (7, N'柒'), (8, N'捌'), (9, N'玖')DECLARE @Units TABLE (Position INT, Unit NVARCHAR(2))INSERT INTO @Units VALUES (1, N''), (2, N'拾'), (3, N'佰'), (4, N'仟'), (5, N'万'), (6, N'拾'), (7, N'佰'), (8, N'仟'), (9, N'亿'), (10, N'拾'), (11, N'佰'), (12, N'仟')-- 将输入转换为字符串SET @NumStr = LTRIM(RTRIM(CAST(@NumberInput AS NVARCHAR(50))))-- 处理空值或非数字IF @NumStr IS NULL OR @NumStr = '' OR ISNUMERIC(@NumStr) = 0RETURN N'无效输入'-- 转换为绝对值并格式化DECLARE @NumberValue DECIMAL(18,6)SET @NumberValue = ABS(CAST(@NumStr AS DECIMAL(18,6)))-- 分离整数和小数部分 - 修正关键点SET @IntegerPart = CAST(CAST(@NumberValue AS BIGINT) AS NVARCHAR(20))-- **关键修正:正确提取角分**-- 计算小数部分的角(第一位)和分(第二位)DECLARE @JiaoValue INT, @FenValue INTSET @JiaoValue = CAST((@NumberValue - CAST(@NumberValue AS BIGINT)) * 10 AS INT) -- 得到角SET @FenValue = CAST(((@NumberValue - CAST(@NumberValue AS BIGINT)) * 100) AS INT) % 10 -- 得到分-- 将角分转换为字符串用于后续逻辑判断(如果需要)SET @DecimalPart = RIGHT('0' + CAST(@JiaoValue AS NVARCHAR(1)), 1) + RIGHT('0' + CAST(@FenValue AS NVARCHAR(1)), 1)-- 注意:@DecimalPart 现在是 '角分' 两位,如 '60' for 0.6-- 处理整数部分 (保持不变)SET @Len = LEN(@IntegerPart)SET @Index = 1WHILE @Index <= @LenBEGINSET @Char = SUBSTRING(@IntegerPart, @Index, 1)SET @UnitIndex = @Len - @Index + 1SELECT @TempStr = Char FROM @Digits WHERE Digit = CAST(@Char AS INT)IF @Char != '0'BEGINSET @Result = @Result + @TempStrIF @UnitIndex IN (5, 9) OR @TempStr != N'零'SET @Result = @Result + (SELECT Unit FROM @Units WHERE Position = @UnitIndex)SET @ZeroFlag = 0ENDELSEBEGINIF @ZeroFlag = 0BEGINIF @UnitIndex IN (5, 9)SET @Result = @Result + N'零' + (SELECT Unit FROM @Units WHERE Position = @UnitIndex)ELSESET @Result = @Result + N'零'SET @ZeroFlag = 1ENDENDSET @Index = @Index + 1END-- 清理多余的"零"WHILE RIGHT(@Result, 1) = N'零' AND LEN(@Result) > 1 AND LEFT(RIGHT(@Result, 2), 1) != N'元'BEGINSET @Result = LEFT(@Result, LEN(@Result) - 1)ENDSET @Result = REPLACE(@Result, N'零零', N'零')SET @Result = REPLACE(@Result, N'零零', N'零')-- 添加"元"SET @Result = @Result + N'元'-- **关键修正:处理小数部分 (角和分)**DECLARE @Jiao NCHAR(1), @Fen NCHAR(1)SET @Jiao = SUBSTRING(@DecimalPart, 1, 1) -- 第一位是角SET @Fen = SUBSTRING(@DecimalPart, 2, 1)   -- 第二位是分-- 处理角IF @Jiao != '0'BEGINSELECT @TempStr = Char FROM @Digits WHERE Digit = CAST(@Jiao AS INT)SET @Result = @Result + @TempStr + N'角'ENDELSE IF @Fen != '0' -- 角为0但分不为0,需要加"零"BEGINSET @Result = @Result + N'零'END-- 处理分IF @Fen != '0'BEGINSELECT @TempStr = Char FROM @Digits WHERE Digit = CAST(@Fen AS INT)SET @Result = @Result + @TempStr + N'分'END-- **关键修正:只有当角和分都为0时才加"整"**IF @Jiao = '0' AND @Fen = '0'SET @Result = @Result + N'整'-- 清理结果SET @Result = REPLACE(@Result, N'元零整', N'元整')RETURN @Result
END
GO-- 使用示例
-- SELECT dbo.fn_NumberToRMB(6849.6) -- 应返回: 陆仟捌佰肆拾玖元陆角
-- SELECT dbo.fn_NumberToRMB('6849.6') -- 应返回: 陆仟捌佰肆拾玖元陆角
-- SELECT dbo.fn_NumberToRMB(1001) -- 应返回: 壹仟零壹元整
-- SELECT dbo.fn_NumberToRMB(0.05) -- 应返回: 零元伍分
-- SELECT dbo.fn_NumberToRMB(123.45) -- 应返回: 壹佰贰拾叁元肆角伍分
http://www.dtcms.com/a/344270.html

相关文章:

  • IDEA基础配置优化指南(中英双版)
  • matlab中随机森林算法的实现
  • AI重塑职业教育:个性化学习计划提效率、VR实操模拟强技能,对接就业新路径
  • 在Excel和WPS表格中如何隐藏单元格的公式
  • 视觉语言对比学习的发展史:从CLIP、BLIP、BLIP2、InstructBLIP(含MiniGPT4的详解)
  • 一分钟了解六通道 CAN(FD) 集线器
  • 第二阶段WinFrom-6:文件对话框,对象的本地保存,序列化与反序列化,CSV文件操作,INI文件读写
  • 【虚拟化】磁盘置备方式的性能损耗对比
  • k8s应用的包管理Helm工具
  • 基于国产麒麟操作系统的Web数据可视化教学解决方案
  • 【Java SE】深入理解继承与多态
  • 使用 YAML 文件,如何优雅地删除 k8s 资源?
  • Apache Druid SSRF漏洞复现(CVE-2025-27888)
  • 孤独伤感视频素材哪里找?分享热门伤感短视频素材资源网站
  • Sklearn 机器学习 房价预估 使用GBDT训练模型
  • 【Linux我做主】细说进程地址空间
  • Ansible入门:自动化运维基础
  • docker 打包
  • 前端项目打包+自动压缩打包文件+自动上传部署远程服务器
  • 设计模式笔记
  • 开题报告被退回?用《基于大数据的慢性肾病数据可视化分析系统》的Hadoop技术,一次通过不是梦
  • Matplotlib 可视化大师系列(五):plt.pie() - 展示组成部分的饼图
  • 故障诊断:基于大模型的实现方法与开源实践(从入门到精通)
  • Matplotlib 可视化大师系列(一):plt.plot() - 绘制折线图的利刃
  • linux----进度条实现和gcc编译
  • [MySQL数据库] MySQL优化策略
  • imx6ull-驱动开发篇35——设备树下的 platform 驱动实验
  • 【渗透测试】SQLmap实战:一键获取MySQL数据库权限
  • 如何在 Axios 中处理多个 baseURL 而不造成混乱
  • 用过redis哪些数据类型?Redis String 类型的底层实现是什么?