如何在 Smalltalk/Pharo 中打印固定字符数的数字
How to print a number with number of fixed characters in Smalltalk/Pharo
实际任务:我想以人类可读的格式打印(我自己实现的)矩阵。作为先决条件,我想我需要能够指定 "fit the number representation into X characters"。我在 Float
和 Integer
class 中找到 #printShowingDecimalPlaces:
和 #printPaddedWith:to:
(第一种方法更通用 Number
class) .它们单独工作,但前者仅对小数部分起作用,而后者对小数部分之前的部分起作用,例如:
10.3 printPaddedWith: Character space to: 5.
"' 10.3'"
-10.3 printPaddedWith: Character space to: 5.
"' -10.3'"
10.3 printShowingDecimalPlaces: 3.
"'10.300'"
此外,他们对科学形式的非常大(或同样小的数字)的作用并不理想:
12.3e9 printShowingDecimalPlaces: 3.
"'12300000000.000'"
12.3e9 printPaddedWith: Character space to: 5.
"' 1.23e10'"
所以,我想要像 Common Lisp 的 (FORMAT T "~10g" 12.3d9)
或 C 的 printf("%10g", 12.3e9)
这样的东西,(a) 将整个宽度限制为 10 个字符,并且 (b) 根据数量的大小。 Pharo中有这样的东西吗?
对于多种打印选项,我建议从加载 NumberPrinter 包
http://ss3.gemstone.com/ss/NumberPrinter/
(FloatPrinter fixed) digitCount: 2; print: 10.3.
-> '10.30'
虽然我没有在最近的 Pharo 版本中尝试过。
编辑:
啊,但是我没有看到处理 3 的指数倍数的格式,也许你必须为这种格式创建一个子类。
编辑:
或者我误解了:你不希望它打印为“12.3e9”而是“1.23e10”?请注意,除了有效位数 digitCount,您还需要额外的大小,最坏情况下符号为 1 + 分数分隔符为 1 + 指数字母为 1 + 指数符号为 1 + 指数为 3(双精度浮点数的最坏情况)。
大致等同于 g 格式的是这样的:
(FloatPrinter freeFormat)
totalWidth: 13; "size of the generated string"
digitCount: 6; "number of significant figures"
print: -12.3e-205.
->' -1.23e-204'
实际任务:我想以人类可读的格式打印(我自己实现的)矩阵。作为先决条件,我想我需要能够指定 "fit the number representation into X characters"。我在 Float
和 Integer
class 中找到 #printShowingDecimalPlaces:
和 #printPaddedWith:to:
(第一种方法更通用 Number
class) .它们单独工作,但前者仅对小数部分起作用,而后者对小数部分之前的部分起作用,例如:
10.3 printPaddedWith: Character space to: 5.
"' 10.3'"
-10.3 printPaddedWith: Character space to: 5.
"' -10.3'"
10.3 printShowingDecimalPlaces: 3.
"'10.300'"
此外,他们对科学形式的非常大(或同样小的数字)的作用并不理想:
12.3e9 printShowingDecimalPlaces: 3.
"'12300000000.000'"
12.3e9 printPaddedWith: Character space to: 5.
"' 1.23e10'"
所以,我想要像 Common Lisp 的 (FORMAT T "~10g" 12.3d9)
或 C 的 printf("%10g", 12.3e9)
这样的东西,(a) 将整个宽度限制为 10 个字符,并且 (b) 根据数量的大小。 Pharo中有这样的东西吗?
对于多种打印选项,我建议从加载 NumberPrinter 包 http://ss3.gemstone.com/ss/NumberPrinter/
(FloatPrinter fixed) digitCount: 2; print: 10.3.
-> '10.30'
虽然我没有在最近的 Pharo 版本中尝试过。
编辑: 啊,但是我没有看到处理 3 的指数倍数的格式,也许你必须为这种格式创建一个子类。
编辑:
或者我误解了:你不希望它打印为“12.3e9”而是“1.23e10”?请注意,除了有效位数 digitCount,您还需要额外的大小,最坏情况下符号为 1 + 分数分隔符为 1 + 指数字母为 1 + 指数符号为 1 + 指数为 3(双精度浮点数的最坏情况)。
大致等同于 g 格式的是这样的:
(FloatPrinter freeFormat)
totalWidth: 13; "size of the generated string"
digitCount: 6; "number of significant figures"
print: -12.3e-205.
->' -1.23e-204'