貨幣數字轉換成中文大寫的函數

這個函數與以前其他網友提供的結構大不相同, 是一個從高位到低位的算法, 更加符合語言習慣.


//------------------------------------------------------------------------
//     貨幣數字轉換成中文大寫的函數, 整數部分最多16位,也就是"千兆"
//------------------------------------------------------------------------
AnsiString __fastcall TFineInvoice::MoneyToChineseChar(Currency MoneyValue)
{
    static char *ChinaNumberChar[10] = {"零","壹","貳","叄","肆"
                                       ,"伍","陸","柒","捌","玖"};
    static char *ChinaUnitChar[4] = {"兆","億","萬","元"};
    static char *ChinaBitChar[3] = {"仟","佰","拾"};

    AnsiString expDecimal = "00";
    AnsiString expInteger = MoneyValue;
    AnsiString expChinese = "";

    AnsiString expNumber, expMoney;
    int intBit;

    //    拆分整數與小數
    if (expInteger.Pos("."))
    {
        expDecimal = expInteger.SubString(expInteger.Pos(".")+1,2) + "00";
        expInteger.SetLength(expInteger.Pos(".")-1);
        expDecimal.SetLength(2);
    }

    //    處理負數
    if (expInteger.SubString(1,1) == "-")
    {
        expChinese += "(負數)";
        expInteger.Delete(1,1);
    }

    //  處理整數部分
    for (int i=16-expInteger.Length(); i<16; i++)
    {
        expNumber = "";
        expMoney = "";


        intBit = expInteger.SubString(1,1).ToIntDef(0);
        if (intBit || (expMoney.Length() && i%4 < 3))
            expNumber = ChinaNumberChar[intBit];

        if (i%4 == 3)
            expMoney = ChinaUnitChar[i/4];
        else if (intBit)
            expMoney = ChinaBitChar[i%4];

        if (intBit == 0 && i%4 == 3
                && expChinese.SubString(expChinese.Length()-1,2) == "零")
            expChinese.SetLength(expChinese.Length()-2);
        expChinese += expNumber + expMoney;
        expInteger.Delete(1,1);
    }

    //  處理小數部分
    if (expDecimal.ToIntDef(0))
    {
        intBit = expDecimal.SubString(1,1).ToIntDef(0);
        if (intBit)
        {
            expChinese += ChinaNumberChar[intBit];
            expChinese += "角";
        }

        intBit = expDecimal.SubString(2,1).ToIntDef(0);
        if (intBit)
        {
            if (expChinese.SubString(expChinese.Length()-1,2) == "元")
                expChinese += "零";
            expChinese += ChinaNumberChar[intBit];
            expChinese += "分";
        }
        else expChinese += "整";    //  這個"整"有人說不必要!
    }
    else expChinese += "整";

    return expChinese;
}
//------------------------------------------------------------------------
以下這段程序小的正在(Borland C++)使用中,沒有問題。

AnsiString __fastcall TForm_Vip::DX(float Xx)//金額小寫轉大寫
{
  AnsiString ShuZi="零壹貳叄肆伍陸柒捌玖";
  AnsiString DanWei="分  角      元  拾  百  千  萬拾萬百萬千萬  億十億百億";
  AnsiString XxStr=FormatFloat("0.00",Xx),DxStr="";

  for(int i=XxStr.Length();i>=1;i--)
  {
    if(XxStr.SubString(i,1)!=".")
      DxStr=ShuZi.SubString(StrToInt(XxStr.SubString(i,1))*2+1,2)
           +Trim(DanWei.SubString((XxStr.Length()-i)*4,4))+DxStr;
  }
  return DxStr;
}

發佈了20 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章