[英]How to print a number with number of fixed characters in Smalltalk/Pharo
實際任務:我想以人類可讀的格式打印矩陣(我自己的實現)。 作為先決條件,我想我需要能夠指定“將數字表示擬合為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's printf("%10g", 12.3e9)
這樣的東西,(a)將整個寬度限制為10個字符,(b)選擇最多合適的格式取決於數字的大小。 Pharo有這樣的東西嗎?
對於多種打印選項,我建議從http://ss3.gemstone.com/ss/NumberPrinter/加載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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.