用VC改编一个网上的人民币金额转换程序,可以用,谢谢指正!

用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.15
CString 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.15
CString 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.15
int 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值