用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;
}