
我在一次采访中遇到一个有趣的小算术问题: 请求将阿拉伯数字转换为汉字(包括单位).
尽管当时已实现,但代码有些混乱. 所以回家后,我重新整理了.
此算法有几个小注意事项:
1,汉字占用两个字节货币金额大小写转换,因此,如果使用C语言,则需要以char数组的形式保存单个汉字.
2. 如果数字中出现连续的零,则需要用一个零代替.
3. 十亿,数万和前面的汉字不能为零(由读取方法确定).
4. 双精度值可以分为整数部分和小数部分. 小数部分相对简单,整数部分需要根据数字所在的位数匹配相应的单位.
具体方法是: 设置一个单位映射字符串表g_strUnit,它可以看作是一个简单的HashTable. 然后从头开始读取每个整数字符串
字符,如果此字符在整数字符串中的位置为i,则此字符后面的单位为g_strUnit [length-1-i].
代码如下
/ ************************************************** ****************************************
ProjectCode: 帐户
文件名:
作者: 拿铁
说明: 将阿拉伯数字转换为中文字符串
FunctionList:
--------------------------------------------------- ---------------------------------
历史记录:
DateAuthorModification
20140703Lattecreatedfile.
*********************************************** ************************************ /
#include“ stdafx.h”
#include
#include
usingnamespacestd;
#defineMAX100
stringg_strDigit [] = {“零”,“一个”,“两个”,“三个”,“旺”,“吴”,“鲁”,“柒”,“捌”货币金额大小写转换,“玖”}; <
stringg_strUnit [] = {“圆形”,“拾取”,“ bai”,“ qian”,“ wan”,“ pickup”,“ bai”,“ qian”,“ billion”,
“代答”,“白”,“千”,“万”,“代答”,“白”}}
stringg_strUnit2 [] = {“角”,“分”};
/ ************************************************** ****************************************
FuncName: ReplaceSubStr

创建日期: 2014-07-03
作者: 拿铁
说明: 将与strSub匹配的源字符串strOrig的第一个子字符串部分替换为strReplace
输入:
string&strOrig,
stringstrSub,
stringstrReplace
输出:
string&strOrig
返回:
int
警告: 如果返回值为-1,则表示替换失败或找不到替换项
*********************************************** ************************************ /
intReplaceSubStr(字符串和strOrig,stringstrSub,stringstrReplace)
{
intpos =(int)strOrig.find(strSub);
intlength =(int)strSub.length();
如果(pos> = 0)
{
strOrig.replace(位置,长度,strReplace);
return0;
}
return-1;
}
/ ************************************************** ****************************************
FuncName: NumToChineseStr
创建日期: 2014-07-03
作者: 拿铁
说明:
将双值转换为中文字符串
输入:
doublemoney
![]()
输出:
返回:
字符串
警告:
*********************************************** ************************************ /
stringNumToChineseStr(doublemoney)
{
inti = 0;
intret = 0;
intlength = 0;
char * p = NULL;
char * pcDecimal = NULL; //保存小数部分字符
charczNumber [MAX] = {0}; //保存全部字符
stringstrResult;
cout <<“ =================================== << << endl;
cout << money << endl;
//确定是否为小数
如果(钱<0)
{
strResult =“不支持读取负数”;
returnstrResult;
}
///使用sprintf_s常规转换将数字转换为数字字符串
sprintf_s(czNumber,MAX,“%. 15lg”,money);
printf(“ [[No.0]%s \ n”,czNumber);
//如果数字太大或太小,因为已经转换为科学计数法,它将包含e字符
p = strchr(czNumber,'e');
如果(NULL!= p)
{
strResult =“不支持读数太大或太小的数字”;
returnstrResult;
}

p = strchr(czNumber,'. ');
如果(NULL!= p)
{
p [0] = 0;
pcDecimal = p +1;
}
length =(int)strlen(czNumber);
for(i = 0; i { if('0'== czNumber [i] && 0!=((length-1-i)%4)) { strResult + = g_strDigit [czNumber [i]-'0']; } 其他 { strResult + = g_strDigit [czNumber [i]-'0'] + g_strUnit [length-1-i]; } } cout <<“ [[No.1]直接用汉字替换数字: \ n” << strResult << endl; ///将strResult中的所有“零零”子字符串替换为“零” 同时(1) { ret = ReplaceSubStr(strResult,“零零”,“零”); 如果(ret <0) { 休息; } } cout <<“ [[No.2]将所有零替换为零: \ n” << strResult << endl; ReplaceSubStr(strResult,“零亿”,“十亿”); ReplaceSubStr(strResult,“零”,“一万”); if(strResult!=“零圆”)//如果整数部分全为0,请不要删除元单元前面的零 { ReplaceSubStr(strResult,“零圆”,“圆”); } cout <<“ [[No.3]删除零个,零个和零个圆之前的零: \ n” << strResult << endl; //十进制精确到两位数,即精确到单位分钟 如果(NULL!= pcDecimal) { //如果小数部分具有数字值且整数部分为0,则删除字符串中的零元素 if(strResult ==“零圆”) { strResult.clear(); } i = 0; 同时(1) { 如果(0 == pcDecimal [i] || i> = 2) 休息; strResult + = g_strDigit [pcDecimal [i]-'0'] + g_strUnit2 [i]; i ++; } } cout <<“ [[No.4]十进制精确到两位数,精确到单位: \ n” << strResult << endl; returnstrResult; } intmain(无效) { // cout <<“结果: ” << NumToChineseStr(0.00)<< endl; // cout <<“结果: ” << NumToChineseStr(-345.67)<< endl; // cout <<“结果: ” << NumToChineseStr(1000.0)<< endl; cout <<“结果: ” << NumToChineseStr(130040600090.012)<< endl; return0; } 结果
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-197884-1.html
说得好