1.目标
输入小写数字字符串
输出大写金额字符串
类似:
2.实现代码与流程
对需要用到的字符:
string stringNum; string unitInt[] = { "整", "元" };//整数单位 string unit[] = {"仟","", "拾","佰"}; string words[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };//大写数字 string unitDecimals[] = { "角", "分" };//小数单位
小数点前后书写规则不一样
(1)小数位
首先获得小数位
输入字符串_s 转化为double
double num= atof(_s.c_str());
取整:
int intNum = static_cast(num);
小数部分:
double decimals = num - intNum;t(num);
小数部分的几种情况:
string decimals_s; if (num == 0) { return ""; } if (decimals == 0)//没有小数部分 { decimals_s = unitInt[0]; } else { int num_01 = decimals / 0.1; int num_001 = decimals / 0.01 - 10 * num_01; if (num_001 == 0) { decimals_s = words[num_01] + unitDecimals[0]; } else if (num_01 == 0) { decimals_s = words[num_001] + unitDecimals[1]; } else { decimals_s = words[num_01] + unitDecimals[0] + words[num_001] + unitDecimals[1]; } }
此处还需注意 由于二进制的存在,使得double数据的值并不严格等于输入数。
对小数部分四舍五入,保留两位小数
int temp = (int)(decimals * 100 + 0.5); decimals = temp / 100.0;
(2)整数位
如果整数位0,只输出小数位即可
string int_s; if (intNum == 0) { return decimals_s; }
限定输入金额不超过万亿
会超过int型的限制
int_s = to_string(intNum);//整数部分转化为字符型 int sLength = int_s.length(); if (sLength > 12)//限制输入金额大小,小于万亿 return "limited num"; for (int i = 0; i< sLength; i++)//对每一位进行转化 { stringNum += (words[int_s.at(i) - 48] + unit[(sLength-i)%4]); if (i == sLength - 5) stringNum += "万"; if(i == sLength -9) stringNum += "亿"; } stringNum += unitInt[1]; stringNum += decimals_s;
此时完成功能如下
有多余的零
“零仟”, “零佰”, “零拾” 或者其组合,合并为“零”
string的函数find和replace
找到指定字符串 然后替换
string& replace_all(string& str, const string& old_value, const string& new_value) { while (true) { string::size_type pos(0); if ((pos = str.find(old_value)) != string::npos) str.replace(pos, old_value.length(), new_value); else break; } return str; }
设定重复的只有一个零,如果最后一位仍为零,则合并为“元”
string cleanZero(const string& _s) { // 如果传入的是空串则继续返回空串 if ("" == _s) { return ""; } string s = _s; replace_all(s, "零仟", "零"); replace_all(s, "零佰", "零"); replace_all(s, "零拾", "零"); replace_all(s, "零零", "零"); replace_all(s, "零元", "元"); replace_all(s, "零万", "万"); replace_all(s, "亿万", "亿"); replace_all(s, "零亿", "亿"); return s; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)