我们开发SMARTOFMRS经常需要显示字符,有小写字母,大写字母,汉字,还有一些其他字符,收到用户一个BUG,说字符显示不全,我看了一下显示的是大写字母,但是超出了显示范围,我就意识到SMARTFORMS的每种字符的长度是不一样的,然后我就做一个测试程序测试一下看看,如下测试程序
看上图,可知正常显示30个小写字母的长度,只能显示27个数字,22个大写字母,15个中文字符,还有其他特殊字符如“!”就更多了。所以问题就找到了,正常一行显示132个英文字母是没问题的,但是里面夹杂了大写字母,所以就超过了SMARTFORMS的可显示范围,导致字符被截断。
这样的话,我们可以写一个长度转换的代码逻辑,实现效果就是,30个小写字母的可视长度最多可装27个数字,22个大写字母,15个汉字或其他特殊字符。
计算可视范围长度的代码如下,US_STR是输入字符串,US_LEN是输出可视长度
FORM FRM_GETSTRLEN USING US_STR US_LEN.
US_LEN = 0.
DATA LV_SHUZI TYPE CHAR30.
LV_SHUZI = '0123456789'.
DATA LV_DAXIE TYPE CHAR30.
LV_DAXIE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ'.
DATA LV_XIAOX TYPE CHAR30.
LV_XIAOX = 'abcdefghijklmnopqrstuvwxyzäöüß'.
DATA LV_LEN TYPE I.
LV_LEN = STRLEN( US_STR ).
DATA LV_CHAR TYPE CHAR1.
DATA LV_INDEX TYPE I.
LV_INDEX = 0.
WHILE LV_INDEX < LV_LEN.
LV_CHAR = US_STR+LV_INDEX(1).
DATA LEN_VIS TYPE I.
CLEAR LEN_VIS.
CALL FUNCTION 'NLS_VISUAL_CHARLEN' "判断是否是汉字
EXPORTING
STR = LV_CHAR
IMPORTING
LEN_VISUAL = LEN_VIS.
IF LV_SHUZI CS LV_CHAR.
US_LEN = US_LEN + '1.111'.
ELSEIF LV_DAXIE CS LV_CHAR.
US_LEN = US_LEN + '1.364'.
ELSEIF LV_XIAOX CS LV_CHAR.
US_LEN = US_LEN + '1'.
ELSEIF LEN_VIS > 1.
US_LEN = US_LEN + '2'. "汉字占两个长度
ELSE.
US_LEN = US_LEN + '1'.
ENDIF.
LV_INDEX = LV_INDEX + 1.
ENDWHILE.
ENDFORM.
这个只能估算一行可以显示多少字符量,实际使用过程中我们还需要预留多一行的给备用,防止字符串截断。