2016-04-07 28 views
3

içinde sabit karakter sayısıyla bir sayı nasıl yazdırılır Gerçek görev: Matrisini (kendi uygulamamın) insanca okunabilir biçimde yazdırmak istiyorum. Önkoşul olarak, "sayı temsilini X karakterlerine sığdır" seçeneğini belirleyebilmem gerektiğini düşündüm. Float ve Integer sınıflarında #printShowingDecimalPlaces: ve #printPaddedWith:to: sınıflarını buldum (ilk yöntem daha genel Number sınıfındadır). Bireysel, çalıştıkları fakat fraksiyonel, örneğin önceki kısım sadece fraksiyonel kısmında eski eserler ve ikincisi:Smalltalk/Pharo

10.3 printPaddedWith: Character space to: 5. 
"' 10.3'" 
-10.3 printPaddedWith: Character space to: 5. 
"' -10.3'" 
10.3 printShowingDecimalPlaces: 3. 
"'10.300'" 

Ayrıca bilimsel formda çok büyük (veya eşit az sayıda) kendi eylem ideal değildir :

12.3e9 printShowingDecimalPlaces: 3. 
"'12300000000.000'" 
12.3e9 printPaddedWith: Character space to: 5. 
"' 1.23e10'" 

Yani, (a) 10 karaktere bütün genişliğini kısıtlar ve (b) sayı boyutuna bağlı en uygun biçimi seçer, Ortak Lisp en (FORMAT T "~10g" 12.3d9) veya C'ler printf("%10g", 12.3e9) gibi bir şey istiyorum. Pharo'da böyle bir şey var mı? gerçi son Pharo sürümlerinde> '10 .30'

bunu deneyin vermedi - Çok yönlü baskı seçenekleri için

cevap

3

, ben http://ss3.gemstone.com/ss/NumberPrinter/

(FloatPrinter fixed) digitCount: 2; print: 10.3. 

yüklenirken NumberPrinter paketi göstermektedir.

DÜZENLEME: Ah, ama ben 3 üsler birden işlemek için hiçbir biçimini görmek, belki böyle formatı için bir alt sınıfı oluşturmak gerekir.

DÜZENLEME: Ya missunderstood: Eğer '12 .3e9' ziyade '1.23e10 olarak yazdırmak istemiyorum'? Önemli ve digitCount ayrı, ekstra için en büyük boyutu gerekir. 1 için + işareti için üs işareti + 3 için üs (+ çift kayan noktalı nokta için en kötü durum) için üs + 1 için kesir ayırıcı + 1 için işaret + 1.

fazla veya g biçimine az eşdeğer böyle bir şey olurdu:

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

->' -1.23e-204' 
+0

teşekkürler! Şimdiye kadar çalışıyor. (FloatPrinter freeFormat) totalWidth: n; print: x' aradığım şey. – mobiuseng