您的位置:程序门 -> db2 -> 数据库开发



db2 中数据转换,如1234567 要表示为1,234,567.00...............在线等!!!!急啊,谢谢各位大侠啦


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


db2 中数据转换,如1234567 要表示为1,234,567.00...............在线等!!!!急啊,谢谢各位大侠啦
发表于:2007-11-29 21:47:34 楼主
如题
发表于:2007-11-30 10:59:571楼 得分:0
觉得楼主可以将此功能放在应用程序里面实现比较好
发表于:2007-12-06 23:13:572楼 得分:0
同意楼上,   不论java   还是别的语言,基本都有格式化数值的相应的方法。

存放在数据库中,最好是原始数据,显示的时候再转换,这样如果别人再使用也很方便,计算也很方便。
发表于:2007-12-10 23:54:413楼 得分:0
完全同意楼上的观点,我们做程序也都是这么做,数据库中保存的就是原始数据,在前台显示的时候,想看什么格式的就格式化成什么样的,这样很灵活。
发表于:2007-12-11 15:33:464楼 得分:0
with   x   (pos,     nstr,   rstr,   n)   as  
    (   values(1,   '1234567',   cast('567.00'   as   varchar(20)),   7)
        union   all  
        select   pos+1,       nstr,     substr(nstr,n-pos*3,     3) ¦ ¦',' ¦ ¦rstr,   n  
      from   x   where     pos   *3   <   n)
      select   *   from   x
发表于:2007-12-11 15:36:295楼 得分:0
with       x       (pos,           nstr,       rstr,       n)       as    
        (       values(1,       '1234567',       cast('567.00'       as       varchar(20)),       length(   '1234567'))
                union       all    
                select       pos+1,               nstr,           substr(nstr,n-pos*3,           3)   |   |','   |   &brvbarrstr,       n    
            from       x       where           pos       *3       <       n)
            select       *       from       x
发表于:2007-12-11 15:39:326楼 得分:0
with   x   (pos,     nstr,   rstr,   n)   as  
    (   values(1,   '12345678 ',   cast( '678.00 '   as   varchar(20)),   length( '12345678 '))
        union   all  
        select   pos+1,       nstr,     substr(nstr,n-pos*3,     3) ¦ ¦ ', ' ¦ ¦rstr,   n  
      from   x   where     pos   *3   <   n)
      select   *   from   x   显示有点问题   最后一行就是结果
发表于:2007-12-11 15:40:327楼 得分:0
with   x   (pos,     nstr,   rstr,   n)   as  
    (   values(1,   '12345678 ',   cast( '678.00 '   as   varchar(20)),   length( '12345678 '))
        union   all  
        select   pos+1,       nstr,     substr(nstr,n-pos*3,     3)   ¦ ¦   ', '   ¦ ¦   rstr,   n  
      from   x   where     pos   *3   <   n)
      select   *   from   x   显示有点问题       最后一行就是结果
发表于:2007-12-11 17:08:448楼 得分:0
楼上的结果不对啊


                    1   12345678     678.00                                                   9
                  2   12345678     678,678.00                                           9
                  3   12345678     345,678,678.00                                   9
发表于:2007-12-12 17:38:449楼 得分:0
写了一个function   ,应该可以满足你的要求
db2   drop   function   formatnumber
db2   -td@   -vf   formatnumber.db2
db2   values   formatnumber(1234567)

运行例子:

d:\db2\samples\my> db2   values   formatnumber(1234567)

1
--------------------------------------------------
1,234,567.00

    1   条记录已选择。


d:\db2\samples\my> db2   values   formatnumber(1234567890123.123)

1
--------------------------------------------------
1,234,567,890,123.12

    1   条记录已选择。


create   function   formatnumber(data   decimal(20,2))
language   sql
returns   varchar(50)
begin   atomic
       
        declare   sreturn     varchar(50)   default   '';
        declare   datastr     varchar(50)   default   '';
        declare   stemp         varchar(30);
        declare   datadecimal   varchar(15);
        declare   datainteger   varchar(15);
        declare   kcount     int;
        declare   klength   int;
        declare   k               int     default   1;
        declare   num           int;
        declare   loops       int     default   1;
        declare   is_zero   int     default   1;  
        set   stemp     =   char(data);
       
        --去掉decimal   转为字符串的开头的0
        set   kcount   =   length(stemp);
        while   k <=kcount   do
                if   (substr(stemp,k,1)   ='0'   and   is_zero=1)   then
                set   datastr   =   datastr ¦ ¦'';
                else
                set   datastr   =   datastr ¦ ¦substr(stemp,k,1);
                set   is_zero   =0;
                end   if;
                set   k=k+1;
        end   while;
        --取整数部分和小数部分
        set   datainteger   =   substr(datastr,1,locate('.',datastr)-1);
        set   datadecimal   =   substr(datastr,locate('.',datastr));
       
        set   kcount   =   length(datainteger);
        if   mod(kcount,3)   =   0   then
        set   klength   =   kcount/3;
        else
        set   klength   =   kcount/3+1;
        end   if;
        while   klength> 0     do
        set   klength   =   klength-1;
                set   num   =   kcount-3*loops+1;
        if   num> 0   then  
                if   (klength   =0   and   mod(kcount,3)   =   0)   then  
                        set   sreturn   =   substr(datainteger,num,3) ¦ ¦sreturn;
                else
                set   sreturn   =   ',' ¦ ¦substr(datainteger,num,3) ¦ ¦sreturn;
                end   if;
        else
        set   sreturn   =   substr(datainteger,1,mod(kcount,3)) ¦ ¦sreturn;
        end   if;                  
                set   loops   =loops+1;
        end   while;
        set   sreturn   =   sreturn   ¦ ¦   datadecimal;
        return   sreturn;
end@
发表于:2007-12-14 15:24:3810楼 得分:0

with       x       (pos,           nstr,       rstr,       n)       as    
        (       values(1,       '1234567',       cast(   '.00   '       as       varchar(20)),       length(   '1234567'))
                union       all    
                select       pos+1,               nstr,  
                    case   when   pos             <=     cast(n/3   as   integer)   then   substr(nstr,n-pos*3   +1,   3   )     ¦ ¦     ',   '     ¦ ¦       rstr
                              else   substr(nstr,   1,   3-   pos*3   +   n)   ¦ ¦     ',   '     ¦ ¦       rstr   end,       n    
            from       x       where           pos             <=     ceiling(cast(n   as   float   )/3)    
          )
            select       *       from       x    


这个对了   上回   太匆忙了
发表于:2007-12-14 15:59:3911楼 得分:0
这次也有问题,
结果:
                      1   1234567   .00                                                         7
                    2   1234567   567,.00                                                 7
                    3   1234567   234,567,.00                                         7
                    4   1234567   1,234,567,.00                                     7

    已选择   4   条记录,打印   1   条警告消息。

更正一下:
with   x   (pos,nstr,rstr,n)   as          
  (values(1,'1234567',cast('.00'   as   varchar(20)),length('1234567'))  
  union   all          
  select   pos+1,   nstr,      
  case  
  when   pos=1   then   substr(nstr,n-pos*3+1,3) ¦ ¦rstr
        when   pos   <=   cast(n/3   as   integer)   then   substr(nstr,n-pos*3+1,3) ¦ ¦',' ¦ ¦   rstr  
        else   substr(nstr,1,3-   pos*3   +   n) ¦ ¦',' ¦ ¦rstr       end,n          
  from   x   where   pos   <=   ceiling(cast(n   as   float)/3)
    )  
  select   *   from   x   where   pos   =(select   max(pos)   from   x);  
发表于:2007-12-17 09:40:3112楼 得分:0
还是没有注意到阿   谢了  


快速检索

最新资讯
热门点击