请高手给发一个把 小写的金额转成大写金额的程式,非常感谢
如:小写金额为 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 |