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

时间:2016-04-07 15:08:59

标签: formatting printf smalltalk pharo

实际任务:我想以人类可读的格式打印矩阵(我自己的实现)。作为先决条件,我想我需要能够指定“将数字表示拟合为X个字符”。我在#printShowingDecimalPlaces:#printPaddedWith:to:类中找到了FloatInteger(第一种方法是更一般的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的(FORMAT T "~10g" 12.3d9)或C printf("%10g", 12.3e9)这样的东西,(a)将整个宽度限制为10个字符,(b)根据大小选择最合适的格式数字。 Pharo有这样的东西吗?

1 个答案:

答案 0 :(得分:3)

对于多功能打印选项,我建议从中加载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表示指数(最差情况表示双精度浮点数)。
< / p>

或多或少等同于g格式将是这样的:

(FloatPrinter freeFormat)
    totalWidth: 13; "size of the generated string"
    digitCount: 6; "number of significant figures"
    print: -12.3e-205.

->'   -1.23e-204'