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

Formatting 如何在Smalltalk/Pharo中打印固定字符数的数字,formatting,printf,smalltalk,pharo,Formatting,Printf,Smalltalk,Pharo,实际任务:我想以人类可读的格式打印(我自己实现的)矩阵。作为一个先决条件,我想我需要能够指定“将数字表示形式适配为X个字符”。我在Float和Integer类中找到了#printShowingDecimalPlaces:和#printedpadded:to:(第一种方法是在更一般的Number类中)。它们单独起作用,但前者仅作用于小数部分,后者作用于小数部分之前的部分,例如: 10.3 printPaddedWith: Character space to: 5. "' 10.3'" -1

实际任务:我想以人类可读的格式打印(我自己实现的)矩阵。作为一个先决条件,我想我需要能够指定“将数字表示形式适配为X个字符”。我在
Float
Integer
类中找到了
#printShowingDecimalPlaces:
#printedpadded:to:
(第一种方法是在更一般的
Number
类中)。它们单独起作用,但前者仅作用于小数部分,后者作用于小数部分之前的部分,例如:

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的
(格式T“~10g”12.3d9)
或C的
printf(“%10g”,12.3e9)
,即(a)将整个宽度限制为10个字符,(b)根据数字的大小选择最合适的格式。Pharo中是否有类似的功能?

对于多功能打印选项,我建议从

->“10.30”

不过,我在最近的法罗版本中并没有尝试过

编辑: 啊,但是我没有看到处理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'

谢谢到目前为止,它是有效的<代码>(自由格式)总宽度:n;print:x是我一直在寻找的。
(FloatPrinter freeFormat)
    totalWidth: 13; "size of the generated string"
    digitCount: 6; "number of significant figures"
    print: -12.3e-205.

->'   -1.23e-204'