将数字字符串转化作大写汉字金额

将数字字符串转化为大写汉字金额
//============================================================================  
// 作者   : 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;
}

代码输出为:

壹億零玖拾贰萬零贰拾圆整
壹億零玖拾贰萬零贰拾圆壹角贰分叁厘
壹億零玖拾贰萬零贰拾圆壹角贰分叁厘肆毫伍

本代码还发布在点击打开链接。代码不难,但也折腾了几个小时,与大家分享,欢迎指错!