将数字转为中⽂⾦额的⼤写⽅式(C++版)
1./**
2.*程序⽬的:
3.*从命令⾏接收⼀个数,并将其转化为中⽂⾦额的⼤写⽅式(C++版)
4.*例如123.45-->壹佰贰拾叁元肆⾓伍分
5.*@authorLovinChan
6.*
7.*前⼀段时间做了个Java版的。突然有天⼼⾎来潮做个C++版本的,实现的功能
8.*跟Java版本的没什么区别,不过由于我对C++的了解还不是很多,还是学习阶段,
9.*写出来的东西还有很多问题和不合规范的地⽅,希望各位批评指出来。
10.*
11.*程序的注释我尽量写得详细⼀点,如果觉得这个程序哪⾥有问题或者是哪⾥有改进的
12.*地⽅欢迎随时跟我交流。
13.*
14.*我附上了编译以后的.exe⽂件跟.bat⽂件,还有项⽬源码,供⼤家测评。
15.*
16.*⼯具:MicrosoftVisualStudio2005
17.*编译环境:MicrosoftVisualStudio2005
18.*
19.*我的msn:@
20.*QQ:372133556(注上为什么加我就可以了)
21.*我的blog:/egg_chen
22.*欢迎交流
23.*/
24.#include
25.#include
26.
amespacestd;
28.
29.//表⽰整数部分的标志
ntINT_ONLY=1;
31.//表⽰⼩数部分的标志
ntSMALL_ONLY=2;
33.
34./**
35.*从命令⾏接收⼀个数,在其中调⽤checkNum()⽅法对其进⾏
36.*验证,并返回相应的值
37.*@return如果输⼊合法,返回输⼊的这个数
38.*/
getNum(){
s;
<<"请输⼊⼀个数字(精确到⼩数点后两位):"<
42.//从命令⾏输⼊这个浮点数
>>s;
44.//清除输⼊流状态标志
();
s;
47.}
48.
49./**
50.*判断⽤户输⼊的数据是否合法,⽤户只能输⼊⼤于零的数字,不能输⼊其它字符
51.*@paramsstring
52.*@return如果⽤户输⼊数据合法,返回true,否则返回fal
53.*/
eckNum(strings){
55.//atof(s.c_str())⽅法的功能是将字符串s转换成⼀个双精度数值并返回结果
d=atof(s.c_str());
57.//只有当⽤户输⼊⼀个⼤于0的数时,才会返回true
(d>0){
true;
60.}
fal;
62.}
63.
64./**
65.*对传⼊的数进⾏四舍五⼊操作
66.*@paramsstring,从命令⾏输⼊的那个数
67.*@return四舍五⼊后的新值
68.*/
roundString(strings){
70.//将这个数转换成double类型,并对其进⾏四舍五⼊操作
71.//先转换这个数的整数部分
72.//atof(s.c_str())⽅法的功能是将字符串s转换成⼀个双精度数值并返回结果
73.//c_str()函数返回⼀个指向正规C字符串的指针,内容与本字符串相同
d=atof(s.c_str());
75.//将这个数进⾏四舍五⼊,保留到⼩数点后两位
76.//再将这个数转换成字符串,等待转换
,sign;
78.//注意:当这个数转换成字符串以后不会显⽰⼩数点,并且会以四舍五⼊的形式只保留⼩数点后两位
79.s=fcvt(d,2,&dec,&sign);
80.//规定数值的最⼤长度只能是15位(到万亿位)
(()>15){
<<"输⼊数据过⼤!(整数部分最多13位!)"<
"";
84.}
s;
86.}
87.
88./**
89.*把传⼊的数转换为中⽂⾦额⼤写形式
90.*@paramflagint标志位,1表⽰转换整数部分,0表⽰转换⼩数部分
91.*@paramsstring要转换的字符串
92.*@return转换好的带单位的中⽂⾦额⼤写形式
93.*/
formatChine(intflag,strings){
ngth=();
96.//货币⼤写形式
bigLetter[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
98.//货币单位
unit[]={"元","拾","佰","仟","万",
100.//拾万位到仟万位
101."拾","佰","仟",
102.//亿位到万亿位
103."亿","拾","佰","仟","万"};
small[]={"分","⾓"};
105.//⽤来存放转换后的新字符串
newS="";
107.//逐位替换为中⽂⼤写形式
(inti=0;i
(flag==INT_ONLY){
110.//转换整数部分为中⽂⼤写形式(带单位)
=newS+bigLetter[(i)-48]+unit[sLength-i-1];
112.}elif(flag==SMALL_ONLY){
113.//转换⼩数部分(带单位)
=newS+bigLetter[(i)-48]+small[sLength-i-1];
115.}
116.}
newS;
118.}
119.
120./**
121.*把⽤户输⼊的数以⼩数点为界分割开来,并调⽤numFormat()⽅法
122.*进⾏相应的中⽂⾦额⼤写形式的转换
123.*注:传⼊的这个数应该是经过roundString()⽅法进⾏了四舍五⼊操作的
124.*@paramsstring
125.*@return转换好的中⽂⾦额⼤写形式的字符串
126.*/
splitNum(strings){
128.//如果传⼊的是空串则继续返回空串
(""==s){
"";
131.}
132.//截取输⼊数字的整数部分
intOnly=(0,()-2);
intPart=formatChine(1,intOnly);
135.
136.//截取这个数的⼩数部分
smallOnly=(()-2,());
smallPart=formatChine(2,smallOnly);
139.
140.//把转换好了的整数部分和⼩数部分重新拼凑⼀个新的字符串
newS=intPart+smallPart;
142.
newS;
144.}
145.
146./**
147.*使⽤给定的replacement替换此字符串所有匹配给定的regex的⼦字符串。
148.*@paramsrc-待操作的源字符串
149.*@paramregex-⽤来匹配此字符串的正则表达式
150.*@paramreplacement-⽤来替换每个匹配项的字符串
151.*@return替换后的字符串
152.*/
replaceAll(stringsrc,stringregex,stringreplacement){
gth=();
((regex)<()){
156.//替换src字符串中从第⼀个匹配regex的字符串索引开始的length个字符为replacement字符串
e((regex),length,replacement);
158.}
src;
160.}
161.
162./**
163.*把已经转换好的中⽂⾦额⼤写形式加以改进,清理这个字
164.*符串⾥⾯多余的零,让这个字符串变得更加可观
165.*注:传⼊的这个数应该是经过splitNum()⽅法进⾏处理,这个字
166.*符串应该已经是⽤中⽂⾦额⼤写形式表⽰的
167.*@paramsstring已经转换好的字符串
168.*@return改进后的字符串
169.*/
cleanZero(strings){
171.//如果传⼊的是空串则继续返回空串
(""==s){
"";
174.}
175.//字符串中存在多个'零'在⼀起的时候只读出⼀个'零',并省略多余的单位
176./*由于本⼈对算法的研究太菜了,只能⽤4个正则表达式去转换了,各位⼤虾别介意哈...*/
regex1[]={"零仟","零佰","零拾"};
regex2[]={"零亿","零万","零元"};
regex3[]={"亿","万","元"};
regex4[]={"零⾓","零分"};
181.
182.//第⼀轮转换把"零仟",零佰","零拾"等字符串替换成⼀个"零"
(inti=0;i<3;i++){
184.s=replaceAll(s,regex1[i],"零");
185.}
186.//第⼆轮转换考虑"零亿","零万","零元"等情况
187.//"亿","万","元"这些单位有些情况是不能省的,需要保留下来
(inti=0;i<3;i++){
189.//当第⼀轮转换过后有可能有很多个零叠在⼀起
190.//要把很多个重复的零变成⼀个零
191.s=replaceAll(s,"零零零","零");
192.s=replaceAll(s,"零零","零");
193.s=replaceAll(s,regex2[i],regex3[i]);
194.}
195.//第三轮转换把"零⾓","零分"字符串省略
(inti=0;i<2;i++){
197.s=replaceAll(s,regex4[i],"");
198.}
199.//当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留⼀个"亿"
200.s=replaceAll(s,"亿万","亿");
s;
202.}
203.
n(){
<<"n------------将数字转换成中⽂⾦额的⼤写形式(C++)------------n"<
s=getNum();
(checkNum(s)){
208.s=roundString(s);
209.s=splitNum(s);
210.s=cleanZero(s);
<<"转换成中⽂后为:"<
212.}el{
<<"⾮法输⼊,程序即将退出"<
214.}
<<"n--------------------------------------------------------------"<
216.}
本文发布于:2022-12-02 17:10:39,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/39133.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |