如何格式化数字以显示至少 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.
是否有一种简单的方法来格式化数字以显示 至少 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.