100分送,各位大哥,急,求数字向中文转换代码!如输入:103700.728 输出:壹拾万零叁千柒佰点柒贰捌

thd111 2002-11-13 08:01:03
急呀
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2003-02-28
  • 打赏
  • 举报
回复
以下是最新版的程序:

Function GetChinaNum(OrgNum As Double, Optional IsMoney As Integer, _
Optional dotNum As Integer) As String
'参数OrgNum: 为数字
'参数IsMoney: 为是不是返回人民币大写(1返回)
'参数dotNum: 为设置小数点后面的位数,默认为0,最大为8位
Dim NumDigit(1) As String, NumChar(1) As String
Dim AfterDotNum As String, NewNum As Double, StrNum As String
Dim RepPostNum As Variant, i As Integer, RepNum(1)

NumDigit(0) = "0千0百0十0亿0千0百0十0万0千0百0十0"
NumDigit(1) = "0仟0佰0拾0亿0仟0佰0拾0万0仟0佰0拾0"
NumChar(0) = "零一二三四五六七八九十"
NumChar(1) = "零壹贰叁肆伍陆柒捌玖拾"
RepNum(0) = Array("零十", "零百", "零千", &quo
t;零零", "零零")
RepNum(1) = Array("零拾", "零佰", "零仟", &quo
t;零零", "零零")
RepPostNum = Array("零万", "零亿")

If dotNum <> 0 Then
If OrgNum >= 1 Then
NewNum = Left(Trim(OrgNum), InStr(Trim(OrgNum), ".") - 1)
End If
Else
NewNum = Int(OrgNum)
End If
StrNum = Format(NewNum, Right(NumDigit(IsMoney), _
2 * Len(Trim(NewNum)) - 1))
For i = 0 To 10
StrNum = Replace(StrNum, i, Mid(NumChar(IsMoney), i + 1, 1))
Next i
For i = 0 To 4
StrNum = Replace(StrNum, RepNum(IsMoney)(i), _
Left(RepNum(IsMoney)(i), 1))
Next i
If OrgNum < 20 Then
If IsMoney Then
StrNum = Replace(StrNum, "壹拾", "拾")
Else
StrNum = Replace(StrNum, "一十", "十")
End If
End If
If dotNum <> 0 Then
If dotNum > 8 Then dotNum = 8
OrgNum = FormatNumber(OrgNum, dotNum, , , vbFalse)
AfterDotNum = Mid(OrgNum, InStr(OrgNum, ".") + 1, dotNum)
If IsMoney Then
AfterDotNum = Format(AfterDotNum, _
Left("0角0分000000", dotNum + 2))
End If
For i = 0 To 10
AfterDotNum = Replace(AfterDotNum, i, _
Mid(NumChar(IsMoney), i + 1, 1))
Next i
End If
If IsMoney Then
GetChinaNum = StrNum & "元" & AfterDotNum & "
;整"
Else
GetChinaNum = StrNum & "点" & AfterDotNum
End If
For i = 0 To 1
GetChinaNum = Replace(GetChinaNum, _
RepPostNum(i), Right(RepPostNum(i), 1))
Next i
If IsMoney = 0 Then
If OrgNum > 0 Then
GetChinaNum = Replace(GetChinaNum, "零点", "点")
End If
Else
If OrgNum < 1 Then
GetChinaNum = Replace(GetChinaNum, "零元", "")
Else
GetChinaNum = Replace(GetChinaNum, "零元", "元")
End If
GetChinaNum = Replace(GetChinaNum, "零角", "零")
If dotNum <= 2 Then
GetChinaNum = Replace(GetChinaNum, "零分", "")
End If
End If

Erase NumDigit
Erase NumChar
Erase RepNum
End Function
icansaymyabc 2002-11-14
  • 打赏
  • 举报
回复
简单
icelight 2002-11-14
  • 打赏
  • 举报
回复
不好意思,上面漏了一句代码。现更正:

#include "stdafx.h"
#include <math.h>
#include <iostream>

// 去零
long TrimRight(char* sz)
{
long nLen = strlen(sz);
while(nLen>=0)
{
if('0'!=sz[--nLen])
break;
}
return nLen;
}

char* Convert(char *sz,double fOldNum)
{
static char *szLevel[] = {"个","拾","佰","千","万","拾","百","千","亿","拾","百","千","万"};
static char *szChineseNum[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

char szNum[200];
// 整数部分
long nTotal = sprintf(szNum,"%u",(unsigned long)fOldNum);
long nTrim = TrimRight(szNum);
for(int i=0,n=0;i<=nTrim;i++)
{
if(!(szNum[i]=='0' && szNum[i-1]=='0'))
{
strcpy(sz+n, szChineseNum[szNum[i]-48]);
n += 2;
}
if(i<nTotal-1 && szNum[i]!='0')
{
strcpy(sz+n,szLevel[nTotal-i-1]);
n += strlen(szLevel[nTotal-i-1]);
}
}

strcpy(sz+n,"点");
n += strlen("点");

// 小数部分
sprintf(szNum,"%f",fOldNum-(unsigned long)fOldNum);
nTrim = TrimRight(szNum);
for(i=2;i<=nTrim;i++,n+=2)
strcpy(sz+n, szChineseNum[szNum[i]-48]);

return sz;
}

int main(int argc, char* argv[])
{
char sz[500];
double dOldNum = 2510030700.7028 ;
sprintf(sz,"%f",dOldNum);
std::cout<<sz<<std::endl;
Convert(sz,dOldNum);
std::cout<<sz<<std::endl;
return 0;
}
icelight 2002-11-14
  • 打赏
  • 举报
回复
这是一个控制台程序。
#include "stdafx.h"
#include <math.h>
#include <iostream>

// 去零
long TrimRight(char* sz)
{
long nLen = strlen(sz);
while(nLen>=0)
{
if('0'!=sz[--nLen])
break;
}
return nLen;
}

char* Convert(char *sz,double fOldNum)
{
static char *szLevel[] = {"个","拾","佰","千","万","拾万","百万","千万","亿","拾亿","百亿","千亿","万亿"};
static char *szChineseNum[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

char szNum[200];
// 整数部分
long total = sprintf(szNum,"%u",(unsigned long)fOldNum);
long trim = TrimRight(szNum);
for(int i=0,n=0;i<=trim;i++,n+=2)
{
strcpy(sz+n, szChineseNum[szNum[i]-48]);
if(i<total-1 && szNum[i]!='0')
{
strcpy(sz+n+2,szLevel[total-i-1]);
n += strlen(szLevel[total-i-1]);
}
}

strcpy(sz+n,"点");
n += strlen("点");

// 小数部分
total = sprintf(szNum,"%f",fOldNum-(unsigned long)fOldNum);
trim = TrimRight(szNum);
for(i=2;i<=trim;i++,n+=2)
strcpy(sz+n, szChineseNum[szNum[i]-48]);

return sz;
}

int main(int argc, char* argv[])
{
char sz[500];
double dOldNum = 103700.728 ;
sprintf(sz,"%f",dOldNum);
std::cout<<sz<<std::endl;
// memset(sz,0,100);
Convert(sz,dOldNum);
std::cout<<sz<<std::endl;
return 0;
}
chinaren_shibo 2002-11-13
  • 打赏
  • 举报
回复
你可以构造一个字符数组(支持Unicode)的,存储壹拾万零叁千柒佰点柒贰捌,然后查表就行了,也就是根据数组的索引得到壹拾万零叁千柒佰点柒贰捌

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧