【第一篇】Qt学习与使用---将数字转换成中文大写的形式
2018-03-01 11:30
260 查看
1.期望实现:
数字 ===> 中文大写如:
123.0456 ===> 壹贰叁点零肆伍陆
12003045.678 ===> 壹仟贰佰零万叁仟零肆拾伍点陆捌
32012003045.678 ===> 叁佰贰拾亿壹仟贰佰零万叁仟零肆拾伍点陆捌
2.基本思路:
2.1 将数字分成四部分 即: 符号+整数+“点”+小数2.2 查表拼接---将每一位的数字对应到汉字,将汉字拼接上去。
整数部分有数值单位,小数部分不需要数值单位。
数字表
QStringList numerical_value = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
单位表
(这个表成员的多少 决定你能装换的最大数值范围)(这里给出的可以让你最大转换 1万亿之下的所有数字(小于1万亿,大于负1万亿))
QStringList numerical_unit = {"","拾","佰","仟","万","拾", "佰", "仟", "亿", "拾", "佰", "仟"};
3.难点:
实现查表,再拼接,这样做很简单。但是这样做的结果就是如此:32012003045.678 ===> 叁佰贰拾零亿壹仟贰佰零拾零万叁仟零佰肆拾伍点陆捌
猛地一看,你可能觉得没什么,但这样的写法是不符合我们中国人读数字的习惯的。
3.1当出现多个连0的情况的时候,需要我们根据情况省略和跳过拼接。
3.2在省略零的时候,要注意分段省略,按照中国人的习惯,4位为一段。我按照 “”,“万”,“亿”将整数部分分成三段(因为我的数字范围是1万亿以下)。
如果不分段,可能会导致,“万”和“亿”的丢失。
4.代码
const QString number_Transfer_BigChinese(const double &Fnumber) { if(qAbs(Fnumber)<0.01) //保留2位小数时,近似看作零的情况 return "零"; //判断正负号 QString numberSign;//存储符号 if(Fnumber<0) numberSign = "(负数)"; //将数据的绝对值 转换成字符串,如-58 转成 “58.00” QString number = QString::number(qAbs(Fnumber),'f',2);//qAbs绝对值 ,保留两位小数 QString Left_of_Point;//整数部分 int length =number.length()-3;//整数部分的长度,(精确度为2,去除小数和小数点) if(length>12) { //qDebug()<<"输入的数值超过范围!" return "输入的数值超过范围!"; } QStringList numerical_unit = {"","拾","佰","仟","万","拾", "佰", "仟", "亿", "拾", "佰", "仟"}; QStringList numerical_value = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; //数数整数低位多少个连零 int counter_0=0; for(int i =length-1;i>=0;i--) { if((number[i].toLatin1()-'0' )==0) //从个位开始,向高位走 counter_0++; else break; } if(length==1 && counter_0==1) //0.x counter_0=0; //不进行过滤 //1400 0.2 for(int i=0,flag=1;i<length-counter_0;i++) { //5 8 1 2 3 //伍 拾 捌 壹佰 贰拾 叁 if((number[i].toLatin1()-'0')==0) { if((flag!=0 && (length-1-i)%4 != 0) || length ==1) //flag!=0 表示前一个数值 不为0 Left_of_Point+="零"; //后面不用添加 单位 if((length-1-i)%4 == 0) //如果0处于分段处,后面需添加单位 Left_of_Point+=numerical_unit[length-1-i];//添加数值单位 flag =0; //标记 } else { flag =1; Left_of_Point+=numerical_value[number[i].toLatin1()-'0']; //'5'-'0'==5 Left_of_Point+=numerical_unit[length-1-i];//添加数值单位 } } //QString Right_of_Point;//小数点右侧,小数部分(保留两位) xxxx.yy int totalLength = number.length(); if(number[totalLength-2]=='0'&&number[totalLength-1]=='0') { QString Bigcn=numberSign+Left_of_Point+"吨"; return Bigcn; } else if(number[totalLength-2]!='0'&&number[totalLength-1]=='0') { QString Bigcn=numberSign+Left_of_Point+"点"+numerical_value[number[totalLength-2].toLatin1()-'0']+"吨"; return Bigcn; } else { QString Bigcn=numberSign+Left_of_Point+"点"+numerical_value[number[totalLength-2].toLatin1()-'0']+numerical_value[number[totalLength-1].toLatin1()-'0']+"吨"; return Bigcn; } return "异常情况"; }
5.欢迎大家留言交流(转载请标明出处噢!(*  ̄3)(ε ̄ *))
相关文章推荐
- 将一串数字转化为中文字符串,使用 C# 将数字转换成大写人民币 (例如:用户输入2300,系统就会显示两千三百元 )
- 使用C#实现阿拉伯数字到大写中文的转换
- 使用C#实现阿拉伯数字到大写中文的转换
- 使用C#实现阿拉伯数字到大写中文的转换-第二种方法
- 使用 JAVA 将数字金额转换成大写中文金额
- 使用C#实现阿拉伯数字到大写中文的转换
- 使用C#实现阿拉伯数字到大写中文的转换-第二种方法
- java代码:金融系统中,将数字转换成中文金额大写形式
- C#使用正则表达式将数字转换为大写中文
- 自己写的一个转换数字为中文大写形式的工具类
- 将阿拉伯数字转换成中文大写的好算法
- .Net/C#/VB/T-SQL/Java/Script 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- 写了个数字转换为中文大写的软件
- 一个将阿拉伯数字转换成中文大写的最简单算法
- Excel日期转换为大写中文数字
- 一个水晶报表的数字转换成中文大写的公式!
- 将天文数字转换成中文大写(.Net/C#/VB/T-SQL/Java 实现)
- 将数字金额转换为中文大写金额(在网上找的)
- Java中实现数字金额到中文大写字符的转换!!
- PHP中实现数字金额到中文大写字符的转换