现有一数字字符串,有可能有小数点,小数点后最多为两位.
数字可能情况: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"
.............
数字可能情况: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"
.............
解决方案 »
- 怎么理解这个程序的WM_CREATE中的for那一块程序,为什么不放入WM_PAINT中呢
- P2SP客户端与服务器开发
- 求RichEdit实现复制,粘贴
- 关于DLL静态链接的概念性问题
- 我在ACTIVEX中使用了一個對話框,在對話框上加入richeditctrl,如果在ie中使用,就不顯示,不知道爲什麽?
- CListCtrl怎么出现表格状的边框?
- OpenGL的程序为什么运行一段时间后出错
- wds315()进来,谢谢你的帮助3
- 如何在已经创建好的SDI程序中加入一个登录框,它的要求是:
- 如何得到硬盘出厂时唯一的“硬盘ID号”,而不是硬盘每个分区后的SerialNumber和CPU的ID号
- 为什么在类向导里丢了类
- CWindowDC 的一个问题
btw:1--d0,2--d1,....,9--d9不知道这是怎么算出来的,呵呵,知道你是笔误,说着玩的
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);}
int x = Str.Getlength然后找出有没有小数点
int Pos = Str.Find(" . ")
if( 有小数点 )
首位大小 = x - Pos
else 首位大小 = x
(的确很麻烦 :) )再确定首位数字大小:
atoi(str[x])
做个遍历 取得所有数字大小和位数
在"0"处做个标记 读的时候跳过用switch取得某位数数字相应的读法
如 length = 4(无小数点)读 d12
不过超过万了要注意 如 length = 7(无小数点)百万 读 d11
循环一下就可以了
而且,我和我同学读钱习惯还不太一样,即规则不一样,他说对的,我说错。所以,楼主请把各个规则罗列一下.
其实好多习惯是形成的,不是统一的,就像各地的升级都有不同的规矩一样。所以,我都不知道自己写的是不是正确的。
{
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);