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

来源:互联网 发布:查看交换机端口ip地址 编辑:程序博客网 时间:2024/04/28 12:39

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

楼主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

的确有新意思!
原创粉丝点击