现有一数字字符串,有可能有小数点,小数点后最多为两位.
数字可能情况:950025 或12.80或3920632000等等形式
现在要求将他们转换成钱的习惯读法,其中:
1--d0,2--d1,....,9--d9
个位为元--d16,十--d10,百--d11,千--d12,万--d13,亿--d14,兆--d15
小数第一位读d17,小数第一位读d18.注意多个连着的0的读法和单位的结合.
举例:
1/如数字字符串:"1560023.26"将变为"d1,d11,d5,d10,d6,d13,d0,d2,d10,d3,d16,d2,d16,d6,d18"
2/如数字字符串:"85623"将变
为"d8,d13,d5,d12,d6,d11,d2,d10,d3,d16"
3/如数字字符串:"600"将变
为"d6,d11,d16"
4/如数字字符串:"609"将变
为"d6,d11,d0,d9,d16"
.............

解决方案 »

  1.   

    这种具体的功能你还是自己作为好,又没什么难度,只要考虑周全堆积相当长的代码量就可以了.不过是解析字符串而已
    btw:1--d0,2--d1,....,9--d9不知道这是怎么算出来的,呵呵,知道你是笔误,说着玩的
      

  2.   

    #include "math.h"
    void CNtDlg::OnButton12() 
    {
    double dwTotal=3920634300.26;
    CString strTotal;
    CString tmp;
    int pos=0;

    for(int i=9;i>=-2;i--)
    {
    DWORD div=pow(10,i);
    pos=dwTotal/div; double pw=div*pos;
    if(dwTotal>=pw)
    {
    dwTotal-=(pw);
            }
    else
    {
    continue;
    }

    switch(i)
    {
    case 9:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d十",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 8:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d亿",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 7:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d千",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 6:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d百",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 5:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d十",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 4:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d万",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 3:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d千",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 2:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d百",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 1:
    {
    if(0==pos)
    {
    tmp.Format("零");
    }
    else
    tmp.Format("%d十",pos); strTotal+=tmp;
    tmp.Empty();
    }
    break;
    case 0:
    {
    if(0==pos)
    {
    tmp.Format("零点");
    }
    else
    tmp.Format("%d点",pos);
    strTotal+=tmp;
    tmp.Empty();
    }
    break;
    default:
    break;
    }
    if(dwTotal<1)
    {
    dwTotal*=100;
    tmp.Format("点%d元",(int)dwTotal);
    strTotal+=tmp;
    tmp.Empty();
    break;
    }
    }strTotal.Replace("零零","零");
    MessageBox(strTotal);}
      

  3.   

    首先用Str.Getlength求得这个字符串的长度:
    int x = Str.Getlength然后找出有没有小数点
    int Pos = Str.Find(" . ")
    if( 有小数点 )
      首位大小 = x - Pos
    else 首位大小 = x
    (的确很麻烦 :) )再确定首位数字大小:
    atoi(str[x])
    做个遍历 取得所有数字大小和位数
    在"0"处做个标记 读的时候跳过用switch取得某位数数字相应的读法
    如 length = 4(无小数点)读 d12
       不过超过万了要注意 如 length = 7(无小数点)百万 读 d11
    循环一下就可以了
      

  4.   

    不要认为如此简单,由于习惯问题,bug好多的,测试一下就知道了,尤其是多个0,和0占重要位置的时候。  
    而且,我和我同学读钱习惯还不太一样,即规则不一样,他说对的,我说错。所以,楼主请把各个规则罗列一下.
    其实好多习惯是形成的,不是统一的,就像各地的升级都有不同的规矩一样。所以,我都不知道自己写的是不是正确的。
      

  5.   

    CString CVDlg::ntostr(unsigned long n, int flag, int& flag1)
    {
    int m = n/10;
    flag ++;
    CString str = "";
    if(m > 0) str = ntostr(m,flag,flag1);
    int i = n%10;
    int j = flag%4; char ch[5];
    memset(ch,0,5);
    if(i > 0)
    {
    if(flag1 == 2)
    {
    str += "零";
    }
    if(flag1 == 0 && j != 3 && str.GetLength() > 0)
    {
    str += "零";
    }
    if(flag1 == 3)
    {
    str += "零";
    }
    itoa(i,ch,10);
    str += ch;
    flag1 = 1;
    switch(j)
    {
    case 0: break;
    //case 0: str += "元";break;
    case 1: str += "十";break;
    case 2: str += "百";break;
    case 3: str += "千";break;
    } }
    else
    {
    if(flag1 == 1) flag1 = 2;
    }
    if( j == 0 )
    {
    if(flag1 == 0) flag1 = 3;
    else
    {

    int k = flag/4;
    switch(k)
    {
    //case 0 : break;
    case 0: str += "元";break;
    case 1 : str += "万";break;
    case 2 : str += "亿";break;
    case 3 : str += "兆";break;
    }
    flag1 = 0;
    }
    }
    TRACE(str + "\n");
    return str;}
    调用方法:
             unsigned long n = 11;
    int flag = -1;
    int flag1 = 0;

    //str = ntostr(n,flag,flag1);
    str = GetVoiceFiles(n,flag,flag1);
    MessageBox(str);