mysql阿拉伯数字转换中文数字函数

news2024/11/15 18:06:50

函数如下

1.中间一部分代码可以提取出来作为公共方法,我这里并没有提取,因为我是在代码中动态添加的

2.样式目前只做了:123转为一百二十三这类的

drop function if EXISTS zz_convert_number_chinese;
create FUNCTION zz_convert_number_chinese (numStr VARCHAR(100),zhfs int,zhys int) RETURNS VARCHAR(100)
DETERMINISTIC
BEGIN
	
	-- zhfs 转换方式 zhys 转换样式
	DECLARE res VARCHAR(100) DEFAULT ''; -- 结果
	DECLARE leftNumStr VARCHAR(100) ; -- 左侧数值
	DECLARE leftNum BIGINT; -- 左侧数值
	DECLARE leftPart1 INT; -- 左侧数值部分 4位
	DECLARE leftPart2 INT; -- 左侧数值部分 4位
	DECLARE leftPart3 INT; -- 左侧数值部分 4位
	DECLARE leftPart4 INT ; -- 左侧数值部分 4位 DEFAULT 0
	DECLARE leftNumResStr VARCHAR(100) DEFAULT ''; -- 左侧数值结果
	DECLARE rightNumStr VARCHAR(100); -- 右侧数值
	DECLARE rightNumResStr VARCHAR(100) DEFAULT ''; -- 右侧数值结果
	DECLARE zfStr VARCHAR(10) DEFAULT ''; -- 正数 负数
	DECLARE lastIsZero INT; -- 最后数值是否为0
	DECLARE unitNames VARCHAR(100) DEFAULT '十,百,千,万,亿'; -- 单位
	DECLARE chineseNums VARCHAR(100) DEFAULT '零,一,二,三,四,五,六,七,八,九'; -- 中文数字
	
	if locate('.',numStr)>0 THEN -- 包含点
		set leftNumStr=SUBSTRING_INDEX(numStr,'.',1);
		set rightNumStr=SUBSTRING_INDEX(numStr,'.',-1);
	ELSE
		set leftNumStr=numStr;
		set rightNumStr='';
	end if;
	if left(leftNumStr,1)='-' then set zfStr='负';set leftNumStr=REPLACE(leftNumStr,'-',''); end if;
	if LENGTH(leftNumStr)>16 then 
		RETURN numStr; -- 超出范围
	end if;
	set leftNum=cast(leftNumStr as signed);
	if leftNum=0 then 
		set leftNumResStr='零';
	else 
		set leftPart1=leftNum % 10000;
		set leftNum=leftNum / 10000;
		set leftPart2=leftNum % 10000;
		set leftNum=leftNum / 10000;
		set leftPart3=leftNum % 10000;
		set leftNum=leftNum / 10000;
		set leftPart4=leftNum % 10000;
		set leftNum=leftNum / 10000;
		if leftPart1>0 then 
			set lastIsZero=1;
			set @i=0;
			set @leftPart1=leftPart1;
			while @leftPart1>0 DO
				set @digit=@leftPart1%10;
				if @digit=0 THEN 
					if lastIsZero=0 then 
						set leftNumResStr=concat('零',leftNumResStr);
					end if;
					set lastIsZero=1;
				else 
					set @tempUnitName='';
					if @i<>0 then 
						set @tempUnitName=SUBSTRING_INDEX(SUBSTRING_INDEX(unitNames,',',@i),',',-1);
					end if;
					set @tempNumberChinese=SUBSTRING_INDEX(SUBSTRING_INDEX(chineseNums,',',@digit+1),',',-1);
					set leftNumResStr=concat(@tempNumberChinese,@tempUnitName,leftNumResStr);
					set lastIsZero=0;
				end if;
				set @leftPart1=@leftPart1 DIV 10;
				set @i=@i+1;
			end while;
			if leftPart1<1000 then 
				set leftNumResStr=concat('零',leftNumResStr);
			end if;
		end if;
		if leftPart2>0 then 
			if leftPart1>0 and leftPart2%10=0 then 
				if leftNumResStr<>'' and left(leftNumResStr,1)<>'零' then 
					set leftNumResStr=concat('零',leftNumResStr);
				end if;
			end if;
		
			set lastIsZero=1;
			set @i=0;
			set @leftPart2=leftPart2;
			set @leftPart2Chinese='';
			while @leftPart2>0 DO
				set @digit=@leftPart2%10;
				if @digit=0 THEN 
					if lastIsZero=0 then 
						set @leftPart2Chinese=concat('零',@leftPart2Chinese);
					end if;
					set lastIsZero=1;
				else 
					set @tempUnitName='';
					if @i<>0 then 
						set @tempUnitName=SUBSTRING_INDEX(SUBSTRING_INDEX(unitNames,',',@i),',',-1);
					end if;
					set @tempNumberChinese=SUBSTRING_INDEX(SUBSTRING_INDEX(chineseNums,',',@digit+1),',',-1);
					set @leftPart2Chinese=concat(@tempNumberChinese,@tempUnitName,@leftPart2Chinese);
					set lastIsZero=0;
				end if;
				set @leftPart2=@leftPart2 DIV 10;
				set @i=@i+1;
			end while;
			set leftNumResStr=concat(@leftPart2Chinese,'万',leftNumResStr);
			if leftPart2<1000 then 
				if leftNumResStr<>'' and left(leftNumResStr,1)<>'零' then 
					set leftNumResStr=concat('零',leftNumResStr);
				end if;
			end if;
		else 
			if leftNumResStr<>'' and left(leftNumResStr,1)<>'零' then 
					set leftNumResStr=concat('零',leftNumResStr);
			end if;
		end if;
		if leftPart3>0 then 
			if leftPart2>0 and leftPart3%10=0 then 
				if leftNumResStr<>'' and left(leftNumResStr,1)<>'零' then 
					set leftNumResStr=concat('零',leftNumResStr);
				end if;
			end if;
		
			set lastIsZero=1;
			set @i=0;
			set @leftPart3=leftPart3;
			set @leftPart3Chinese='';
			while @leftPart3>0 DO
				set @digit=@leftPart3%10;
				if @digit=0 THEN 
					if lastIsZero=0 then 
						set @leftPart3Chinese=concat('零',@leftPart3Chinese);
					end if;
					set lastIsZero=1;
				else 
					set @tempUnitName='';
					if @i<>0 then 
						set @tempUnitName=SUBSTRING_INDEX(SUBSTRING_INDEX(unitNames,',',@i),',',-1);
					end if;
					set @tempNumberChinese=SUBSTRING_INDEX(SUBSTRING_INDEX(chineseNums,',',@digit+1),',',-1);
					set @leftPart3Chinese=concat(@tempNumberChinese,@tempUnitName,@leftPart3Chinese);
					set lastIsZero=0;
				end if;
				set @leftPart3=@leftPart3 DIV 10;
				set @i=@i+1;
			end while;
			set leftNumResStr=concat(@leftPart3Chinese,'亿',leftNumResStr);
			if leftPart3<1000 then 
				if leftNumResStr<>'' and left(leftNumResStr,1)<>'零' then 
					set leftNumResStr=concat('零',leftNumResStr);
				end if;
			end if;
		else 
			if leftNumResStr<>'' and left(leftNumResStr,1)<>'零' then 
					set leftNumResStr=concat('零',leftNumResStr);
			end if;
		end if;
		if leftPart4>0 then 
			if leftPart3=0 then 
				set leftNumResStr=concat('亿',leftNumResStr);
			end if;
		
			set lastIsZero=1;
			set @i=0;
			set @leftPart4=leftPart4;
			set @leftPart4Chinese='';
			while @leftPart4>0 DO
				set @digit=@leftPart4%10;
				if @digit=0 THEN 
					if lastIsZero=0 then 
						set @leftPart4Chinese=concat('零',@leftPart4Chinese);
					end if;
					set lastIsZero=1;
				else 
					set @tempUnitName='';
					if @i<>0 then 
						set @tempUnitName=SUBSTRING_INDEX(SUBSTRING_INDEX(unitNames,',',@i),',',-1);
					end if;
					set @tempNumberChinese=SUBSTRING_INDEX(SUBSTRING_INDEX(chineseNums,',',@digit+1),',',-1);
					set @leftPart4Chinese=concat(@tempNumberChinese,@tempUnitName,@leftPart4Chinese);
					set lastIsZero=0;
				end if;
				set @leftPart4=@leftPart4 DIV 10;
				set @i=@i+1;
			end while;
			set leftNumResStr=concat(@leftPart4Chinese,'万',leftNumResStr);
		end if;
		if left(leftNumResStr,1)='零' then set leftNumResStr=SUBSTR(leftNumResStr,2); end if;
	end if;
	--  整数部分结束 开始小数部分
	if rightNumStr<>'' then 
		set @i=0;
		set @rightLength=LENGTH(rightNumStr);
		while @i<@rightLength DO
			set @rightIndex=cast(SUBSTRING(rightNumStr,@i+1,1) as signed);
			set @tempNumberChinese=SUBSTRING_INDEX(SUBSTRING_INDEX(chineseNums,',',@rightIndex+1),',',-1);
			set rightNumResStr=concat(rightNumResStr,@tempNumberChinese);
			set @i=@i+1;
		end while;
		set leftNumResStr=concat(leftNumResStr,'点',rightNumResStr);
	end if;
	
	RETURN leftNumResStr;
END;

结果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK系列之四---如何通过Filebeat和Logstash优化K8S集群的日志收集和展示

前 言 上一篇文章《日志不再乱: 如何使用Logstash进行高效日志收集与存储》介绍了使用ELK收集通用应用的日志&#xff0c;在目前大多应用都已运行在K8S集群上的环境&#xff0c;需要考虑怎么收集K8S上的日志&#xff0c;本篇就介绍一下如何使用现有的ELK平台收集K8S集群上POD的…

新型供应链攻击手法 — “Revival Hijack”

JFrog 的网络安全研究人员发现了一种名为“Revival Hijack”的新型 PyPI 攻击技术&#xff0c;该技术利用包删除策略绕过安全检查。据统计&#xff0c;超过 22,000 个程序包处于风险之中&#xff0c;可能会影响数十万名用户。 JFrog 的网络安全研究人员发现了一种用于攻击 Pyth…

易灵思时钟输出问题记录

在添加 GPIO时&#xff0c;设置Mode为clkout,并在output Clock中输入时钟名。 这里需要 注意的是&#xff0c; 1. 时钟名不能从core直接输出&#xff0c;而只能使用interface中使用的时钟&#xff0c;如PLL输出的时钟或者GCLK输入的时钟。 2. 易灵思输出时钟不能做其他用途&a…

2024中国产业园区运营商50强榜单揭晓:行业洗牌加速,数智化是关键!

近日&#xff0c;备受瞩目的“2024年度中国产业园区运营商50强”榜单正式揭晓&#xff0c;不仅照亮了行业内的领军之星&#xff0c;更为我们揭示了产业园区运营管理平台在推动经济转型升级中的关键力量与未来趋势的璀璨图景。 从以上产业园区运营商 50 强的角度来看&#xff0…

30岁程序员的焦虑:转行还是继续死磕?现在什么方向更有前景?

最适合转入AI大模型的莫过于程序员和在读大学生了吧。 对于程序员来说&#xff0c;码农之路并不是一帆风顺。对于每一个入行IT业的社会青年来说&#xff0c;谁不是抱着想要成为最高峰的技术大咖或者跃进管理岗的小目标&#xff1f; 然而往往更多的人并非互联网吹捧的如此耀眼…

云原生技术:‌引领数字化转型的新浪潮

云原生技术&#xff1a;‌引领数字化转型的新浪潮 在数字化转型的时代背景下&#xff0c;‌企业面临着前所未有的挑战与机遇。‌随着云计算技术的飞速发展&#xff0c;‌云原生技术作为一种新型的应用程序开发和部署方式&#xff0c;‌正逐步成为构建高可用、‌可扩展应用程序…

MySQL复习1

基本概念 OLTP OLTP&#xff08;On-Line transaction processing&#xff09;翻译为联机事物处理&#xff1b;主要对数据库增删改查。 OLTP 主要用来记录某类业务事件的发生&#xff1b;数据会以增删改查的方式在数据库中更新处理操作&#xff0c;要求实施性强&#xff0c;稳…

OS_程序的装入与链接

2024.09.05&#xff1a;操作系统程序的装入与链接学习笔记 第12节 程序的装入与链接 2.1 程序的装入2.1.1 绝对装入方式2.1.2 可重定位装入方式&#xff08;静态重定位&#xff09;2.1.3 动态运行时装入方式&#xff08;动态重定位&#xff09; 2.2 程序的链接2.2.1 静态链接方…

LIN总线CAPL函数—— 检查LIN报头的时间(ChkStart_LINHeaderToleranceViolation

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

高级算法设计与分析 学习笔记3 哈希表

首先我们要讨论一个把n个数据放到列表S里面的问题&#xff1a; 但很显然&#xff0c;这些数据的范围有多大这个T就得有多大&#xff0c;而实际上要放的数字可能就几个&#xff08;比如就放一个1和一个10000000&#xff0c;那我还是要准备一个巨大的T&#xff09;&#xff0c;不…

【STM32】cubemx配置GPIO

直接使用STM32CubeMX点灯 使用之前的工程 配置GPIO 对四个灯设置GPIO输出 close后直接打开keil 演示

基于LangChain+LLM的相关技术研究及初步实践

0 1 概述 大模型概述 大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能&#xff0c;能够处理更加复杂的任务和数据。大模型在各种领…

提高 Facebook 参与度的 8个技巧

在社交媒体中&#xff0c;Facebook仍然是企业与受众建立联系的重要渠道。无论你是刚刚建立 Facebook 业务主页&#xff0c;还是经验丰富的营销人员&#xff0c;都必须了解人们如何跟你的主页互动。 一、什么是 Facebook 参与度&#xff1f; Facebook的参与度是指用户对你的 F…

潜望长焦+快充:vivo X200系列,小尺寸手机的大突破

在智能手机市场日益激烈的竞争中&#xff0c;厂商们不断推陈出新&#xff0c;以满足消费者多样化的需求。vivo作为中国知名的智能手机品牌&#xff0c;一直以其创新的设计和强大的功能赢得市场的认可。 近日&#xff0c;vivo X200系列的即将发布引起了广泛关注&#xff0c;特别…

开学季装机必备软件 向日葵远程控制,手机也能变电脑

暑假转眼结束&#xff0c;又来到了9月开学季。 这个时间点&#xff0c;不少同学会选择为自己购置一台电脑&#xff0c;放置在宿舍使用。 一台全新的PC电脑该安装哪些软件呢&#xff1f;基本的办公全家桶不用多说&#xff0c;steam、epic等游戏娱乐平台更是无需多言。除此之外…

Spring Cloud Gateway学习记录

Spring中文网 https://springdoc.cn/spring-cloud-gateway/ Spring官网 https://spring.io/projects/spring-cloud-gateway 网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f; 如果…

如何恢复格式化的 Android 智能手机

如何恢复Android手机上格式化的数据 格式化智能手机的存储卡后&#xff0c;您想恢复图片、视频、音乐吗&#xff1f;您想从 Android 手机中恢复已删除的文本吗&#xff1f;格式化存储卡后&#xff0c;如何恢复存储卡上的图片&#xff1f; 使用奇客数据恢复&#xff0c;这款特…

可解释人工智能(XAI)领域的全面概述

AI 模型&#xff0c;尤其是深度学习模型&#xff0c;由于其黑盒性质&#xff0c;在安全关键领域&#xff08;如医疗保健、金融和自动驾驶汽车&#xff09;中面临着重大挑战。用户无法理解模型的内部逻辑和决策过程&#xff0c;这导致了缺乏信任、透明度和问责制。XAI 通过提供模…

C的温故而知新:The Last(C Primer Plus第十六、十七章)

The Last 想必是后面的内容超出大一课程规定的内容了&#xff0c;后面的文章数据惨的可怜。搜一下就能看见&#xff0c;好多人主张这本书后面几张可以不看。咋讲呢&#xff0c;对于这个观点来说&#xff0c;我本人是不认同的&#xff0c;我呢&#xff0c;粗略的看了看后两章的…

降Compose十八掌之『羝羊触蕃』| Handle Platform Lifecycles

公众号「稀有猿诉」 原文链接 降Compose十八掌之『羝羊触蕃』| Handle Platform Lifecycles Jetpack Compose是一个独立的声明式UI框架&#xff0c;它并不受限于任何操作系统平台&#xff0c;从框架定位的角度来讲&#xff0c;它是跨平台的&#xff0c;也应该要跨平台。…