/*** 目标: 阿拉伯数字转中文读法(简易类型) 加强(支持正负数,支持小数,高位精确到13位,万亿单位)* * 步骤: * 1.读取字符串! * 2.防止是负数截取第一位,判断是否为负号,如果是就读的时候加上一个'负'字* 3.判断是否含有小数点,截取倒数第一个小数点的位置,防止错误输入多个错乱小数点! * 4.过滤去掉非数字; * 5.整数与小数分开* 6.整数部分,对4取余,可以拿到低位循环次数与高位个数,如果余数为0,目标则肯定是整4位,这个太好用了! * 7.小数部分很好读取,没难度* 8.会出现0多的时候叠词,采用了正则的做法,末尾带0的时候,用截取的方式!* * 要点: * 1.Match.ceil这个函数很好用向上取整 * 2.很可恶,花了一天时间,这个小需求,太扯淡了 * 3.太纠结的时候画图还是很好用的,上个推导图!* 4.代码稍显多一些,因为我把小功能都用函数封装了,还有就是注释也太详细了!** 不足之处: * 1."10 0000" 会读作壹拾万,而不是拾万,其实这个我觉得还好了! * 2. 代码稍嫌多一些!** @version 2019年8月31日 下午9:46:19* @author DuJiangWei* @Email: 38281684@qq.com*/
public class Day02_readCnNum {// 0-9数字,然后是计量单位!private static String[] strNums, strUnits, hightNums;// 负数标记,小数点标记!private static boolean negativeFlag, pointFlag;// 整数长度,小数长度,临时长度,private static int intNumLength, totalStrLength, startIndexNum, endIndexNum, pointIndexNum;// 正负读数,小数点与整数数private static String readStrNum = "", intOrPointStr = "整";// 整数字符串与小数字符串分开;private static String intStr, pointStr;// 1.初始化数组;private static String getCnNum(String temStrNum) {strNums = "零,壹,贰,叁,肆,伍,陆,柒,捌,玖".split(",");strUnits = ",拾,佰,仟".split(",");hightNums = ",万,亿,万".split(",");temStrNum = getStrNum(temStrNum);// 去掉杂乱无用符号totalStrLength = temStrNum.length();// 获取字符串总长度!negativeFlag = isNegative(temStrNum);// 是否负数pointFlag = isPoint(temStrNum);// 是否小数点intNumLength = getIntLength(temStrNum);intOrPointStr = pointFlag == true ? "点" : "整";readStrNum = negativeFlag == true ? "负" : "";return readIntNumber(temStrNum);}// 2.去掉非数字杂乱符号private static String getStrNum(String temStrNum) {return temStrNum.replaceAll("[^\\d\\.\\-]", "");}// 3.是否为负数private static boolean isNegative(String temStrNum) {boolean flag = temStrNum.substring(0, 1).contentEquals("-");startIndexNum = flag == true ? 1 : 0;return flag;}// 4.是否含有小数点private static boolean isPoint(String temStrNum) {boolean flag = temStrNum.contains(".");// 如果有小数点,那么就把小数点的位置索引给标记出来!pointIndexNum = flag == true ? temStrNum.indexOf(".") + 1 : totalStrLength;endIndexNum = flag == true ? pointIndexNum - 1 : totalStrLength;return flag;}// 5.拿到整数部分的长度,不管任何数,都拿到整数部分长度!private static int getIntLength(String temStrNum) {// 整数部分数字!intStr = temStrNum.substring(startIndexNum, endIndexNum);// 小数部分数字!pointStr = temStrNum.substring(pointIndexNum, totalStrLength);return intStr.length();}// 6.开始先读整数部分!private static String readIntNumber(String temStrNum) {StringBuilder sb = new StringBuilder();sb.append(readStrNum);// 外循环,总共需要循环多少次;int outLoopNum = (int) Math.ceil(intNumLength / 4.0);// 循环计数;int countLoopNum = 0;// 高位单位计数,就是最高的次数,因为要递减所以要独立;int unitNum = outLoopNum - 1;// 内循环次数,以及内部的数字有多少个,球余数,这个可以得出,数字的最高位从什么位置开始int inLoopNum = intNumLength % 4 == 0 ? 4 : intNumLength % 4;// 索引从整数第一个数字开始一直到结束位置,索引必须从0开始,因为字符串我已经截取过了忽略了负号int index = 0;while (true) {countLoopNum++;// 只循环inLoopNum边;j=inLoopNum-1是取出计量单位for (int i = 0, j = inLoopNum - 1; i < inLoopNum; i++) {int a = intStr.charAt(index++) - 48;// 数字!String numStrCn = strNums[a];// 数字对应的中文!String src = strUnits[j--];// 低位计量单位!if (numStrCn.contentEquals("零")) {src = "";}sb.append(numStrCn + src);}if (countLoopNum >= outLoopNum) {break;}// 如果循环一次,还没有跳出循环,就追加一个高位单位;String temString = sb.toString();String lastString = temString.substring(temString.length() - 1);String temStr = hightNums[unitNum--];if (lastString.contains("零")) {temString = temString.substring(0, temString.length() - 1);}sb.delete(0, sb.length());sb.append(temString + temStr);inLoopNum = 4;}return replaceStr(sb.toString());}// 7.正则清楚叠词,防止零百,零千这样的玩意!private static String replaceStr(String temStrNum) {temStrNum = temStrNum.replaceAll("(.)\\1+", "$1");// 去掉叠词!String src = temStrNum.substring(temStrNum.length() - 1, temStrNum.length());if (src.contentEquals("零")) {// 去掉末尾零temStrNum = temStrNum.substring(0, temStrNum.length() - 1);}temStrNum = temStrNum.replaceAll("零亿", "亿");temStrNum = temStrNum.replaceAll("零万", "万");temStrNum = temStrNum.replaceAll("亿万", "亿零");temStrNum += intOrPointStr;return readPointNum(temStrNum);}// 8.读小数部分;private static String readPointNum(String temStrNum) {String temStr = "";for (int i = 0; i < pointStr.length(); i++) {temStr += (strNums[pointStr.charAt(i) - 48]);}if (intStr.equals("0")) {if (pointFlag) {if(negativeFlag) {temStrNum = "负零点";}else {temStrNum = "零点";}} else {temStrNum = "零";}}return temStrNum += temStr;}// 9.打印部分private static void sop(String src) {System.out.println(src + "\r" + getCnNum(src));System.out.println("------------------------");}public static void main(String[] args) {String s1, s2, s3, s4, s5, s6, s7, s8;s1 = "0";s2 = "0.91234";s3 = "-0.1526";s4 = "3.1415926";s5 = "1234567891234";s6 = "-10000001,000";s7 = "100110001000.02369";s8 = "1010210010008.98007";sop(s1);sop(s2);sop(s3);sop(s4);sop(s5);sop(s6);sop(s7);sop(s8);}
}

阿拉伯数字转中文读法相关推荐

  1. 阿拉伯数字转换成中文读法的C语言程序

    记一道评论区的题目 ​ 导语 : 作为一个西电的菜鸡 , 每天只能和不超过两天的ddl较劲 , 啥也不懂 , 啥也不会. 因为家里硬盘不太够了所以把作业的代码传到博客里保存. 可以预见到的 , 遭到了 ...

  2. Lua阿拉伯数字转中文大写数字

    function numberToString(szNum)---阿拉伯数字转中文大写local szChMoney = ""local iLen = 0local iNum = ...

  3. 金额阿拉伯数字转换为中文大写

    最近的做项目中需要弄一个金额是阿拉伯数字转为中文大写的金额,自己偷懒了,就总结一下. 第一种方法相对复杂 private static readonly String cnNumber = " ...

  4. php 数字转中文函数 1转一,一个阿拉伯数字转中文数字的函数-PHP教程,PHP函数

    最近因需要,写了个"阿拉伯数字转中文数字的函数".搜索了精华区只见到一个类似的. 感觉到我的算法不错,所以贴出来共享一下 如果要用于金额的转换,对小数部分的处理要做一下修改 fun ...

  5. 制打印如下所示的n行数字金字塔_一日一技:在Python中实现阿拉伯数字加上中文数字...

    在Python 3里面,中文是可以作为变量名的,而运算符又可以重载,基于这两个特性,我们可以实现阿拉伯数字与中文数字的四则运算. 首先我们定义一个类 Num: class Num(object): d ...

  6. 大写汉字转阿拉伯数字c语言,阿拉伯数字转中文数字方法详解(C++实现)

    阿拉伯数字与中文数字没有一一对应关系,不存在直接转换的公式化算法,因此需要根据两种数字体系的特点精心构造转换算法. 中文计数有一个特点,就是"零"的使用变化多端.阿拉伯数字中数字的 ...

  7. 阿拉伯数字转中文大(小)写的函数

    <? //chinese_money.php //Changing Arab Money Num to Chinese Money Num /*====================== Fu ...

  8. 一个阿拉伯数字转中文数字的函数

    最近因需要,写了个"阿拉伯数字转中文数字的函数".搜索了精华区只见到一个类似的. 感觉到我的算法不错,所以贴出来共享一下如果要用于金额的转换,对小数部分的处理要做一下修改 < ...

  9. c语言编程阿拉伯数字转中文,阿拉伯数字转中文大(小)写的函数

    阿拉伯数字转中文大(小)写的函数  erquan 发表于 2002-7-10 17:43 PHP编程 //chinese_money.php //Changing Arab Money Num to ...

最新文章

  1. 关于行号输出的简单命令
  2. ConcurrentHashMap 内部实现分析
  3. linux设备驱动学习(一)——简单的helloworld模块
  4. 分布式系统框架Spring+Redis+SSO视频课程
  5. spark RDD iterator中sparkEnv功能 -- (视频笔记)
  6. windows 下 安装mysql 出现 “ ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password
  7. java模型给泛型_【一天一个基础系列】- java之泛型篇
  8. 【转载】此时此刻的飞秋爱好者
  9. Docker 清理命令 删除所有的镜像和容器
  10. oracle 联表求和不重复_糊涂了10年,这个Excel公式到底是怎么不重复计数的?
  11. 医疗图像配准-点云配准总结
  12. 大数据分析-实验五 pdfminer
  13. 客户端到服务器端的通信过程及原理
  14. 实体、协议、服务和服务访问点的概念
  15. Java9-17新特性
  16. 计算机网络分代核心的属性,计算机网络开发专业核心能力题库-操作
  17. 小程序自定义底部导航 custom-tab-bar
  18. 时间序列数据分析与预测之Python工具汇总
  19. ESP32运行MicroPython通过MQTT上报温湿度到中移OneNET物联网平台(附源码)
  20. 服务器永久免费文件夹加密,云服务器文件夹加密

热门文章

  1. uniapp map地图
  2. element-ui表格的头部border有空隙的解决办法
  3. 2018年中国投入产出表
  4. 【chrome】模拟微信浏览器
  5. 禁止IE弹出网页和屏蔽网页原理
  6. crc校验查表法原理
  7. java游戏项目分享,适合的零基础java项目,提高你的代码能力
  8. 生活哲理故事系列之三(转贴)
  9. Maven插件之wagon-maven-plugin,远程自动化部署
  10. python图像特征提取进行分割_python实现图片处理和特征提取详解