ABAP 之将金额数据输出为中文/英文

举报
百里丶落云 发表于 2023/08/29 10:58:44 2023/08/29
【摘要】 序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

结果展示

选择屏幕输入内容

image.png

输出中文

image.png

输出英文

image.png

技术总结

今天讲述的内容是,如将金额数据输出为大写的中文及对应的英文doller ,是一个不错的工能,在财务中开票中肯定会用的到,拿来实际案例即可直接使用就好.

百里鸡汤

I am a slow walker, but I never walk backwards .

这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.

wallhaven-jx5ezq.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。