ABAP 之将金额数据输出为中文/英文
【摘要】 序HELLO,这里是百里,一个学习中的ABAPER, 最近接收了这么一个奇怪的需求,没错,就是将金额输出为英文并且打印出来.当我听到这个时候蒙圈,ABAP又不是NLP,那种人工智能,你还想给你翻译成英文.开玩笑呢?经过后来多方面的查询, 唉还, 没想到还真有. 为什么会用到输出中文/英文后来了解到,在财务这块,开票及对外贸易都得需要显示对应的数字才可以,就像中文的大写的壹弍叁肆这种,需要写...
序
HELLO,这里是百里,一个学习中的ABAPER, 最近接收了这么一个奇怪的需求,没错,就是将金额输出为英文并且打印出来.当我听到这个时候蒙圈,ABAP又不是NLP,那种人工智能,你还想给你翻译成英文.开玩笑呢?经过后来多方面的查询, 唉还, 没想到还真有.
为什么会用到输出中文/英文
后来了解到,在财务这块,开票及对外贸易都得需要显示对应的数字才可以,就像中文的大写的壹弍叁肆这种,需要写在发票中,才算开发票,但是我们系统中大部分数据都是以阿拉伯数字,即1,2,3,4这种显示的.想起了武林外传的更,这个玉宝石1个哦,就因为在阿拉伯数字上加了点.所以说这是个必要且实用的工能.
语法解析
通过调用函数 SPELL_AMOUNT
我们就可以进行数字转换,将我们对应的数字类型输出为中文或者英文内容.
CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
amount = l_amt
currency = l_waers
filler = ''
language = 'E'
IMPORTING
in_words = lw_spell.
lw_spell-decimal = lw_spell-decimal / 10.
IF NOT lw_spell-decimal IS INITIAL.
实例解析
我们通过前台输入一串数字后,通过调用子例程,设定输出为中文/英文.
数据准备
DATA:g_money(100) TYPE c.
DATA:money_str(33).
DATA:i TYPE i.
DATA:units_off TYPE i,
curnt_off TYPE i.
DATA:lastd TYPE n,curntd TYPE n.
DATA:cword(2),weight(2).
DATA:units(30) VALUE '分角元拾佰仟万拾佰仟亿拾佰仟万',
digts(20) VALUE '零壹贰叁肆伍陆柒捌玖'.
DATA:g_total_value
TYPE string.
选择屏幕设定
SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE TEXT-001.
PARAMETERS: p_dmbtr TYPE bf_dmbtr OBLIGATORY DEFAULT '1'.
SELECTION-SCREEN END OF BLOCK xavery.
*单选按钮
SELECTION-SCREEN BEGIN OF BLOCK xue WITH FRAME TITLE TEXT-002.
PARAMETERS:p_rd1 RADIOBUTTON GROUP asia USER-COMMAND dis DEFAULT 'X', "功能 "中文
p_rd2 RADIOBUTTON GROUP asia. "配置 "英文
SELECTION-SCREEN END OF BLOCK xue.
中文子例程
FORM sub_unicode_version .
IF p_dmbtr = 0.
g_money = '零'.
EXIT.
ENDIF.
money_str = p_dmbtr.
CONDENSE money_str NO-GAPS.
IF money_str CN '0123456789. '.
RAISE wrong_money.
ENDIF.
IF money_str CS '.'.
i = sy-fdpos + 1.
money_str+sy-fdpos = money_str+i.
ENDIF.
CONDENSE money_str NO-GAPS.
lastd = 0.
curnt_off = strlen( money_str ) - 1.
WHILE curnt_off >= 0.
curntd = money_str+curnt_off(1).
i = curntd.
cword = digts+i(1).
weight = units+units_off(1).
i = units_off / 1.
IF curntd = 0.
IF i = 2 OR i = 6 OR i = 10.
CLEAR:cword.
IF curnt_off = 0.
CLEAR:weight.
ENDIF.
ELSEIF lastd = 0.
CLEAR:cword,weight.
ELSE.
CLEAR:weight.
ENDIF.
ENDIF.
CONCATENATE cword weight g_money INTO g_money.
lastd = curntd.
SUBTRACT 1 FROM curnt_off.
ADD 1 TO units_off.
ENDWHILE.
IF g_money NS '分'.
CONCATENATE g_money '整' INTO g_money.
ELSE.
cword = g_money.
IF cword = '零'.
SHIFT g_money BY 1 PLACES.
ENDIF.
ENDIF.
g_money = '中文' && ':' && g_money.
ENDFORM. " SUB_UNICODE_VERSION
*&---------------------------------------------------------------------
**& Form SUB_WRITE_TO_SCREEN
*&---------------------------------------------------------------------
FORM sub_write_to_screen .
IF p_rd1 = 'X'.
WRITE g_money.
ELSEIF p_rd2 = 'X'.
WRITE g_total_value.
ENDIF.
ENDFORM. " SUB_WRITE_TO_SCREEN
英文子例程
FORM amount_to_word USING l_amt TYPE bf_dmbtr
l_waers TYPE eban-waers
CHANGING saywords TYPE string.
DATA: lw_spell LIKE spell,
lv_text TYPE ltext,
lv_cent TYPE spell.
SELECT SINGLE ktext INTO lv_text
FROM tcurt
WHERE spras = 'E' AND
waers = l_waers.
TRANSLATE lv_text TO UPPER CASE.
CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
amount = l_amt
currency = l_waers
filler = ''
language = 'E'
IMPORTING
in_words = lw_spell.
lw_spell-decimal = lw_spell-decimal / 10.
IF NOT lw_spell-decimal IS INITIAL.
CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
amount = lw_spell-decimal
filler = ''
language = 'E'
IMPORTING
in_words = lv_cent.
ENDIF.
CLEAR saywords.
IF NOT lv_cent-word IS INITIAL.
CONCATENATE lw_spell-word lv_cent-word
INTO saywords SEPARATED BY ','.
ELSE.
saywords = '英文' && ':' && lw_spell-word .
ENDIF.
ENDFORM. "amount_to_word
结果展示
选择屏幕输入内容
输出中文
输出英文
技术总结
今天讲述的内容是,如将金额数据输出为大写的中文及对应的英文doller ,是一个不错的工能,在财务中开票中肯定会用的到,拿来实际案例即可直接使用就好.
百里鸡汤
I am a slow walker, but I never walk backwards .
这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)