首页 > 学技术 > 技术网文 > IBM AS400应用论坛 > 正文

[精华] 求小写的金额转成大写金额的程式~


来源 chinaunix.net 酷勤网整理

请高手给发一个把   小写的金额转成大写金额的程式,非常感谢

如:小写金额为 8888.88
转化为  大写 捌仟捌百捌十捌点捌捌元

谢谢大侠~



 qingzhou 回复于:2007-01-02 15:14:04

参考以下帖子应该可以得到启发:
http://bbs.chinaunix.net/viewthread.php?tid=765079&extra=&page=1


 qingzhou 回复于:2007-01-02 15:21:55

(转)小写金额转换为大写金额(C实现)

  大多的算法都是直接分析字符串生成大写金额,即存在一个假设:源字符串的格式是正确的。在我的过程中,用状态机的方法分析源字符串,错误时,返回空指针(我可不敢保证传给我的过程的都是##.##)。 分析出源字符串中整数部有多少个数字,是否有小数,统计结果放在一个结构体中,整数和小数部分的数字分别放在两个整形数组里。

  有了统计数据就可以生成大写金额了。转换过程有个难点:要区分万、亿等“段”,特别是个位这个“段”,这个概念是在《小写转大写金额在C++中的实现》文章中提到的。在下面的程序中用j=(size-i-1)&0x3,实际上是j=(size-i-1)%4取模,j==0时为段尾,需要特殊处理。所有的处理都是围绕0来进行的,也就是说,0才是难点。

  特殊位置的0,按段分,段中第一个非0数字前的0,可能有多个;段中两个非0数字间的0;段尾的0;个位的0;十分位,角位置的0。

  另外,转换的一个重点是大写金额的写法,好像大多的算法都注重转换过程而对这个问题没有深究。我在文章后面附上转换规则。

  有一点,从低耦合的角度说,这个过程应该再细分一下。输入可以是标准格式的字符串或数字,验证的过程可以放到另一个模块中。我就不再分了,总体上,while语句整体是格式分析过程,可以单独拿出来。后面的代码是生成大写读法。需要的自己处理下吧,很简单。

下面是代码

/**

 * @brief 将源字符串中的小写金额转换为大写格式
 *
 * @param dest 目的字符串
 * @param src  小写金额字符串
 * @return 
 * - NULL 源字符串的格式错误,返回NULL
 * - 非NULL 目的字符串的首地址
 * @note 转换根据:中国人民银行会计司编写的最新《企业、银行正确办理支付结算
 *       指南》的第114页-第115页
 */
char* chineseFee( char* dest, char* src )
{
    enum
    {
        START,                 //开始
        MINUS,                 //负号
        ZEROINT,               //0整数
        INTEGER,               //整数
        DECIMAL,               //小数点
        DECIMALfRACTION,       //小数位
        END,                   //结束
        ERROR                  //错误
    } status = START;

    struct
    {
        int minus;             //0为正,1为负
        int sizeInt;
        int sizeDecimal;
        int integer[10];
        int decimal[10];
    } feeInfo;

    char* NumberChar[] = 
        { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
    char* UnitChar[] = 
        { "整", "圆", "拾", "佰","仟", "万", "拾", "佰", "仟", "亿", 
          "拾", "佰", "仟", "万亿", "拾", "佰", "仟", "亿亿", 
          "角", "分", "负", "人民币" };
          
    int      i, j,size;             //循环变量
    int      zeroTag        = 0,    //0标志
             decZeroTag     = 0;
      
    char*    pDest          = dest;
    char*    pSrc           = src;
    
    int*     pInt           = feeInfo.integer;
    int*     pDec           = feeInfo.decimal;
    
    //初始化
    feeInfo.sizeInt        = 0;
    feeInfo.sizeDecimal    = 0;
    feeInfo.minus          = 0;
    
    //分析字符串
    while( 1 )
    {
        switch ( *pSrc )
        {
            case '-' :
                status = ( status == START ) ? MINUS : ERROR;
                feeInfo.minus = ( status == MINUS ) ? 1 : 0;
                break;
            case '1' :
            case '2' :
            case '3' :
            case '4' :
            case '5' :
            case '6' :
            case '7' :
            case '8' :
            case '9' :
            case '0' :
                if ( *pSrc == '0' && status == ZEROINT )//|| status == START ) )
                {
                    status = ERROR;
                    break;
                }
                if ( status == MINUS || status == START || status == INTEGER )
                {
                    if ( *pSrc == '0' && ( status == MINUS || status == START ) )
                        status = ZEROINT;
                    else
                        status = INTEGER;
                    *pInt = (*pSrc) - 48;
                    ++pInt;
                    ++feeInfo.sizeInt;
                }
                else if ( status == DECIMAL || status == DECIMALfRACTION )
                {
                    status = DECIMALfRACTION;
                    *pDec = (*pSrc) - 48;
                    ++pDec;
                    ++feeInfo.sizeDecimal;
                }
                else
                {
                    status =ERROR;
                }
                break;
            case '.' :
                status = ( status == INTEGER || status == ZEROINT ) 
                         ? DECIMAL : ERROR;
                break;
            case '' :
                status = ( status == INTEGER || status == DECIMALfRACTION 
                           || status == ZEROINT ) ? END : ERROR;
                break;
            default :
                status = ERROR;
        }
        if ( status == END ) 
            break;
        else if ( status == ERROR )
            return NULL;
        
        ++pSrc;
    }
    
    //只有1位小数时,设置百分位为0,使下面代码不需要区分这两种情况
    if ( feeInfo.sizeDecimal == 1 )
    {
        feeInfo.decimal[ 1 ] = 0;
        ++feeInfo.sizeDecimal;
    }

    //判断是否需要打印小数部分,有小数部且十分位和百分位不都为0
    //需要打印小数部时,zeroTag设为0,否则设为1
    if ( feeInfo.sizeDecimal == 0                                 //没有小数
        || ( !feeInfo.decimal[ 0 ] && !feeInfo.decimal[ 1 ] ) )   //小数部都为0
        decZeroTag = 1;
    else
        decZeroTag = 0;
        
    //printf( "int size: %d    decimal size: %d ", feeInfo.sizeInt, feeInfo.sizeDecimal );
    
    strcpy( pDest, UnitChar[ 21 ] );                  //初始化目标字符串-人民币
    
    if ( feeInfo.minus ) strcat( pDest, UnitChar[ 20 ] );    //负号
        
    //处理整数部分
    size = feeInfo.sizeInt;
    for( i = 0; i < size; ++i )
    {
        j = size - i - 1 & 0x3;                              //j = 0时为段尾
        if ( feeInfo.integer[ i ] == 0 && j )                //处理非段尾0
        {
            zeroTag = 1;
        }
        else if ( feeInfo.integer[ i ] == 0 && !j )          //处理段尾0
        {
            if ( feeInfo.sizeInt == 1 && decZeroTag )        //特殊处理个位0
                strcat( pDest, NumberChar[ feeInfo.integer[ i ] ] );
            if ( feeInfo.sizeInt != 1 || decZeroTag )
                strcat( pDest, UnitChar[ size - i ] );
            zeroTag = 0;
        }
        else                                                 //处理非0
        {
            if ( zeroTag )
            {
                strcat( pDest, NumberChar[ 0 ] );
                zeroTag = 0;
            }
            strcat( pDest, NumberChar[ feeInfo.integer[ i ] ] );
            strcat( pDest, UnitChar[ size - i ] );
            if ( !j ) zeroTag = 0;                      //如果是段尾,设为非标志
        }
    }
    
    if ( decZeroTag )
    {
        strcat( pDest, UnitChar[ 0 ] );//没有小数部,打印"整"字符
    }
    else
    {
        //十分位
        if ( feeInfo.decimal[ 0 ] )
        {
            strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );
            strcat( pDest, UnitChar[ 18 ] );
        }
        else if ( feeInfo.sizeInt != 1 || feeInfo.integer[ 0 ] )
        {
            strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );
        }
        
        //百分位不为0时
        if ( feeInfo.decimal[ 1 ] )    
        {
            strcat( pDest, NumberChar[ feeInfo.decimal[ 1 ] ] );
            strcat( pDest, UnitChar[ 19 ] );
        }
    }
    return dest;
}



 xiaofish82 回复于:2007-01-02 16:44:13

这应该不是什么难题吧.

rpg实现起来,也应该不是什么问题,就是麻烦。

简单说下方法,仅供参考:
1,做个tab,值是0~9的大写,写程序的时候,对于金额的每一位,你都要到tab里面去做
检索,检索到后,将tab里面的值取出。
2,然后就是区分万,千,百位的问题了。可不可以这么考虑,你先找出小数点的位子,然后
确定小数点前面的个数,然后,百,千,万这些单位就好确定了吧。
3,剩下的任务就应该是把每一个字符连接起来,做成字符串,这样应该就可以了。

说的比较泛泛,但是我觉得如果是rpg程序,这样肯定可以实现。
有个命令,不知道你知道不,chckr查询字符串的,用这个命令,可能简单些。


 sater84 回复于:2007-01-02 17:03:47

谢谢轻舟老大和楼上的那位兄弟,谢谢,刚刚接触400,所以技术很菜


我程式有自己写出一点点出来, 编译也错了,但是就是显示不出大写拉,执行之后出现的是乱码,我也不知道是哪里搞错了,请朋友们帮我看一下,请轻舟老大和楼上的兄弟帮帮忙,谢谢你们了.程式如下:
                                  
  H                                                  1         
  FSF02F   IF  E           K        DISK                       
  FSF02FP  IF  E           K        DISK                      A
  E                    TAB01   1  10  1 0 TAB02  13            
  I*RSF02F                                                     
  I*             SUDPT                           SUDPTA        
  I            DS                                              
  I                                        1  132SUDPT         
  I                                        1   10SUDP1         
  I                                        2   20SUDP2         
  I                                        3   30SUDP3         
  I                                        4   40SUDP4         
  I                                        5   50SUDP5         
  I                                        6   60SUDP6         
  I                                        7   70SUDP7       
  I                                        8   80SUDP8 
  I                                        9   90SUDP9 
  I                                       10  100SUDP10
  I                                       11  110SUDP11
  I                                       12  120SUDP12
  I                                       13  130SUDP13
  I            DS                                      
  I                                        1  13 FZKK  
  I                                        1   1 FZK1  
  I                                        2   2 FZK2   
  I                                        3   3 FZK3   
  I                                        4   4 FZK4   
  I                                        5   5 FZK5   
  I                                        6   6 FZK6   
  I                                        7   7 FZK7   
  I                                        8   8 FZK8   
  I                                        9   9 FZK9   
  I                                       10  10 FZK10  
  I                                       11  11 FZK11  
  I                                       12  12 FZK12  
  I                                       13  13 FZK13  
  C                     MOVE *BLANK    FZKK   13        
  C           *LOVAL    SETLLSF02F                40    
  C           *IN40     DOWEQ'0'                        
  C                     READ SF02F                    40
  C           *IN40     IFEQ '0'                        
  C           SIVNO     CHAINRSF02FP              88    
  C           SUDP1     LOKUPTAB01     TAB02          91 
  C   91                MOVE TAB02     FZK1              
  C           SUDP2     LOKUPTAB01     TAB02          91 
  C   91                MOVE TAB02     FZK2              
  C           SUDP3     LOKUPTAB01     TAB02          91 
  C   91                MOVE TAB02     FZK3              
  C           SUDP4     LOKUPTAB01     TAB02          91 
  C   91                MOVE TAB02     FZK4              
  C           SUDP5     LOKUPTAB01     TAB02          91 
  C   91                MOVE TAB02     FZK5             
  C           SUDP6     LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK6             
  C           SUDP7     LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK7             
  C           SUDP8     LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK8             
  C           SUDP9     LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK9             
  C           SUDP10    LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK10            
  C           SUDP11    LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK11            
  C           SUDP12    LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK12            
  C           SUDP13    LOKUPTAB01     TAB02          91
  C   91                MOVE TAB02     FZK13            
  C                     MOVELSIVNO     SIVNN            
  C                     MOVELFZKK      FZK              
  C   88                WRITERSF02FP                    
  C                     ENDIF                           
  C                     ENDDO                           
  C                     SETON                     LR    
**   
**   
0 零 
1 壹 
2 贰 
3 叁
4 肆 
5 伍
6 陆 
7 柒
8 捌 
9 玖


 pantierui 回复于:2007-01-03 08:53:20

你可以做个关联表试一试

0001.00      E                    TAB1    1   9  1   TAB2    2                               061230  
0002.00      C                     MOVEL'B'       AA      1                                  061219  
0003.00      C                     MOVEL*BLANK    BB      1                                  061219  
0004.00      C                     Z-ADD1         X       20                                 061219  
0005.00      C           AA        LOKUPTAB1      TAB2           90                          061230  
0012.00      C   90      TAB2      DSPLY                                                     061230  
0015.00      C                     SETON                     LR                              061214  
0016.00      C                     RETRN                                                     061214  
0017.00 ** TAB1 TAB2                                                                         061230  
0018.00 A1A                                                                                  061219  
0019.00 B2B                                                                                  061219  
0020.00 C3C                                                                                  061219  
0021.00 D4D                                                                                  061219  
0022.00 E5E                                                                                  061219  
0023.00 F6F                                                                                  061219  
0024.00 G7G                                                                                  061219  
0025.00 H8H                                                                                  061219  
0026.00 I9I

[ 本帖最后由 pantierui 于 2007-1-3 08:54 编辑 ]


 pantierui 回复于:2007-01-03 13:50:22

你把我给你的上面的代码写到你的程序内
当AA=1的时候它就等于大写的壹
可以参见http://blog.chinaunix.net/u/20092/showart_218296.html
0001.00      E                    TAB1    1   10  1   TAB2    4                               061230  
0002.00      C                     MOVEL'1'       AA      1                                  061219  
0003.00      C                     MOVEL*BLANK    BB      1                                  061219  
0004.00      C                     Z-ADD1         X       20                                 061219  
0005.00      C           AA        LOKUPTAB1      TAB2           90                          061230  
0012.00      C   90      TAB2      DSPLY                                                     061230  
0015.00      C                     SETON                     LR                              061214  
0016.00      C                     RETRN                                                     061214  
0017.00 ** TAB1 TAB2                                                                         061230  
0018.00 0 零                                                                                  061219  
0019.00 1 壹                                                                                  061219  
0020.00 2 贰                                                                                  061219  
0021.00 3 叁                                                                                  061219  
0022.00 4 肆                                                                                  061219  
0023.00 5 伍                                                                                  061219  
0024.00 6 陆                                                                                  061219  
0025.00 7 柒                                                                                  061219  
0026.00 8 捌                                     
0026.00 9 玖

[ 本帖最后由 pantierui 于 2007-1-3 13:52 编辑 ]


 sater84 回复于:2007-01-03 16:19:28

对不起啊,大哥,我不知道您发的程式应该加在我程式的那里啊,而且您给我发的两段程式是不一样的,两个都要吗?


您能和我讲解下嘛,麻烦您了,谢谢您~~~


 sater84 回复于:2007-01-04 15:04:58

55555555555555,别让他沉啊,还没解决啊~


 sater84 回复于:2007-01-08 08:51:10

真的很不好意思啊,这个问题我真的解决不了,所以才不停的发,不停的发

现在上面催的很紧,请会的大侠们帮下忙嘛,小弟不盛感激~谢谢了~


 大肥肥 回复于:2007-01-08 14:44:26

COBOL写的,编译出来就可以直接用了,编译方法和rpg一样。
  
    * FUNCTION: CGANHE NUMBER INTO CHINESE                                  *
      *     INPUT : STRING                                                    *
      *     OUTPUT : PRINT                                                    *
       *************************************************************************
       IDENTIFICATION   DIVISION.
       PROGRAM-ID.   CONVERT.
 

       ENVIRONMENT DIVISION.
       DATA DIVISION.

       WORKING-STORAGE SECTION.
       77   MIDDATA    PIC X(15).
       77   I          PIC 99 .
       77   K          PIC 99.
       77   PD         PIC 99.
       77   PP         PIC 99.
       77   PM         PIC 99.
       77   LEN        PIC 99.
       77   ZSLEN      PIC 99.
       77   MIDLEN     PIC 99.
       77   MIDNUM     PIC X.
       77   J          PIC 99.
       77   YI         PIC X(4) VALUE '壹'.
       77   ER         PIC X(4) VALUE '贰'.
       77   SHAN       PIC X(4) VALUE '叁'.
       77   SHI        PIC X(4) VALUE '肆'.
       77   WU         PIC X(4) VALUE '伍'.
       77   LIU        PIC X(4) VALUE '陆'.
       77   QI         PIC X(4) VALUE '柒'.
       77   BA         PIC X(4) VALUE '捌'.
       77   JIU        PIC X(4) VALUE '玖'.
       77   LING       PIC X(4) VALUE '零'.
       77   YUAN       PIC X(4) VALUE '元'.
       77   JIAO       PIC X(4) VALUE '角'.
       77   FEN        PIC X(4) VALUE '分'.
       77   YIYI       PIC X(4) VALUE '亿'.
       77   WAN        PIC X(4) VALUE '万'.
       77   QIAN       PIC X(4) VALUE '仟'.
       77   BAI        PIC X(4) VALUE '佰'.
       77   SI         PIC X(4) VALUE '拾'.
       77   ZHENG      PIC X(4) VALUE '整'.
       77   ZHONWEN    PIC X(2) VALUE SPACE.

            01   MIDSTR     PIC X(40) VALUE SPACE.

          01   RSTSTR     PIC X(40) VALUE SPACE.
       77   XIAOSHU    PIC 99   VALUE 0.
       77   XSHU       PIC 99   VALUE 0.
       77   TESTTMP    PIC X    VALUE SPACE.
       77   L          PIC 99 .
       77   TMPV       PIC X(4) VALUE SPACE.

       LINKAGE SECTION.

  77   INPUTDATA  PIC X(15) VALUE SPACE.
  77   OUTDATA    PIC X(40).

       PROCEDURE DIVISION USING INPUTDATA, OUTDATA.
       MAIN-PROGRAM.
            PERFORM INITIAL-PHASE.
            PERFORM DETAIL-PHASE THRU END-DETAIL-PHASE.
            PERFORM END-PHASE.
       INITIAL-PHASE.
            MOVE 0  TO XIAOSHU.
            MOVE 0 TO XSHU.
            MOVE SPACE TO OUTDATA.
            MOVE SPACE TO MIDDATA.
            MOVE SPACE TO MIDSTR.
            MOVE SPACE TO RSTSTR.
            MOVE SPACE TO MIDNUM.
       DETAIL-PHASE.
            MOVE 1 TO I .
            MOVE INPUTDATA TO MIDDATA.
            PERFORM COUNT-LENGTH THRU C-END UNTIL MIDDATA(I:1) = SPACE.
            IF LEN = 1
               GO TO END-DETAIL-PHASE
            END-IF.

            IF MIDDATA(1:1) = '0' AND MIDDATA = '0.00'
 
               MOVE LING TO OUTDATA
               GO TO END-DETAIL-PHASE
            END-IF.
            SUBTRACT 2 FROM LEN GIVING MIDLEN.
            MOVE MIDDATA(MIDLEN:1) TO TESTTMP.
            IF MIDDATA(MIDLEN:1) = '.'
                 SUBTRACT 3 FROM LEN GIVING ZSLEN
            ELSE
                 MOVE LEN TO ZSLEN
            END-IF.
            MOVE 1 TO J.
            MOVE YI(1:1) TO MIDSTR(J:1) .
            ADD 1 TO J .
            EVALUATE ZSLEN
               WHEN  1
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2) TO  MIDSTR(J:4)
               WHEN  2
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2)  TO MIDSTR(J:2)
              WHEN 3
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(3:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2)  TO MIDSTR(J:2)
              WHEN 4
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(3:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(4:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2) TO MIDSTR(J:2)
             WHEN 5
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE WAN(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(3:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(4:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(5:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2) TO MIDSTR(J:2)
             WHEN 6
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE WAN(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(3:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(4:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(5:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(6:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2) TO MIDSTR(J:2)


 大肥肥 回复于:2007-01-08 14:46:22

WHEN 7
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(3:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE WAN(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(4:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(5:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(6:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(7:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2) TO MIDSTR(J:2)
             WHEN 8
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(3:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(4:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE WAN(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(5:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(6:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(7:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(8:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2) TO MIDSTR(J:2)
             WHEN 9
                 MOVE MIDDATA(1:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YIYI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(2:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(3:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(4:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(5:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE WAN(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(6:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE QIAN(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(7:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE BAI(2:2)  TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(8:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE SI(2:2) TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE MIDDATA(9:1) TO MIDNUM
                 PERFORM CHANGE-PHASE
                 MOVE ZHONWEN TO MIDSTR(J:2)
                 ADD 2 TO J
                 MOVE YUAN(2:2) TO MIDSTR(J:2)
            END-EVALUATE.
            IF ZSLEN < LEN
                 PERFORM TRANS-XIAOSHU THRU TRANS-XIAOSHU-END
            END-IF.
                 ADD 2 TO J.
                 MOVE YI(4:1) TO MIDSTR(J:1).
      * MOVE AWAY ZERO
                 PERFORM MOVE-AWAY-ZERO THRU MOVE-AWAY-ZERO-END.
                 MOVE RSTSTR TO OUTDATA.
       END-DETAIL-PHASE.
       TRANS-XIAOSHU.
                 MOVE ZSLEN TO XIAOSHU.
                 ADD 2 TO XIAOSHU.
                 MOVE XIAOSHU TO XSHU.
                 ADD 2 TO J   .
                 IF MIDDATA(XIAOSHU:2) = '00'
                   SUBTRACT 2 FROM J
                   GO TO TRANS-XIAOSHU-END
                 END-IF.
                 IF MIDDATA(XIAOSHU:1) = '0'
                     MOVE MIDDATA(XIAOSHU:1) TO MIDNUM
                     PERFORM CHANGE-PHASE
                     MOVE ZHONWEN  TO MIDSTR(J:2)
                     ADD 2 TO J
                     ADD 1 TO XIAOSHU
                     MOVE MIDDATA(XIAOSHU:1) TO MIDNUM
                     PERFORM CHANGE-PHASE
                     MOVE ZHONWEN TO MIDSTR(J:2)
                     ADD 2 TO J
                     MOVE FEN(2:2) TO MIDSTR(J:2)
                 ELSE
      *          IF MIDDATA(XIAOSHU:1) NOT EQUAL '0'
                     MOVE MIDDATA(XIAOSHU:1) TO MIDNUM
                     PERFORM CHANGE-PHASE
                     MOVE ZHONWEN TO MIDSTR(J:2)
                     ADD 2 TO J
                     MOVE JIAO(2:2) TO MIDSTR(J:2)
      *              ADD 2 TO J
                     ADD 1 TO XIAOSHU
                     IF MIDDATA(XIAOSHU:1) = '0'
                        GO TO  TRANS-XIAOSHU-END
                     END-IF
                     ADD 2 TO J
                     MOVE MIDDATA(XIAOSHU:1) TO MIDNUM
                     PERFORM CHANGE-PHASE
                     MOVE ZHONWEN TO MIDSTR(J:2)
                     ADD 2 TO J
                     MOVE FEN(2:2) TO MIDSTR(J:2)
                END-IF.
       TRANS-XIAOSHU-END.
       COUNT-LENGTH.
            MOVE I TO LEN.
            ADD 1 TO I.
       C-END.
       END-PHASE.
            GOBACK.
      *     EXIT PROGRAM.
       CHANGE-PHASE.
            EVALUATE MIDNUM
               WHEN '1'
                 MOVE YI(2:2) TO ZHONWEN
               WHEN '2'
                 MOVE ER(2:2) TO ZHONWEN
               WHEN '3'
                 MOVE SHAN(2:2) TO ZHONWEN
               WHEN '4'
                 MOVE SHI(2:2) TO ZHONWEN
               WHEN '5'
                 MOVE WU(2:2) TO ZHONWEN
               WHEN '6'
                 MOVE LIU(2:2) TO ZHONWEN
               WHEN '7'
                 MOVE QI(2:2) TO ZHONWEN
               WHEN '8'
                 MOVE BA(2:2) TO ZHONWEN
               WHEN '9'
                 MOVE JIU(2:2) TO ZHONWEN
               WHEN '0'
                 MOVE LING(2:2) TO ZHONWEN
            END-EVALUATE.
       MOVE-AWAY-ZERO.
           MOVE MIDSTR(1:5) TO RSTSTR(1:5).
           IF MIDSTR(6:1) = YI(4:1)
              MOVE ZHENG(2:2) TO RSTSTR(6:2)
              MOVE YI(4:1) TO RSTSTR(8:1)
           ELSE
              MOVE 6 TO K
              MOVE 6 TO L
              PERFORM CHECK-ZERO THRU CHECK-ZERO-END UNTIL K = J
           END-IF.
       MOVE-AWAY-ZERO-END.
       CHECK-ZERO.
           IF MIDSTR(K:2) = LING(2:2)
                PERFORM WRITE-ZERO THRU WRITE-ZERO-END
                UNTIL MIDSTR(K:2) NOT EQUAL LING(2:2)
                IF MIDSTR(K:2) = YI(4:1)
                   MOVE YI(4:1) TO RSTSTR(L:1)
                   GO TO CHECK-ZERO-END
                END-IF

                IF MIDSTR(K:2) = FEN(2:2)
                    SUBTRACT 2 FROM K GIVING PD
                    MOVE MIDSTR(PD:2) TO RSTSTR(L:2)
                    ADD 2 TO L
                    MOVE FEN(2:2) TO RSTSTR(L:2)
                    ADD 2 TO L
                    MOVE YI(4:1) TO RSTSTR(L:1)
                    MOVE J TO K
                    GO TO CHECK-ZERO-END
                END-IF
                MOVE LING(2:2) TO RSTSTR(L:2)
                ADD 2 TO L
                MOVE YI(1:1) TO TMPV(1:1)
                MOVE MIDSTR(K:2) TO TMPV(2:2)
                MOVE YI(4:1) TO TMPV(4:1)
              &n