请高手给发一个把 小写的金额转成大写金额的程式,非常感谢
如:小写金额为 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)
MOVE MIDSTR(K:2) TO RSTSTR(L:2)
ADD 2 TO K
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)
MOVE MIDSTR(K:2) TO RSTSTR(L:2)
ADD 2 TO K
ADD 2 TO L
IF MIDSTR(K:2) = YI(4:1) AND TMPV(2:2) = YUAN(2:2)
MOVE ZHENG(2:2) TO RSTSTR(L:2)
ADD 2 TO L
MOVE YI(4:1) TO RSTSTR(L:1)
GO TO CHECK-ZERO-END
ELSE
E90631 MOVE YI(4:1) TO RSTSTR(L:1)
END-IF
ELSE
IF MIDSTR(K:1) = YI(4:1)
MOVE YI(4:1) TO RSTSTR(L:1)
GO TO CHECK-ZERO-END
END-IF
MOVE MIDSTR(K:2) TO RSTSTR(L:2)
ADD 2 TO K
ADD 2 TO L
MOVE MIDSTR(K:2) TO RSTSTR(L:2)
IF MIDSTR(K:2) = YUAN(2:2) AND MIDDATA(XSHU:2) = '00'
ADD 2 TO L
MOVE ZHENG(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
IF MIDSTR(K:2) = FEN(2:2)
ADD 2 TO L
MOVE YI(4:1) TO RSTSTR(L:1)
MOVE J TO K
GO TO CHECK-ZERO-END
END-IF
ADD 2 TO K
ADD 2 TO L
IF MIDSTR(K:1) = YI(4:1)
MOVE YI(4:1) TO RSTSTR(L:1)
GO TO CHECK-ZERO-END
END-IF
END-IF.
CHECK-ZERO-END.
WRITE-ZERO.
SUBTRACT 2 FROM K GIVING PP.
ADD 2, K GIVING PM.
IF MIDSTR(PP:2) = SI(2:2) AND MIDSTR(PM:2) = YUAN(2:2)
MOVE YUAN(2:2) TO RSTSTR(L:2)
ADD 2 TO L
IF MIDDATA(XSHU:2) = '00'
MOVE ZHENG(2:2) TO RSTSTR(L:2)
ADD 2 TO L
END-IF
END-IF.
IF MIDSTR(PP:2) = SI(2:2) AND MIDSTR(PM:2) = WAN(2:2)
MOVE WAN(2:2) TO RSTSTR(L:2)
ADD 2 TO L
END-IF.
ADD 4 TO K.
WRITE-ZERO-END.
wyvern050 回复于:2007-01-08 16:17:45
和你说下算法 你就能弄出来了
首先你要先把现有的数字截位
eg: 5678 首先要把5取出 判断其位置是 十位 百位 还是 千位 怎么判断千百十呢 取出5之后用原来的值除以取出来的5 得出的结构肯定是大于等于1000 小于10000的 这样就把除以之后的结果给为1000 tab 这样建立
zhi weishu
10 十
100 百
1000 千
。。。 。。。
用这个结果chain db 取值
然后用5去查找库 在库中应该这样写出tab
alb hanzi
0 零
1 壹
。。。 。。。
然后用5去chain 这个tab 取出hanzi 段的值 给一个中间变量 在把上面取出的位置 例如 千 (这个千取值方法和取hanzi一样) 如此类推 最后程序结束怎们判断就不用我说了
-----------------------------------------------------------------------------
其实这个算法很简单 估计是楼主一时没想到吧
sater84 回复于:2007-01-09 09:40:59
谢谢前辈,我明白您的意思了,谢谢您,我去试一试先~
uglyneo 回复于:2007-03-22 09:23:33
不知道你有没有完成。最近才上论坛,看到这个觉得有点意思。闲来没事,就试了下。
一个汉字在400里面占用4个字节,第一个字节表示汉字开始,第二第三个字节表示该汉字,第四个字节表示汉字结束。
所以我自己写了个程序,希望对你有所帮助。(RPG3)
小写金额 14P 2
实现功能:输入小写金额:10010.11 大写金额“壹零壹十元壹角壹分”(这个零我是揣摸别人读数字时的习惯,所以不是正规的大写写法,关于这个习惯,N多人有N多种读法,本想改为大写写法,可我确实不知是不是应该写成“壹万零仟零百壹拾零元壹角一分”)
没有从LF READ,而是选择屏幕输入输出,相信改成READ 也比较简单。
写完没经过严密测试,可能会有不少BUG,欢迎指出。
显示文件(XZD010W)很简单,就一个小写金额字段:W1XX 14Y 2 大写金额字段:W1DX 58O
0000.30 A DSPSIZ(24 80 *DS3)
0000.31 A CF01
0000.40 A R XZD010W1
0000.60 A 3 31' 小写金额转大写金额 '
0000.70 A DSPATR(RI)
0000.80 A 9 11' 请输入小写金额: '
0000.90 A W1XX 14Y 2B 9 30EDTCDE(1)
0001.00 A R XZD010W2
0001.20 A 3 31' 小写金额转大写金额 '
0001.30 A DSPATR(RI)
0001.40 A 9 3' 请输入小写金额: '
0001.50 A W1XX 14Y 2O 9 22EDTCDE(1)
0001.60 A 12 9' 大写金额: '
0001.70 A W1DX 58O O 12 22DSPATR(UL)
程序(XZD010)
FXZD010W CF E WORKSTN
F*------------------------------------------
E TTT 1 9 4
E TAB1 1 10 1 0 TAB2 4
E*----------------------------------------------------
I DS
I 1 4 HZ
I 1 1 HB
I 2 3 HH
I 4 4 HE
I DS
I 1 40SR
I 1 10QIAN
I 2 20BAI
I 3 30SHI
I 4 40GE
I DS
I 1 142W1XX
I 1 40YD
I 5 80WD
I 9 120GD
I 13 140FD
I 1 10QY
I 2 20BY
I 3 30SY
I 4 40Y
I 5 50QW
I 6 60BW
I 7 70SW
I 8 80W
I 9 90Q
I 10 100B
I 11 110S
I 12 120G
I 13 130J
I 14 140F
I*-----------------------------------------------------
C MOVEL*BLANK W1XX
C STEP01 TAG
C EXFMTXZD010W1
C KA GOTO END
C MOVEL*BLANK W1DX
C W1XX IFEQ 0
C 0 LOKUPTAB1 TAB2 90
C MOVELTAB2 HZ
C MOVELHB W1DX
C CAT HH:0 W1DX
C MOVELTTT,3 HZ
C CAT HH:0 W1DX
C MOVELTTT,9 HZ
C CAT HH:0 W1DX
C CAT HE:0 W1DX
C GOTO STEP03
C ENDIF
C MOVELTTT,3 HZ
C MOVELHB W1DX
C YD CABEQ0 70
C WD CABEQ0 60
C GD CABEQ0 50
C N70 DO
C Z-ADDYD SR
C EXSR XZD
C MOVELTTT,8 HZ
C CAT HH:0 W1DX
C ENDDO
C N60 DO
C Z-ADDWD SR
C EXSR XZD
C MOVELTTT,7 HZ
C CAT HH:0 W1DX
C ENDDO
C N50 DO
C Z-ADDGD SR
C EXSR XZD
C ENDDO
C *IN50 IFEQ '0'
C *IN60 OREQ '0'
C *IN70 OREQ '0'
C MOVELTTT,3 HZ
C CAT HH:0 W1DX
C ENDIF
C FD IFEQ 0
C MOVELTTT,9 HZ
C CAT HH:0 W1DX
C ENDIF
C J CABEQ0 TAGF
C J LOKUPTAB1 TAB2 90
C 90 MOVELTAB2 HZ
C CAT HH:0 W1DX
C MOVELTTT,2 HZ
C CAT HH:0 W1DX
C TAGF TAG
C F CABEQ0 STEP02
C F LOKUPTAB1 TAB2 90
C MOVELTAB2 HZ
C CAT HH:0 W1DX
C MOVELTTT,1 HZ
C CAT HH:0 W1DX
C STEP02 TAG
C CAT HE:0 W1DX
C STEP03 TAG
C EXFMTXZD010W2
C GOTO STEP01
C END TAG
C SETON LR
C RETRN
C*-------------------------------------------------------
C XZD BEGSR
C QIAN CABNE0 51
C BAI CABNE0 52
C SHI CABNE0 53
C GE CABNE0 54
C SR IFEQ GD
C YD IFNE 0
C WD ORNE 0
C N51 DO
C QIAN LOKUPTAB1 TAB2 90
C MOVELTAB2 HZ
C CAT HH:0 W1DX
C GOTO TAGB
C ENDDO
C ENDIF
C ENDIF
C N51 GOTO TAGB
C QIAN LOKUPTAB1 TAB2 90
C MOVELTAB2 HZ
C CAT HH:0 W1DX
C MOVELTTT,6 HZ
C CAT HH:0 W1DX
C TAGB TAG
C N52N53N54 GOTO XZDEND
C N51N52 GOTO TAGS
C BAI LOKUPTAB1 TAB2 90
C MOVELTAB2 HZ
C CAT HH:0 W1DX
C N52 GOTO TAGS
C MOVELTTT,5 HZ
C CAT HH:0 W1DX
C TAGS TAG
C N53N54 GOTO XZDEND
C N52N53 GOTO TAGG
C SHI LOKUPTAB1 TAB2 90
C MOVELTAB2 HZ
C CAT HH:0 W1DX
C N53 GOTO TAGG
C MOVELTTT,4 HZ
C CAT HH:0 W1DX
C TAGG TAG
C N54 GOTO XZDEND
C GE LOKUPTAB1 TAB2 90
C MOVELTAB2 HZ
C CAT HH:0 W1DX
C XZDEND ENDSR
** TTT
分
角
元
拾
佰
仟
万
亿
整
** TAB1 TAB2
0 零
1 壹
2 贰
3 叁
4 肆
5 伍
6 陆
7 柒
8 捌
9 玖
[ 本帖最后由 uglyneo 于 2007-3-22 11:06 编辑 ]
XZD010.rar
pantierui 回复于:2007-03-22 09:44:32
顶一下.
icefirer 回复于:2007-03-22 11:55:31
你可以借鉴一下
*=====================================================================
*
D yMsgRtnDDS E DS EXTNAME( CMMsgStrPZ )
D PREFIX ( y :1 )
D BASED ( iMsgRtnPtr )
*
*=====================================================================
*
D wDigDim S 1A DIM(18)
*
*---------------------------------------------------------------------
? 中文数字
*---------------------------------------------------------------------
*
D wChnChaNbr S 40A INZ(X'-
D 0E51840F0E59BB0F0E4C410F0E54FD0F-
D 0E56610F0E57E80F0E51BC0F0E53E10F-
D 0E48C50F0E4FC00F')
*
D wChnDim S 4A DIM(10)
*---------------------------------------------------------------------
? 中文单位
*---------------------------------------------------------------------
D wChnChaUnt S 72A INZ(X'-
D 0E4C760F0E4F670F0E5AB10F0E55AF0F-
D 0E48DA0F0E544A0F0E57930F0E55AF0F-
D 0E48DA0F0E544A0F0E59D90F0E55AF0F-
D 0E48DA0F0E544A0F0E57930F0E55AF0F-
D 0E48DA0F0E544A0F')
*
D wUntDim S 4A DIM(18)
*
*=====================================================================
*
D wSfxTst S 8A
*
*=====================================================================
*
D wInpDigAmt S 18S 0
D wOutChrAmt S 200A
*
D wInpLen S 2S 0
D wRpcLen S 2S 0
D wRpcPos S 3S 0
*
D X S 2S 0
D Y S 1S 0
D Z S 1S 0
*
*---------------------------------------------------------------------
? 中文字符
*---------------------------------------------------------------------
*
D wLinLin S 8A INZ('零零')
D wLinYuan S 8A INZ('零圆')
D wLinWan S 8A INZ('零万')
D wLinYi S 8A INZ('零亿')
D wJiaoLin S 8A INZ('角零')
D wJZ S 8A INZ('角整')
D wYuanLin S 8A INZ('圆零')
D wYZ S 8A INZ('圆整')
D wYiWan S 8A INZ('亿万')
*
D wLin S 4A INZ('零')
D wYuan S 4A INZ('圆')
D wWan S 4A INZ('万')
D wYi S 4A INZ('亿')
*
*=====================================================================
*
*
*
C EXSR #InParm
*
C EXSR #Main
*
C EXSR #OutParm
*
C EVAL *INLR = *ON
C RETURN
*
*
*
CSR #Main BEGSR
*---------------------------------------------------------------------
? 检查输入
*---------------------------------------------------------------------
C ' 0123456789' CHECK xInpDigAmt 90
*
C IF *IN90 = *ON
C EVAL yMsgRtnCod = 'FI30671'
C EXSR #ErrRtn
C ENDIF
*
C MOVE xInpDigAmt wInpDigAmt
*
C SELECT
C WHEN wInpDigAmt = *ZERO
C EVAL zOutChrAmt = '零圆整'
* EXSR #ErrRtn
C ENDSL
*
C EXSR #IniChnInf
CSR ENDSR
*
*
*
CSR #IniChnInf BEGSR
*---------------------------------------------------------------------
? 初始化中文信息
*---------------------------------------------------------------------
C EVAL wInpLen = %LEN(%TRIM(
C %CHAR(wInpDigAmt)))
*
C MOVEA wChnChaNbr wChnDim
C MOVEA wChnChaUnt wUntDim
*
C MOVEA xInpDigAmt wDigDim
*
C 1 DO wInpLen X
C EVAL Z = %DEC(wDigDim(18 - X + 1):1:0)
C SELECT
*---------------------------------------------------------------------
?该位为零,为一般位
*---------------------------------------------------------------------
C WHEN Z = 0 AND
C X <> 3 AND
C X <> 7 AND
C X <> 11 AND
C X <> 15
C EVAL wOutChrAmt = wChnDim(Z + 1)
C + %TRIM(wOutChrAmt)
*---------------------------------------------------------------------
?该位为零,为敏感位,要添零
*---------------------------------------------------------------------
C WHEN Z = 0 AND
C (X = 3 OR
C X = 7 OR
C X = 11 OR
C X = 15)
C EVAL wOutChrAmt = wUntDim(X)
C + wChnDim(Z + 1)
C + %TRIM(wOutChrAmt)
*---------------------------------------------------------------------
?该位不为零
*---------------------------------------------------------------------
C WHEN Z <> 0
C EVAL wOutChrAmt = wChnDim(Z + 1)
C + wUntDim(X)
C + %TRIM(wOutChrAmt)
C ENDSL
C ENDDO
*
C EXSR #ChgSpcInf
CSR ENDSR
*
*
*
CSR #ChgSpcInf BEGSR
*---------------------------------------------------------------------
?转换特殊情况
*---------------------------------------------------------------------
*
*---------------------------------------------------------------------
?零零->零
*---------------------------------------------------------------------
C EVAL wRpcPos = %SCAN(wLinLin:wOutChrAmt)
C EVAL wRpcLen = %SIZE(wLinLin)
*
C DOW wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wLin:wOutChrAmt :
C wRpcPos:wRpcLen)
C EVAL wRpcPos = %SCAN(wLinLin:wOutChrAmt)
C ENDDO
*---------------------------------------------------------------------
?零圆->圆
*---------------------------------------------------------------------
C EVAL wRpcPos = %SCAN(wLinYuan:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wYuan:wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
*---------------------------------------------------------------------
?零万->零
*---------------------------------------------------------------------
C EVAL wRpcPos = %SCAN(wLinWan:wOutChrAmt)
C DOW wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wWan:wOutChrAmt :
C wRpcPos:wRpcLen)
C EVAL wRpcPos = %SCAN(wLinWan:wOutChrAmt)
C ENDDO
*---------------------------------------------------------------------
?零亿->亿
*---------------------------------------------------------------------
C EVAL wRpcPos = %SCAN(wLinYi:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wYi:wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
*---------------------------------------------------------------------
?角零->角整
*---------------------------------------------------------------------
C EVAL wRpcPos = %SCAN(wJiaoLin:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wJZ :wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
*---------------------------------------------------------------------
?圆零->圆整
*---------------------------------------------------------------------
C EVALR wSfxTst = %TRIM(wOutChrAmt)
C IF wSfxTst = wYuanLin
C EVALR wOutChrAmt = %TRIM(wOutChrAmt)
C MOVE wYZ wOutChrAmt
C EVAL wOutChrAmt = %TRIM(wOutChrAmt)
C ENDIF
*---------------------------------------------------------------------
?亿万->亿
*---------------------------------------------------------------------
C EVAL wRpcPos = %SCAN(wYiWan:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wYi:wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
*---------------------------------------------------------------------
?去除0F0E
*---------------------------------------------------------------------
C EVAL wRpcPos = %SCAN(X'0F0E':wOutChrAmt)
C DOW wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE('' :wOutChrAmt:
C wRpcPos:2)
C EVAL wRpcPos = %SCAN(X'0F0E':wOutChrAmt)
C ENDDO
CSR ENDSR
*
*
*
CSR #ErrRtn BEGSR
C EVAL *INLR = *ON
C RETURN
CSR ENDSR
*
*
*
CSR #OutParm BEGSR
C EVAL zOutChrAmt = wOutChrAmt
CSR ENDSR
*
*
*
CSR #InParm BEGSR
C EVAL yMsgRtnCod = 'SUC9999'
CSR ENDSR
qingzhou 回复于:2007-03-22 12:39:23
存档备查.
wnai 回复于:2007-03-22 13:23:47
RPGLE代码中咋写中文啊?
俺试了试,键盘就锁住了,DSPF中倒是没问题
uglyneo 回复于:2007-03-23 08:11:39
建立SRCPF时,按F9,将该选项改为*YES
User specified DBCS data . . . . *YES *NO, *YES
wnai 回复于:2007-03-23 12:57:13
谢谢楼上的!
sater84 回复于:2009-05-18 15:35:23
好久没来了,今天上来看了一下,发现我以前发的这个帖子在众多大侠的指导留言下竟然加精了,谢谢各位大侠们的帮助~~~
那个问题我已经解决了,我也把我写的代码发上来,大家一起讨论讨论~
H 1
E AA 36 4
E BB 36 2
E TAB01 1 9 1 0 TAB01X 4
E TAB02 1 3 1 0 TAB02X 4
* NVLU 原数值
* RM 余数
* LV 10除的阶数
* CT ARRAY 指标
C *ENTRY PLIST
C PARM NVLU 100
C PARM BD1 60
C CLEARAA
C Z-ADD0 RM 10
C Z-ADD0 LV 10
C Z-ADD0 LVQ 20
C Z-ADD1 CT 30
C Z-ADD0 LS 20
C Z-ADD0 CT0 10
C MOVE ' 整 ' AA,CT
C MOVE *BLANK BD1
C NVLU DOWNE0
C NVLU DIV 10 NVLU
C MVR RM
C ADD 1 LS
C LS DIV 4 LVQ
C MVR LV
*
C RM IFNE 0
C LV IFEQ 1
C EXSR FLV
C ELSE
C LV LOKUPTAB02 TAB02X 41
C 41 ADD 1 CT
C 41 MOVE TAB02X AA,CT
C END
*
C RM LOKUPTAB01 TAB01X 41
C 41 ADD 1 CT
C 41 MOVE TAB01X AA,CT
C ELSE
C LV IFEQ 1
C EXSR FLV
C END
C 62 ADD 1 CT0
C END
C END
C Z-ADDCT CJC 20
C DO CT N 20
C MOVE *BLANK BC 3
C MOVE AA,N BC
C MOVELBC BB,CJC
C SUB 1 CJC
C* 'AA' DSPLY AA,N
C END
C MOVEABB BD 78
C BD IFNE *BLANK
C MOVEL' ' IT0E 1 (这个" "是耳朵)
C MOVE ' ' IT0F 1
C MOVELIT0E BD1
C BD1 CAT BD:0 BD1
C BD1 CAT IT0F:0 BD1
C ENDIF
C SETON LR
*
CSR FLV BEGSR
C ADD 1 CT
C SELEC
C LVQ WHEQ 0
C MOVE ' 元' AA,CT
C LVQ WHEQ 1
C MOVE ' 万 ' AA,CT
C SETON 62
C LVQ WHEQ 2
C CT0 COMP 4 61
C 61 SUB 1 CT
C MOVE ' 亿 ' AA,CT
C ENDSL
C ENDSR
*
**
1 壹
2 贰
3 叁
4 肆
5 伍
6 陆
7 柒
8 捌
9 玖
**
2 拾
3 佰
0 仟
以上!!!
再次谢谢大侠们,谢谢~~~ :-)
afeng8848 回复于:2009-05-22 00:42:21
耳朵这个词,乃是CPT一脉相承的说法哦!我也发一个当时看了这个帖子后参考其中的一个代码改的程序,因为当时运行发现不能完全正确,就改了改,供各位参考:
H DATEDIT(*YMD) OPTION(*SRCSTMT:*NODEBUGIO)
*=====================================================================
D wDigDim S 1A DIM(18)
*---------------------------------------------------------------------
*中文数字
*---------------------------------------------------------------------
D wChnChaNbr S 40A INZ(X'-
D 0E51840F0E59BB0F0E4C410F0E54FD0F-
D 0E56610F0E57E80F0E51BC0F0E53E10F-
D 0E48C50F0E4FC00F')
*
D wChnDim S 4A DIM(10)
*---------------------------------------------------------------------
*中文单位
*---------------------------------------------------------------------
D wChnChaUnt S 72A INZ(X'-
D 0E4C760F0E4F670F0E5AB10F0E55AF0F-
D 0E48DA0F0E544A0F0E57930F0E55AF0F-
D 0E48DA0F0E544A0F0E59D90F0E55AF0F-
D 0E48DA0F0E544A0F0E57930F0E55AF0F-
D 0E48DA0F0E544A0F')
*
D wUntDim S 4A DIM(18)
*=====================================================================
D wSfxTst S 8A
D yMsgRtnCod S 10A
*=====================================================================
D wInpDigAmt S 18S 0
D wOutChrAmt S 200A
*
D wInpLen S 2S 0
D wRpcLen S 2S 0
D wRpcPos S 3S 0
*
D X S 2S 0
D Y S 1S 0
D Z S 1S 0
*---------------------------------------------------------------------
*中文字符
*---------------------------------------------------------------------
D wLinLin S 8A INZ('零零')
D wLinYuan S 8A INZ('零圆')
D wLinWan S 8A INZ('零万')
D wLinYi S 8A INZ('零亿')
D wJiaoLin S 8A INZ('角零')
D wJZ S 8A INZ('角整')
D wYuanLin S 8A INZ('圆零')
D wYZ S 8A INZ('圆整')
D wYiWan S 8A INZ('亿万')
*
D wLin S 4A INZ('零')
D wYuan S 4A INZ('圆')
D wWan S 4A INZ('万')
D wYi S 4A INZ('亿')
C*
C *ENTRY PLIST
C PARM xInpDigAmt 18
C PARM zOutChrAmt 50
C* MOVE '1001010000' xInpDigAmt 18
C* MOVE ' ' zOutChrAmt 50
*=====================================================================
C EXSR #InParm
*
C EXSR #Main
*
C EXSR #OutParm
*
C EVAL *INLR = *ON
C RETURN
*=====================================================================
CSR #Main BEGSR
C*检查输入
C ' 0123456789' CHECK xInpDigAmt 90
C IF *IN90 = *ON
C EVAL yMsgRtnCod = 'FI30671'
C EXSR #ErrRtn
C ENDIF
C*
C MOVE xInpDigAmt wInpDigAmt
C*
C SELECT
C WHEN wInpDigAmt = *ZERO
C EVAL zOutChrAmt = '零圆整'
C ENDSL
C*
C EXSR #IniChnInf
CSR ENDSR
C*===================================================================
CSR #IniChnInf BEGSR
C*初始化中文信息
C EVAL wInpLen = %LEN(%TRIM(
C %CHAR(wInpDigAmt)))
C MOVEA wChnChaNbr wChnDim
C MOVEA wChnChaUnt wUntDim
C*
C MOVEA xInpDigAmt wDigDim
C 1 DO wInpLen X
C EVAL Z=%DEC(wDigDim(18 - X + 1):1:0)
C SELECT
C*该位为零,为一般位
C WHEN Z= 0 AND
C X<>3 AND
C X<>7 AND
C X<>11 AND
C X<>15
C EVAL wOutChrAmt = wChnDim(Z + 1)
C + %TRIM(wOutChrAmt)
C*该位为零,为敏感位,要添零
C WHEN Z=0 AND
C (X=3 OR
C X=7 OR
C X=11 OR
C X=15)
C EVAL wOutChrAmt=wUntDim(X)
C + wChnDim(Z + 1)
C + %TRIM(wOutChrAmt)
C*该位不为零
C WHEN Z<>0
C EVAL wOutChrAmt = wChnDim(Z + 1)
C + wUntDim(X)
C + %TRIM(wOutChrAmt)
C ENDSL
C ENDDO
C*
C EXSR #ChgSpcInf
CSR ENDSR
C*===============================================================
CSR #ChgSpcInf BEGSR
C*转换特殊情况
C*零零->零
C EVAL wRpcPos = %SCAN(wLinLin:wOutChrAmt)
C EVAL wRpcLen = %SIZE(wLinLin)
C*
C DOW wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wLin:wOutChrAmt:
C wRpcPos:wRpcLen)
C EVAL wRpcPos = %SCAN(wLinLin:wOutChrAmt)
C ENDDO
C*零圆->圆
C EVAL wRpcPos = %SCAN(wLinYuan:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wYuan:wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
C*零万->零
C EVAL wRpcPos = %SCAN(wLinWan:wOutChrAmt)
C DOW wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wWan:wOutChrAmt:
C wRpcPos:wRpcLen)
C EVAL wRpcPos = %SCAN(wLinWan:wOutChrAmt)
C ENDDO
C*零亿->亿
C EVAL wRpcPos = %SCAN(wLinYi:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wYi:wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
C*角零->角整
C EVAL wRpcPos = %SCAN(wJiaoLin:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wJZ:wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
C*圆零->圆整
C EVALR wSfxTst = %TRIM(wOutChrAmt)
C IF wSfxTst = wYuanLin
C EVALR wOutChrAmt = %TRIM(wOutChrAmt)
C MOVE wYZ wOutChrAmt
C EVAL wOutChrAmt = %TRIM(wOutChrAmt)
C ENDIF
C*亿万->亿
C EVAL wRpcPos = %SCAN(wYiWan:wOutChrAmt)
C IF wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE(wYi:wOutChrAmt:
C wRpcPos:wRpcLen)
C ENDIF
C*去除0F0E
C EVAL wRpcPos = %SCAN(X'0F0E':wOutChrAmt)
C DOW wRpcPos > *ZERO
C EVAL wOutChrAmt = %REPLACE('' :wOutChrAmt:
C wRpcPos:2)
C EVAL wRpcPos = %SCAN(X'0F0E':wOutChrAmt)
C ENDDO
CSR ENDSR
C*=============================================================
CSR #ErrRtn BEGSR
C EVAL *INLR = *ON
C RETURN
CSR ENDSR
C*=============================================================
CSR #OutParm BEGSR
C EVAL zOutChrAmt = wOutChrAmt
CSR ENDSR
C*=============================================================
CSR #InParm BEGSR
C EVAL yMsgRtnCod = 'SUC9999'
CSR ENDSR
tibcoo 回复于:2009-05-26 17:33:53
RPG IV教程第六章不就有这个例题?
|