最近有个需求,需要显示汉字数字,比如一二三四五…这样子,问题看起来挺简单,但我没有找到有自带这样的转换的方法,数字转汉字数字,挺有意思的,就简单研究了一下;
百度了一下,有个基本的思路就是预定义有个数字,直接取:

var baseStr = new List<string>() { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十",};

直接按下标就能实现1~10的转换了;
但是超过10怎么办呢?不可能把所有数字预定义啊。那就组合拼装一下:

var baseStr = new List<string>() { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", };
var signs = new List<string>() { "十", "百", "千", "万",}

一下子就把范围扩大大99999了,通过各个位数的值,进行转换,这样你就可以会得到 “一十”,“一十一”,“一百零” ,“三千零零五”,这样不符合表达的结果;

算了,文章不会写。总之,经过一系列的演化,直接上源码吧;

准备好预定义的汉字数字(兆后面都是百度来的):

var signs = new List<string>() { "十", "百", "千", "万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧", "正", "载", "极", "恒河沙", "阿僧祇", "那由他", "不可思议", "无量大数" };var baseStr = new List<string>() { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", };

做个初始判断,支持正负号:

var charFirst = numStr.First();int startNumIndex = 0;string firstSign = string.Empty;if (!char.IsNumber(charFirst)){if (!charFirst.Equals('-')){if (!charFirst.Equals('+')){outString = $"输入参数第一位“ {charFirst} ”既不是数字也不是正负符号。";return false;}firstSign = "正";}else{firstSign = "负";}startNumIndex = 1;}var realStr = numStr.Substring(startNumIndex, numStr.Length - startNumIndex);realStr.Trim();realStr.ToList().RemoveAll(p => !char.IsNumber(p));var strTemp = realStr.ToString();if (string.IsNullOrEmpty(strTemp)){outString = $"输入参数“ {numStr} ”没有数字!";return false;}

从各位开始判断,拼接字符串:

var werishu = strTemp.Length;var strReverse = strTemp.Reverse().ToList();var strResult = string.Empty;bool isShowZero = ShowZero();for (int index = 0; index < werishu; index++){var ch = strReverse[index];var tempNumber = int.Parse(ch.ToString());strResult = $"{Trans(tempNumber, index - 1, isShowZero)}{strResult}";if (tempNumber == 0){isShowZero = false;}}outString = $"{firstSign}{strResult}";return true;

是否显示“零的判断”,处理“一百”,“一千”,“一万” 这样的情况

bool ShowZero(){var sub1 = strTemp.IndexOf("0");bool need0 = false;if (sub1 != -1){var less = strTemp.Length - sub1 - 1;if (werishu == 1 ||(less > 0 && strTemp.Substring(sub1 + 1).Count(p => p.Equals('0')) != less)){// 不是连续的0,要保留显示“零”need0 = true;}}return need0;}

转换逻辑,按位取对应数字和单位

string Trans(int value, int signIndex, bool showZero){if (value == 1 && signIndex == 0){return signs[signIndex];}var strSign = signs[0];strSign = CalSign(signIndex); var tempResult = $"{GeStr(value, showZero)}{strSign }";return tempResult;}

获取对应数字的逻辑:

string GeStr(int baseStrIdex, bool showZero){if (showZero){return baseStr[baseStrIdex];}return baseStrIdex == 0 ? string.Empty : baseStr[baseStrIdex];}

重点来了,单位计算,比如十万~千万,是单位与单位的拼接:

string CalSign(int signIndex){var strSign = string.Empty;var realSignIndex = signIndex;if (realSignIndex < 4){return GetSignStr(realSignIndex);}int signSecond = 4; // 到亿if (realSignIndex < 7){// 到亿return $"{GetSignStr(signIndex - signSecond)}";}if (realSignIndex == 7){return GetSignStr(signSecond);}realSignIndex -= 7;var signLen = 4;var n = realSignIndex / signLen;if (realSignIndex == n * signLen){return GetSignStr(n + signSecond);}return strSign = $"{GetSignStr(realSignIndex - (n * signLen) - 1)}";string GetSignStr(int indexTemp){return indexTemp == -1 ? string.Empty : signs[indexTemp];}}

至此,完成!

欢迎加入我的QQ群,一起探讨Revit二次开发技术!

QQ群:631436766

全部带入如下,复制粘贴即可

public bool GetChineseNumber(string numStr, out string outString){outString = string.Empty;if (!CheckValid(numStr, ref outString, out var strTemp, out var firstSign)){return false;}var signs = new List<string>() { "十", "百", "千", "万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧", "正", "载", "极", "恒河沙", "阿僧祇", "那由他", "不可思议", "无量大数" };var baseStr = new List<string>() { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", };bool isShowZero = IsShowZero(strTemp);var len = strTemp.Length;var strReverse = strTemp.Reverse().ToList();var strResult = string.Empty;for (int index = 0; index < len; index++){var ch = strReverse[index];var tempNumber = int.Parse(ch.ToString());var signIndex = index - 1;string tempResult;if (tempNumber == 1 && signIndex == 0 && len == 2){tempResult = signs[signIndex];}else{ var strSign = CalSign(signIndex, signs);var showZero = isShowZero && index > 0;tempResult = $"{GeStr(tempNumber, showZero, baseStr)}{strSign}";}strResult = $"{tempResult}{strResult}";if (tempNumber == 0){isShowZero = false;}}outString = $"{firstSign}{strResult}";return true;}private bool CheckValid(string numStr, ref string outString, out string realNumberString, out string firstSign){realNumberString = string.Empty;var charFirst = numStr.First();var startNumIndex = 0;firstSign = string.Empty;if (!char.IsNumber(charFirst)){if (!charFirst.Equals('-')){if (!charFirst.Equals('+')){outString = $"输入参数第一位“ {charFirst} ”既不是数字也不是正负符号。";return false;}firstSign = "正";}else{firstSign = "负";}startNumIndex = 1;}var realStr = numStr.Substring(startNumIndex, numStr.Length - startNumIndex);realStr.Trim();realStr.ToList().RemoveAll(p => !char.IsNumber(p));realNumberString = realStr.ToString();if (string.IsNullOrEmpty(realNumberString)){outString = $"输入参数“ {numStr} ”没有数字!";return false;}return true;}private string CalSign(int signIndex, List<string> signs){var realSignIndex = signIndex;if (realSignIndex < 4){return GetSignStr(realSignIndex);}int signSecond = 4; // 到亿if (realSignIndex < 7){// 到亿return $"{GetSignStr(signIndex - signSecond)}";}if (realSignIndex == 7){return GetSignStr(signSecond);}realSignIndex -= 7;var signLen = 4;var n = realSignIndex / signLen;if (realSignIndex == n * signLen){return GetSignStr(n + signSecond);}string strSign;return strSign = $"{GetSignStr(realSignIndex - (n * signLen) - 1)}";string GetSignStr(int indexTemp){return indexTemp == -1 ? string.Empty : signs[indexTemp];}}private string GeStr(int baseStrIdex, bool showZero, List<string> baseStr){if (showZero){return baseStr[baseStrIdex];}return baseStrIdex == 0 ? string.Empty : baseStr[baseStrIdex];}private bool IsShowZero(string strTemp){int len = strTemp.Length;var sub1 = strTemp.IndexOf("0");bool need0 = false;if (sub1 != -1){var less = strTemp.Length - sub1 - 1;if (len == 1 ||(less > 0 && strTemp.Substring(sub1 + 1).Count(p => p.Equals('0')) != less)){// 不是连续的0,要保留显示“零”need0 = true;}}return need0;}

数字转义汉字数字显示的简单研究相关推荐

  1. 基于Ubuntu系统,调用opencv在图片上显示数字和汉字

    文章目录 一.汉字编码的介绍 1.汉字编码的发展过程 (1)汉字编码产生的原因 (2)常用的汉字编码 2.区位码 (1)产生原因 (2)概念简述 (3)区域分布情况 3.机内码 (1)基本概念 (2) ...

  2. 蔡盈芳:企业数字档案馆整体架构及其层次模型研究

    文章来源: http://www.idangan.cn/Literature_info.asp?id=116 企业数字档案馆整体架构及其层次模型研究 2010-5-14   蔡盈芳 内容摘要  本文论 ...

  3. Python实现银行金额大写汉字转换【简单易懂,代码可以直接运行】

    Python实现银行金额大写汉字转换[简单易懂] 业务需求: •银行电子支票业务在金额部分需要使用大写的汉字,因此需要将用户录入的数字信息转变为汉字. •目前只需完成1~5位整数转换即可. 关键技术分 ...

  4. Python实现银行金额大写汉字转换【简单易懂】!!

    Python实现银行金额大写汉字转换[简单易懂] 业务需求: •银行电子支票业务在金额部分需要使用大写的汉字,因此需要将用户录入的数字信息转变为汉字. •目前只需完成1~5位整数转换即可. 关键技术分 ...

  5. html 将数字转为汉字,怎么将wps中的数字转换成汉字 wps将数字转换汉字的步骤教程...

    在WPS编辑表格数据时,如果我们想要将表格中的数字全部转换成汉字,该如何转换?方法其实很简单,不过还有很多用户不太清楚转换方法,下面教程之家网为大家分享wps将数字转换汉字的步骤教程,不会转换的朋友可 ...

  6. 0.96寸OLED显示汉字图片及简单GIF

    0.96寸OLED显示汉字图片及简单GIF 只是做一些简单显示,具体逻辑大家自行添加. 网上的OLED驱动很多,我懂的也不是很深,这里就不说了,我这里用的是中景园的驱动.这里重点说怎么改可以显示这些东 ...

  7. 批量删除文件夹名称中的所有数字和汉字

    概要:这里给大家介绍一下如何批量的删除文件夹名称中的所有的数字.我们都知道一些常见的批量重命名文件名的方法,但是呢,如果这个文件夹名称中有数字,并且这些数字并不是我们想要的内容,这个时候我们就可以使用 ...

  8. Java数字图像处理基础-------Java Swing简单使用,图形绘画---画五角星

    Java数字图像处理基础-------Java Swing简单使用,图形绘画-画五角星 一:简介 要画出五角星出来,我们只需要在面板上产生5个点,然后把这5个点进行连接就可实现: 二:代码演示 imp ...

  9. Java 数字转汉字工具类

    Java 数字转汉字工具类 一.工具类--NumberToCnUtil package com.example.demotest.util;import java.util.Arrays; impor ...

  10. Python 正则表达式+字符串分割(数字/字母/汉字/特殊字符)

    1. 基本知识 函数 说明 \u0041-\u005a 大写字母unicode范围 \u0061-\u007a 小写字母unicode范围 \u0041-\u007a 英文字母unicode范围 \u ...

最新文章

  1. ExtJs之Ext.grid.GridPanel(部分未完)
  2. 比特安索孟雄晖:软件授权的新开始
  3. 一种创建进程间COM来启动IE的方式
  4. VS2010 教程:创建一个 WPF 应用程序 (第一节)
  5. 【集合】Vector 是线程安全的?
  6. 【车牌识别】+【模板匹配】基于智能交通的车牌识别系统
  7. 职称计算机 宜兴,关于报送2020年经济、石油化工工程、 电子信息工程和工艺美术高级专业技术资格评审材料的通知...
  8. linux中板子烧写环境配置,3、在Linux下搭建51单片机的开发烧写环境(makefile版)...
  9. 文件不小心删除了怎么恢复呢,怎么恢复误删除的文件
  10. log4j.properties 使用说明
  11. 万高药业IPO过会:年营收7.1亿 姚俊华持股34%
  12. Java集成华为云对象存储
  13. java实现生成验证码图片
  14. C#毕业设计——基于C#+asp.net+sqlserver的证券术语解释及翻译系统设计与实现(毕业论文+程序源码)——翻译系统
  15. boost哪些库需要编译
  16. MAC地址,IP地址和ARP协议
  17. iOS开发-单元测试
  18. 服务器上传图片显示图片404,关于使用spring文件上传遇到的服务器中的图片访问不到报404的问题...
  19. 计算机三级网络技术大题内容,全国计算机三级网络技术大题技巧资料.doc
  20. android 头像简称,Android环信显示头像及昵称的简单方法

热门文章

  1. Linux下cmake的安装
  2. 网站优化在搜索引擎上想有好排名
  3. 网站制作响应式网页设计与SEO优化
  4. pytorch 矩阵分解_使用pytorch的推荐系统矩阵分解
  5. 计算机辅助检测软件系统,智能计算机辅助检测规划系统-东南大学学报.pdf
  6. 【Oracle 优化器】自适应游标共享(Adaptive Cursor Sharing)功能
  7. 【优化系统服务提升Win7系统运行速度】
  8. JuJu团队12月2号工作汇报
  9. C# 子类强制转换为父类异常,引出的C#Dll加载机制,以及同类名同命名空间同dll程序集在C#中是否为同一个类的研究。
  10. 前端图片标签,内联框架,音视频