实际任务:我想以人类可读的格式打印矩阵(我自己的实现)。作为先决条件,我想我需要能够指定“将数字表示拟合为X个字符”。我在#printShowingDecimalPlaces:
和#printPaddedWith:to:
类中找到了Float
和Integer
(第一种方法是更一般的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有这样的东西吗?
答案 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表示指数(最差情况表示双精度浮点数)。 或多或少等同于g格式将是这样的:
< / p>
(FloatPrinter freeFormat)
totalWidth: 13; "size of the generated string"
digitCount: 6; "number of significant figures"
print: -12.3e-205.
->' -1.23e-204'