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

How to format a number to show at least n decimals

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

2 位小数的预期结果:

Value (type f) Expected output
4 4.00
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.

一些评论:

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

这是一个快速的单行字符串模板:

|{ <number> DECIMALS = COND #( WHEN <number> >= '0.01' THEN 2 ELSE strlen( substring_after( val = CONV string( <number> ) 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.