货币数字转换成中文大写的函数

这个函数与以前其他网友提供的结构大不相同, 是一个从高位到低位的算法, 更加符合语言习惯.


//------------------------------------------------------------------------
//     货币数字转换成中文大写的函数, 整数部分最多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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
//--------------------------------------------------------------------------- #include #pragma hdrstop #include #include #include #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- AnsiString TForm1::num_str(Variant ls) { AnsiString dx_sz,dx_dw,str_int,str_dec,dx_str,fu; AnsiString a,b,b2,c,d; int num_int,num_dec,len_int,i,a_int,pp; //dx—str为返回字符串 dx_sz="零壹贰叁肆伍陆柒捌玖"; dx_dw="万仟佰拾亿仟佰拾万仟佰拾元"; //dx_dw="元拾佰仟万拾佰仟亿拾佰仟万"; //处理金额小于零情况 if (ls0)&&(ls0) str_int=dx_str.SubString (1,dx_str.AnsiPos(".")-1);} else str_int=dx_str; num_int=StrToInt(str_int*100)/100; str_int=(str_int*100)/100; //取得小数值及小数串 if ((ls>0)&&(ls<1))num_dec=ls*100; else num_dec=(ls-num_int)*100; str_dec=IntToStr(num_dec); // ShowMessage(str_dec); len_int=str_int.Length(); dx_str=""; // ShowMessage(len_int); // ShowMessage((ls-num_int)*100); //转换整数部分 // for i:=1 to len—int do for (i=1;i<=len_int;i++) { //a为小写数字字符,b为对应的大写字符 //c为对应大写单位,d为当前大写字符串的最后一个汉字 a=str_int.SubString(i,1); a_int=StrToInt(a); b=dx_sz.SubString((a_int*2+1),2);// b=copy(dx_sz,(a_int2+1),2); c=dx_dw.SubString(((14-len_int+i-1)*2-1),2); if(dx_str!="")d=dx_str.SubString((dx_str.Length()-1),2); else d=""; if ((b=="零")&&((d=="零")||(b==b2)||(c=="元")||(c=="万")||(c=="亿"))) b=""; if ((a=="0")&&(c!="元")&&(c!="万")&&(c!="亿"))c=""; if (((c=="元")||(c=="万")||(c=="亿"))&&(d=="零")&&(a=="0")) {dx_str=dx_str.SubString(1,dx_str.Length()-2); d=dx_str.SubString(dx_str.Length()-1,2); if (((c=="元")&&(d=="万"))||((c=="万")&&(d=="亿")))c=""; } dx_str=dx_str+b+c; b2=b; // ShowMessage(a+";"+b+";"+c+";"+d); } //处理金额小于1的情况 if (dx_str.Length()<=2)dx_str=""; //转换小数部分 if ((num_dec0)) { a_int=StrToInt(str_dec); //ShowMessage(a_int); b=dx_sz.SubString((a_int*2+1),2); if (num_dec==0) dx_str=dx_str+"整"; if(num_dec>0)dx_str=dx_str+"零"+b+"分"; } if(num_dec>=10) { a_int=StrToInt(str_dec.SubString(1,1)); a=dx_sz.SubString((a_int*2+1),2); a_int=StrToInt(str_dec.SubString(2,1)); b=dx_sz.SubString((a_int*2+1),2); if (a!="零")a=a+"角"; if (b!="零")b=b+"分"; else b=""; dx_str=dx_str+a+b; } if (ls==0) dx_str="零元整"; dx_str=fu+dx_str; //函数返回字符串 return dx_str; } void __fastcall TForm1::Button1Click(TObject *Sender) { Edit2->Text=num_str(Edit1->Text); ShowMessage(Edit2->Text); } //---------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h98458

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值