用VC自己改编了一个网上的程序,希望大家指正!
/*****************************类说明:人民币大小写金额转换 开发者:吴毅 建立时间:2011-02-15 修改时间:2011-02-15*****************************/
class CRMBCapitalization {public: CString RMBAmount(double dValue); CRMBCapitalization(); virtual ~CRMBCapitalization();private: int FindArrayIndex(CStringArray *pstrArray,CString str); CString ConvertDecToUppercaseAmount(CString strCapValue,bool bAddZero); CString ConvertIntToUppercaseAmount(CString strCapValue); CStringArray DXSZ; CStringArray DXDW; CStringArray SCDW;
};
CRMBCapitalization::CRMBCapitalization(){// DXSZ = "零壹贰叁肆伍陆柒捌玖"; DXSZ.Add("零"); DXSZ.Add("壹"); DXSZ.Add("贰"); DXSZ.Add("叁"); DXSZ.Add("肆"); DXSZ.Add("伍"); DXSZ.Add("陆"); DXSZ.Add("柒"); DXSZ.Add("捌"); DXSZ.Add("玖");
// DXDW = "毫厘分角元拾佰仟萬拾佰仟亿拾佰仟萬兆拾佰仟萬亿京拾佰仟萬亿兆垓"; DXDW.Add("毫"); DXDW.Add("厘"); DXDW.Add("分"); DXDW.Add("角"); DXDW.Add("元"); DXDW.Add("拾"); DXDW.Add("佰"); DXDW.Add("仟"); DXDW.Add("萬"); DXDW.Add("拾"); DXDW.Add("佰"); DXDW.Add("仟"); DXDW.Add("亿"); DXDW.Add("拾"); DXDW.Add("佰"); DXDW.Add("仟"); DXDW.Add("萬"); DXDW.Add("兆"); DXDW.Add("拾"); DXDW.Add("佰"); DXDW.Add("仟"); DXDW.Add("萬"); DXDW.Add("亿"); DXDW.Add("京"); DXDW.Add("拾"); DXDW.Add("佰"); DXDW.Add("仟"); DXDW.Add("萬"); DXDW.Add("亿"); DXDW.Add("兆"); DXDW.Add("垓");
// SCDW = "元拾佰仟萬亿京兆垓"; SCDW.Add("元"); SCDW.Add("拾"); SCDW.Add("佰"); SCDW.Add("仟"); SCDW.Add("萬"); SCDW.Add("亿"); SCDW.Add("京"); SCDW.Add("兆"); SCDW.Add("垓");}
CRMBCapitalization::~CRMBCapitalization(){
}
/// <summary>/// 转换整数为大写金额/// 最高精度为垓,保留小数点后4位,实际精度为亿兆已经足够了,理论上精度无限制,如下所示:/// 序号:...30.29.28.27.26.25.24 23.22.21.20.19.18 17.16.15.14.13 12.11.10.9 8 7.6.5.4 . 3.2.1.0/// 单位:...垓兆亿萬仟佰拾 京亿萬仟佰拾 兆萬仟佰拾 亿仟佰拾 萬仟佰拾元 . 角分厘毫/// 数值:...1000000 000000 00000 0000 00000 . 0000/// 下面列出网上搜索到的数词单位:/// 元、十、百、千、万、亿、兆、京、垓、秭、穰、沟、涧、正、载、极/// </summary>/// <param name="strCapValue">整数值</param>/// <returns>返回大写金额</returns>/// <editor>吴毅</editor>/// <version>V1.00.02.15</version>CString CRMBCapitalization::ConvertIntToUppercaseAmount(CString strCapValue){ CString currCap = ""; //当前金额 CString capResult = ""; //结果金额 CString currentUnit = "";//当前单位 CString resultUnit = ""; //结果单位 int prevChar = -1; //上一位的值 int currChar = 0; //当前位的值 int posIndex = 4; //位置索引,从"元"开始 if (atof(strCapValue) == 0) { return ""; } CString strPosChar; for (int i = strCapValue.GetLength() - 1; i >= 0; i--) { //从整数的最右一位开始获取每一位的数字 strPosChar.Format("%c",strCapValue.GetAt(i)); currChar = atoi(strPosChar); if (posIndex > 30) { //已超出最大精度"垓"。注:可以将30改成22,使之精确到兆亿就足够了 break; } else if (currChar != 0) { //当前位为非零值,则直接转换成大写金额 currCap = DXSZ.GetAt(currChar) + DXDW.GetAt(posIndex); } else { //防止转换后出现多余的零,例如:3000020 switch (posIndex) { case 4: currCap = "元"; break; case 8: currCap = "萬"; break; case 12: currCap = "亿"; break; case 17: currCap = "兆"; break; case 23: currCap = "京"; break; case 30: currCap = "垓"; break; default: break; } if (prevChar != 0 ) { if (currCap != "") { if (currCap != "元") currCap += "零"; } else { currCap = "零"; } } } //对结果进行容错处理 if(capResult.GetLength() > 0) { resultUnit = capResult.GetAt(0); currentUnit = DXDW.GetAt(posIndex); if (FindArrayIndex(&SCDW,resultUnit) > 0) { if (FindArrayIndex(&SCDW,currentUnit) > FindArrayIndex(&SCDW,resultUnit)) { capResult = capResult.Right(1); } } } capResult = currCap + capResult; prevChar = currChar; posIndex += 1; currCap = ""; } return capResult;}
/// <summary>/// 转换小数为大写金额/// </summary>/// <param name="capValue">小数值</param>/// <param name="addZero">是否增加零位</param>/// <returns>返回大写金额</returns>//吴毅//V1.00.02.15CString CRMBCapitalization::ConvertDecToUppercaseAmount(CString strCapValue, bool bAddZero){ CString currCap = ""; CString capResult = ""; int prevChar = bAddZero ? -1 : 0; int currChar = 0; int posIndex = 3; if (atoi(strCapValue) == 0) { return ""; } CString strPosChar; for (int i = 0; i < strCapValue.GetLength(); i++) { strPosChar.Format("%c",strCapValue.GetAt(i)); currChar = atoi(strPosChar); if (currChar != 0) { currCap = DXSZ.GetAt(currChar) + DXDW.GetAt(posIndex); } else { strPosChar.Format("%s",strCapValue.Right(i)); if (atoi(strPosChar) == 0) { break; } else if (prevChar != 0) { currCap = "零"; } } capResult += currCap ; prevChar = currChar; posIndex -= 1; currCap = ""; } return capResult;}
/// <summary>/// 人民币大写金额/// </summary>/// <param name="value">人民币数字金额值</param>/// <returns>返回人民币大写金额</returns>//吴毅//V1.00.02.15CString CRMBCapitalization::RMBAmount(double dValue){ CString capResult =""; CString capValue; capValue.Format("%.4f", dValue); //格式化 int dotPos = capValue.Find("."); //小数点位置 CString strPosChar; strPosChar.Format("%s",capValue.Right(dotPos+1)); bool addInt = (atoi(strPosChar) == 0);//是否在结果中加"整" strPosChar.Format("%c",capValue.GetAt(0)); bool addMinus = (strPosChar == "-"); //是否在结果中加"负" int beginPos = addMinus ? 1 : 0; //开始位置 CString capInt = capValue.Mid(beginPos, dotPos); //整数 CString capDec = capValue.Right(dotPos); //小数 if (dotPos > 0) { capResult = ConvertIntToUppercaseAmount(capInt) + ConvertDecToUppercaseAmount(capDec, atof(capInt) != 0 ? true : false); } else { capResult = ConvertIntToUppercaseAmount(capDec); } if (addMinus) capResult = "负" + capResult; if (addInt) capResult += "整"; return capResult;}
/// <summary>/// 查找字符串数组中的某个字符的序号/// </summary>/// <param name="pstrArray">被查找的字符串数组</param>/// <param name="str">要查找的字符</param>/// <returns>序号</returns>//吴毅//V1.00.02.15int CRMBCapitalization::FindArrayIndex(CStringArray *pstrArray,CString str){ int nIndex = 0; if(pstrArray == NULL) { return nIndex; } CString strTemp; int nCount = pstrArray->GetSize(); for(int i = 0 ;i < nCount ;i++) { strTemp.Format("%s",pstrArray->GetAt(i)); if(str == strTemp) { nIndex = i; return nIndex; } }
return nIndex;}