您的位置:首页 > 编程语言

我在csdn得分最多的一个帖子:用6行代码写一个将小写金额转成大写的函数

2008-05-21 08:27 316 查看

写一个将小写金额转成大写的函数,你要多少行代码?

楼主cocolong2002(龙可可)2003-08-15 01:06:21 在 PowerBuilder / 基础类 提问
原先借鉴一位老师的要80多行,后来分析后,我写了一个只要6行代码(包括变量定义/return等所有代码)。
实现功能例如:
Cuper(123.56)返回¥壹佰贰拾叁元伍角陆分
最大可到亿元。
谁可以在10行代码写出类似函数,有分。:)
问题点数:100、回复次数:53Top

2 楼workhand(我可憨了...)回复于 2003-11-26 08:24:42 得分 0
呵呵,支持一下Top

3 楼klbt(快乐白兔)回复于 2003-11-26 08:33:26 得分 0

友情支持,帮你upTop

4 楼njz168(飞龙在天)回复于 2003-11-26 09:00:28 得分 0

楼主能否把你的6行代码公布一下。有分Top

5 楼pbsql(风云)回复于 2003-11-26 09:14:57 得分 0

6行代码就搞定了,你也太能吹了(也可能是我见识少),我看到过最少的代码是20行左右

你把6行代码公布一下,我给你200分Top

6 楼qqjj7758(QQJJ)回复于 2003-11-26 09:26:55 得分 0

代码越少可能用到的函数就越多
代码的函数还是应该算在其中的

只要简练易懂就好了 何必在乎那代码要多短呢?Top

7 楼jackzhang168(我是谁)回复于 2003-11-26 09:28:00 得分 0

upTop

8 楼oversecond(学习者)回复于 2003-11-26 09:32:33 得分 0

int i,s_len,sz[9]={0,0,0,0,0,0,0,0,0}
string str_num,str_ret
string dw[1 to 9]={"分","角","元","拾","佰","仟","万","拾","佰"}
string ch[0 to 9]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}
str_num=Right(string(Round(parm_je*100,0),"###########"),9)
s_len = len(str_num)
for i = s_len to 1 step -1
sz[s_len - i + 1] = integer(mid(str_num,i,1))
next
str_ret = ""
for i =1 to s_len
str_ret = " "+ch[sz[i]]+" "+dw[i]+str_ret
next
return str_retTop

9 楼treesoft(长沙水)回复于 2003-11-26 10:24:15 得分 0

//================================================================================// [PUBLIC] 函数 f_dec2chinese
//--------------------------------------------------------------------------------// 功能描述:将数值类型转为汉字表示
//--------------------------------------------------------------------------------// 参数:
//
// [value] decimal adec_number
// 描述:数值
//--------------------------------------------------------------------------------// 返回: (string) 汉字表示
//--------------------------------------------------------------------------------// 作者: treesoft 日期: 2003年11月26日
//================================================================================string ls_numbers[10]={'零','壹','贰','参','肆','伍','陆','柒','捌','玖'}
string ls_units[16]={'兆','仟','佰','拾','亿','仟','佰','拾','万','仟','佰','拾','元','.','角','分'}
integer li_i
string ls_rtn
string ls_char
string ls_source

ls_source = string(adec_number,'###############.00')
ls_source = space(16 - len(ls_source)) + mid(ls_source,len(ls_source) - 15)
for li_i = 16 to 1 step -1
ls_char = mid(ls_source,li_i,1)
if ls_char = ' ' then exit
if ls_char = '.' then continue
ls_rtn = ls_numbers[integer(ls_char) + 1]+ls_units[li_i] + ls_rtn
next

return ls_rtn

除去变量声明和注释,刚好10代码! :)Top

10 楼TGWall(Begin-End)回复于 2003-11-26 10:41:22 得分 0

追求干净利落的风格
支持ed、支持ing、支持,^_^... ...Top

11 楼khyhli(流水天际)回复于 2003-11-26 10:56:28 得分 0

可以首先把0-9阿拉伯数字转换为大写:
CREATE proc value1
@id nvarchar(1),
@ids nvarchar(1) output
as

if @id=1
begin
set @ids='壹'
end
else
if @id=2
begin
set @ids='贰'
end
else
if @id=3
begin
set @ids='叁'
end
else
if @id=4
begin
set @ids='肆'
end
else
if @id=5
begin
set @ids='伍'
end
else
if @id=6
begin
set @ids='陆'
end
else
if @id=7
begin
set @ids='柒'
end
else
if @id=8
begin
set @ids='捌'
end
else
if @id=9
begin
set @ids='玖'
end
else
begin
set @ids='零'
end
接下来可以把小写金额转换为大写金额:
CREATE proc value2
@num decimal(18,2)
as
declare @num1 varchar(15),@i int,@n_l varchar(15),@n_r varchar(15),@g int,@c int,@s nvarchar(15),@f nvarchar(1),@q narchar(30)
@v nvarchar(15),@l nvarchar(1),@r nvarchar(1),@k nvarchar(15) ,@ids nvarchar(1)
set @v='亿仟佰拾萬仟佰拾元角分'
set @i=charindex('.',@num)
set @n_l=left(@num,@i-1)
set @n_r=right(@num,len(@num)-@i)
set @num1=@n_l+@n_r
set @g=len(@num1)
set @s=right(@v,@g)
set @c=1
set @q=''
while @c<=@g
begin
set @f=substring(@num1,@c,1)
exec value1 @f,@ids output
set @l=substring(@s,@c,1)
set @q=@q+@ids+@l
set @c=@c+1
end
set @q=+'¥'+@q
print @q
虽然上述过程超过十行,但是很容易懂的!
Top

12 楼pbsql(风云)回复于 2003-11-26 11:16:37 得分 0

oversecond(学习者)与treesoft(长沙水)都是把“100.01”转换成了“一百零拾零元零角一分”,一般人都不会这样转换吧?
khyhli(流水天际)弄俩存储过程,比较繁,没仔细看Top

13 楼pbsql(风云)回复于 2003-11-26 11:18:34 得分 0

cocolong2002 (龙可可):期待你的6行代码,把“100.01”转换成“一百元零一分”!Top

14 楼will521(中国DotNet程序员俱乐部 -- www.willsft.com)回复于 2003-11-26 14:13:58 得分 0

贴出来看看Top

15 楼treesoft(长沙水)回复于 2003-11-26 14:29:09 得分 0

to: pbsql(风云)

开单据的时候,都地这么显示的。看看现实当中的发票都是以这种格式填写的哦! 如果要按你的要求的我看10行代码是写不出来的! :)Top

16 楼mittee(最后一条大白鲨[无限深情凝视花花版])回复于 2003-11-26 16:57:23 得分 0

简单的代码是否能把特殊情况考虑进去Top

17 楼ldy(罗大佑)回复于 2003-11-26 17:13:17 得分 0

呵呵,学习Top

18 楼ldy(罗大佑)回复于 2003-11-26 17:25:09 得分 0

我到现在都不太明白怎么算一行代码Top

19 楼luoyunbo()回复于 2003-11-26 17:31:16 得分 0

123.56返回'壹佰贰拾叁元伍角陆分'

六行代码??????

不会这么容易吧....难道楼主就是传说中的------
公布一下代码吧摆脱了。Top

20 楼nhdj(柳柳荷叶清清水)回复于 2003-11-26 17:43:35 得分 0

贴出来看看Top

21 楼pbsql(风云)回复于 2003-11-26 18:44:16 得分 0

开单据可是只打数字,不打元角分的,那也太简单了点吧Top

22 楼klbt(快乐白兔)回复于 2003-11-26 19:26:41 得分 0

不过,楼主提出的问题很有意义。
-----------------------------
原先借鉴一位老师的要80多行
-----------------------------
80行做这个函数确实太长了,精益求精是应该是合格程序员的永恒追求。Top

23 楼kowloons(0分帖先锋)回复于 2003-11-26 19:34:20 得分 0

多用续行符呵呵全合并为一行了Top

24 楼freechinapi(琪琪)回复于 2003-11-26 21:28:51 得分 0

问一下6行源代码的朋友,要是0.56,你的函数显示什么呢?
Top

25 楼pbsql(风云)回复于 2003-11-27 09:17:55 得分 0

我给大家贴个我看到的最短的小写金额转换大写金额的函数:

string n_data,c_data,n_str
integer i
n_data=space(14 - len(trim(string(abs(num*100),"#############0"))))+trim(string(abs(num*100),"#############0"))
for i=1 to 14 step 1
n_str=mid(n_data,i,1)
if n_str<>" " then
if not (mid(n_data,i,2)="00" or (n_str="0" and (i=4 or i=8 or i=12 or i=14))) then
c_data=c_data+trim(mid("零壹贰叁肆伍陆柒捌玖",integer(n_str)*2 + 1,2))
end if
if not (n_str="0" and i<>4 and i<>8 and i<>12) then
c_data=c_data+trim(mid("仟佰拾亿仟佰拾万仟佰拾圆角分",i*2 - 1,2))
end if
if right(c_data,4)="亿万" then c_data=left(c_data,len(c_data) - 2)
end if
next
if num<0 then c_data="(负数)"+c_data
if num=0 then c_data="零圆"
if n_str="0" then c_data=c_data+"整"
return c_dataTop

26 楼cocolong2002(龙可可)回复于 2003-11-29 10:11:19 得分 0

不用继行符,包括变量声明。10以内完成函数。Top

27 楼cocolong2002(龙可可)回复于 2003-11-29 10:15:30 得分 0

风云 说话可要算数哦,你开一个200分的贴,我回给你。Top

28 楼cocolong2002(龙可可)回复于 2003-11-29 10:17:33 得分 0

谢谢各位的支持,我期待着把本贴的100分送出。Top

29 楼sky2311(菜得不能再菜了!)回复于 2003-11-29 13:16:36 得分 0

顶!Top

30 楼sunsunup(細水長流)回复于 2003-11-29 13:25:20 得分 0

轉換一下這個數看看: 10100101.01Top

31 楼sunsunup(細水長流)回复于 2003-11-29 13:26:34 得分 0

再試試100010001Top

32 楼cocolong2002(龙可可)回复于 2003-11-29 13:42:48 得分 0

轉換一下這個數看看: 10100101.01 ¥壹仟零佰壹拾零万零仟壹佰零拾壹元零角零分
再試試100010001 超过一亿Top

33 楼insert2003(高级打字员)回复于 2003-11-29 13:51:19 得分 0

代码长短的讨论有什么意义吗?
达到目点不就行啦Top

34 楼cocolong2002(龙可可)回复于 2003-11-29 13:58:11 得分 100

int i
string Str_hz="分角元拾佰仟万拾佰仟亿",str_u="零壹贰叁肆伍陆柒捌玖",s,str_re="¥"
s=string(long( is_number *100))
for i=1 to len(s)
str_re=str_re+mid(str_u,integer(mid(s,i,1)) * 2 + 1 ,2)+mid(str_hz,(len(s)-i)*2+1,2)
next
return str_reTop

35 楼cocolong2002(龙可可)回复于 2003-11-29 14:00:39 得分 0

for 里面只有一句就可以达到要求。Top

36 楼cocolong2002(龙可可)回复于 2003-11-29 14:03:08 得分 0

0.56 返回 ¥伍角陆分Top

37 楼zhouweiwansui(彪悍的论点不需要解释)回复于 2003-11-29 14:58:57 得分 0

6行代码?你真能吹啊Top

38 楼cocolong2002(龙可可)回复于 2003-11-29 15:26:39 得分 0

差不多了Top

39 楼cocolong2002(龙可可)回复于 2003-11-29 15:37:06 得分 0

zhouweiwansui(周维[csdnsc.126.com]) 朋友,你看看是不是能把上面的函数中的 S变量放入for中的一句,再算一下是不是6行?弄成6行是完全可以的,为什么说是“吹”??可能是你没有认真看吧?对不起如果因为我的贴子让你产生不快乐的感觉,我先向你道歉。Top

40 楼han9703(枫)回复于 2003-11-29 15:50:59 得分 0

楼主 是不是应该
str_re=str_re+mid(str_u,integer(mid(s,i,1)) + 1 ,1)+mid(str_hz,(len(s)-i)+1,1)

你的*2是什么意思啊Top

41 楼cocolong2002(龙可可)回复于 2003-11-29 16:04:09 得分 0

han9703(枫):在英文数字里每个数的len 是1,而中文字符串每个汉字的len是2。所以*2Top

42 楼han9703(枫)回复于 2003-11-29 16:07:22 得分 0


我用的是8.0没这分别Top

43 楼pbsql(风云)回复于 2003-12-01 09:23:39 得分 0

我说的不是这种效果!

并且就算是这样,你的也不能将0译为零元或零分!Top

44 楼pbsql(风云)回复于 2003-12-01 09:25:42 得分 0

sorry,我错了,可以!

我说的不是这种效果!所以200分就免了!^_^
Top

45 楼benjaminz(RockDJ)回复于 2003-12-01 11:25:13 得分 0

回字有几种写法?说!有几种?
你这样写代码,别人看的懂吗?Top

46 楼workhand(我可憨了...)回复于 2003-12-01 14:43:51 得分 0

楼主真是厉害,稍微想想还是可以接受的。

佩服。Top

47 楼canchuan(残喘)回复于 2003-12-01 17:14:33 得分 0

呵呵,顶,牛。Top

48 楼SummerHeart(夏夜之怀)回复于 2003-12-01 18:10:10 得分 0

支持楼主,更支持 klbt(快乐白兔) VVTop

49 楼SunMight(人生如梦)回复于 2003-12-02 10:23:26 得分 0

条条大路通罗马,只要对C或汇编等语言有一定认识的人都可以写出来的比较高效简短的程序,变个题目,让大家用汇编写吧:)(声明,我不会汇编!)Top

50 楼cocolong2002(龙可可)回复于 2003-12-02 20:50:36 得分 0

开这贴,原来是希望能给各位有点借鉴作用,看来目的是达了。:)Top

51 楼lmby(鹿门布衣)回复于 2003-12-03 11:08:23 得分 0

我帮你结了。虽然你的转换在某些时候有点欠缺(如0转成零分),不过对活跃思维很有帮助。支持。Top

52 楼lmby(鹿门布衣)回复于 2003-12-03 11:31:46 得分 0

另外,我整理了一下你的程序,让大家看得更清楚一点。不算侵权吧^_^

int i
string ls_unit, ls_digit, ls_input, ls_out

ls_unit = "分角元拾佰仟万拾佰仟亿"
ls_digit = "零壹贰叁肆伍陆柒捌玖"
ls_out = "¥"

ls_input = string(long( as_number *100))//as_numer是输入

for i = 1 to len( ls_input )
ls_out = ls_out + mid( ls_digit, integer(mid(ls_input, i , 1 ) ) * 2 + 1 ,2) + mid( ls_unit,(len(ls_input) - i ) * 2 + 1, 2 )
next

return ls_outTop

53 楼rustical(时光流逝)回复于 2003-12-17 10:09:26 得分 0

的确有新意思!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: