2016-04-07 3 views
3

Aktuelle Aufgabe: Ich möchte die Matrix (meiner eigenen Implementierung) in einem für Menschen lesbaren Format drucken. Als Voraussetzung, dachte ich mir, ich muss in der Lage sein, "passen Sie die Zahl Darstellung in X-Zeichen". Ich fand #printShowingDecimalPlaces: und #printPaddedWith:to: in Float und Integer Klassen (die erste Methode ist in allgemeiner Number Klasse). Individuell, sie arbeiten, aber die früheren Arbeiten auf Bruchteil nur und das letztere auf einem Teil vor fraktionierte, zB:So drucken Sie eine Nummer mit festen Zeichen in 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'" 

Auch ihre Wirkung auf sehr groß (oder ebenso kleine Zahlen) in der wissenschaftlichen Form ist nicht ideal :

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

Also, ich würde printf("%10g", 12.3e9) so etwas wie Common Lisp des (FORMAT T "~10g" 12.3d9) oder C ist wie beschränkt, dass (a) wählt die gesamte Breite zu 10 Zeichen und (b) der Anzahl der am besten geeigneten Format abhängig von der Größe. Gibt es so etwas in Pharo?

Antwort

3

Für vielseitige Druckoptionen, schlage ich Laden NumberPrinter Paket von http://ss3.gemstone.com/ss/NumberPrinter/

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

-> '10 .30'

ich versuche nicht, es in der letzten Pharo Versionen though.

EDIT: Ah, aber ich sehe keinen Format für Exponenten Vielfaches von 3 Handhabung, vielleicht würden Sie eine Unterklasse für solche Format erstellen müssen.

EDIT: Oder ich missunderstood: Sie wollen es nicht als '12 .3e9' drucken, sondern eher '1.23e10'? Beachten Sie, dass außer significand digitCount eine zusätzliche Größe für schlimmstenfalls 1 für Vorzeichen + 1 für das Trennzeichen + 1 für den Exponenten + 1 für das Vorzeichen + 3 für den Exponenten (ungünstigster Fall für Gleitkommazahl mit doppelter Genauigkeit) erforderlich ist.

Die mehr oder weniger äquivalent zu g-Format würde wie folgt sein:

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

->' -1.23e-204' 
+0

Dank! Bis jetzt funktioniert es. '(FloatPrinter freeFormat) totalWidth: n; print: x' ist was ich gesucht habe. – mobiuseng

Verwandte Themen