将数字字符串转化作大写汉字金额
将数字字符串转化为大写汉字金额
//============================================================================ // 作者 : quarryman // 邮箱 : quarrying@qq.com // 链接 : http://blog.csdn.net/quarryman // 描述 : 将数字字符串转化为大写汉字金额 // 日期 : 2012年9月2日 //============================================================================ #include <string> #include <locale> #include <iostream> using namespace std; wstring a[]={L"零",L"壹",L"贰",L"叁",L"肆",L"伍",L"陆",L"柒",L"捌",L"玖"}; wstring c[]={L"圆",L"拾",L"佰",L"仟",L"萬",L"億"}; wstring e[]={L"角",L"分",L"厘",L"毫"}; void reverse(wstring& s) { wchar_t c; int len=s.length(); for(int i=0,j=len-1;i<j;++i,--j) { c=s[i]; s[i]=s[j]; s[j]=c; } } wstring zhuanhuan2(wstring input) { wstring output; int length=input.length(); //四位数字的汉字化 if(length<=4) { for(int i=0;i<length;++i) { wstring s=a[input[i]-'0']; //个位不加单位 //个位值为零不计 //位值为零不加单位 //连续的零合并为一个零 if(i!=0 && s!=L"零") { output+=c[i%4]+s; } else { if(i==0) { if(s!=L"零") { output+=s; } } else if(s==L"零") { if(output[output.length()-1] !=L'零') { output+=s; } } } } } else { wstring str1=input.substr(0,4); wstring out1=zhuanhuan2(str1); wstring str2=input.substr(4,length); wstring out2=zhuanhuan2(str2); output+=out1+L"萬"+out2; } return output; } wstring zhuanhuan_zhengshu(wstring input) { wstring output; wstring suffix; wstring temp; int length=input.length(); //将数字串逆序 reverse(input); //按八位分划 for(int i=0;i<=length/8;++i) { if(8*i+7<length) { temp=input.substr(8*i,8*i+7); } else { temp=input.substr(8*i); } //八位数字的汉字化 wstring str=zhuanhuan2(temp); suffix+=L"億"; output+=str; if(i!=length/8) { output+=suffix; } } reverse(output); return output; } wstring zhuanhuan_xiaoshu(wstring input) { wstring output; int length=input.length(); for(int i=0;i<length;++i) { if(i<4) { output+=a[input[i]-'0']+e[i]; } else { output+=a[input[i]-'0']; } } return output; } wstring zhuanhuan(wstring input) { wstring output; int pos=input.find(L"."); if(pos!=wstring::npos) { wstring int_part=input.substr(0,pos); wstring int_out=zhuanhuan_zhengshu(int_part); wstring fra_part=input.substr(pos+1); wstring fra_out=zhuanhuan_xiaoshu(fra_part); output=int_out+L"圆"+fra_out; } else { output=zhuanhuan_zhengshu(input); output+=L"圆整"; } return output; } int main() { locale loc( "chs" ); wcout.imbue( loc ); wcout<< zhuanhuan(L"100920020")<<endl; wcout<< zhuanhuan(L"100920020.123")<<endl; wcout<< zhuanhuan(L"100920020.12345")<<endl; return 0; }
代码输出为:
壹億零玖拾贰萬零贰拾圆整
壹億零玖拾贰萬零贰拾圆壹角贰分叁厘
壹億零玖拾贰萬零贰拾圆壹角贰分叁厘肆毫伍
本代码还发布在点击打开链接。代码不难,但也折腾了几个小时,与大家分享,欢迎指错!