String 如何格式化数字以显示至少n个小数

String 如何格式化数字以显示至少n个小数,string,decimal,abap,String,Decimal,Abap,是否有一种简单的方法来格式化一个数字,以显示至少n小数?如果可能,使用字符串模板并避免使用代码处理字符串 2个通缉小数的预期结果: 价值(f类) 预期产量 4. 4 0.4 0.40 0.04 0.04 0.004 0.004 0.0004 0.0004 我不太确定单用字符串模板就可以实现这一点,因为您的需求非常特殊。但是,如果在字符串模板中指定小数位数,则可以使用正则表达式截断尾随的零: DATA numbers TYPE STANDARD TABLE OF f. numbers = VALU

是否有一种简单的方法来格式化一个数字,以显示至少n小数?如果可能,使用字符串模板并避免使用代码处理字符串

2个通缉小数的预期结果:

价值(f类) 预期产量 4. 4 0.4 0.40 0.04 0.04 0.004 0.004 0.0004 0.0004
我不太确定单用字符串模板就可以实现这一点,因为您的需求非常特殊。但是,如果在字符串模板中指定小数位数,则可以使用正则表达式截断尾随的零:

DATA numbers TYPE STANDARD TABLE OF f.
numbers = VALUE #(
  ( 4 / 1     )
  ( 4 / 10    )
  ( 4 / 100   )
  ( 4 / 1000  )
  ( 4 / 10000 )
).

LOOP AT numbers INTO DATA(number).
  DATA(formatted) = replace(
    val = |{ number DECIMALS = 4 }|
    regex = '0{1,2}\z'
    with = ''
  ).

  WRITE formatted. NEW-LINE.
ENDLOOP.
一些评论:

  • 匹配字符串的结尾
  • DECIMALS=4
    是基于示例的任意选择,您可能希望在那里选择一个较大的数字,然后调整正则表达式以匹配
    0{1,N-2}
    0
  • 在一个非常新的系统中,您可能想看看新的

这里有一个快速的单行字符串模板供您使用:

|{ <number> DECIMALS = COND #( WHEN <number> >= '0.01' THEN 2 ELSE strlen( substring_after( val = CONV string( <number> ) sub = '.' ) ) ) }|.
{DECIMALS=COND#(当>='0.01'时,然后是2个ELSE strlen(在(val=CONV string()sub='))之后的子字符串)}。
此处的小数位数是根据输入的数字动态计算的

DATA: decimal TYPE TABLE OF decfloat16.

APPEND 4 TO decimal.
APPEND '0.4' TO decimal.
APPEND '0.04' TO decimal.
APPEND '0.004' TO decimal.
APPEND '0.0004' TO decimal.

LOOP AT decimal ASSIGNING FIELD-SYMBOL(<dec>).
 WRITE |{ <dec> DECIMALS = COND #( WHEN <dec> >= '0.01' THEN 2 ELSE strlen( substring_after( val = CONV string( <dec> ) sub = '.' ) ) ) }|.
ENDLOOP.
数据:十进制类型的decfloat16表。
在小数点后加上4。
将“0.4”追加到十进制。
将“0.04”追加到小数点后。
将“0.004”追加到小数点后。
将“0.0004”追加到小数点后。
在十进制赋值字段-SYMBOL()处循环。
写|{DECIMALS=COND#(当>='0.01'时,然后写2个ELSE strlen(在(val=CONV string()sub='.'))之后的子字符串)}。
结束循环。

优雅的解决方案,谢谢。