如何在 Smalltalk/Pharo 中打印固定字符数的数字

How to print a number with number of fixed characters in Smalltalk/Pharo

实际任务:我想以人类可读的格式打印(我自己实现的)矩阵。作为先决条件,我想我需要能够指定 "fit the number representation into X characters"。我在 FloatInteger 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'