2009-10-09 4 views
7

Gibt es einen einfachen Weg, um sicherzustellen, dass ungefähre Zahlen (d. h. Zahlen mit dem Kopf Real), wenn sie in Zeichenfolgen konvertiert werden, kein nachstehendes "." haben? Ich würde es mögen, wenn sie nur den Dezimalpunkt in Fällen hätten, wo es tatsächlich einen angezeigten Bruchteil gibt.Unterdrücken eines nachfolgenden "." in numerischer Ausgabe von Mathematica

Die Lösungen, die ich gefunden habe, sind nicht robust, und hängen von Precision und Accuracy zusammen NumberForm in eine unangenehme Art und Weise, oder RealDigits in einer noch unangenehme Art und Weise verwendet wird.

Vielen Dank im Voraus.

Antwort

5

ich dies in der Vergangenheit verwendet haben, wenn Zahlen in Zahlen dargestellt:

Integerise[x_] := If[Round[x] == x, ToString[[email protected]] <> ".0", [email protected]] 

Nur <> ".0" entfernen Wenn Ganzzahlen nicht mit einer Dezimalzahl von Null angezeigt werden sollen.

Update: Wie dreeves im Kommentar erwähnt, ToString wird noch eine Zahl innerhalb 0,0001 oder so einer ganzen Zahl gestutzt und den Punkt anzuzeigen.

Eine bessere Möglichkeit, den abschließenden Punkt zu entfernen, ist das Inputform Format für ToString zu verwenden:

NormalNumber[x_] := ToString[x, InputForm] 

mit einem Test:

NormalNumber /@ {5, 5.5, 123.001, 123.0001} 

Diese in Integerise oben eingebaut werden, um das Problem zu beheben bemerkt.

+1

Ich habe es gerade versucht und festgestellt, dass es für Integerise [123.0001] bricht (es gibt eine Zeichenfolge mit einem abschließenden ".") Zurück. – dreeves

1

Ich würde wahrscheinlich nur die Zeichenfolge nachbearbeiten. Es ist schneller (und viel einfacher), einfach zu überprüfen, ob das letzte Zeichen "." als redundante Arithmetik durchzuführen und alle Präzisionseinstellungen zu berücksichtigen.

Edit: vielleicht wissen Sie das, aber man kann so etwas tun:

userToString[expr_, form___] := ToString[expr,form]; 

userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]]; 
3

Ich empfehle dieses:

shownum[x_] := StringReplace[[email protected][x, ExponentFunction->(Null&)], 
          RegularExpression["\\.$"]->""] 

Es ist nur eine & regex Suche auf dem hinteren ersetzen "". Wenn Sie "123" möchten. um "123.0" anstelle von "123" anzuzeigen, ersetzen Sie dann diese letzte leere Zeichenfolge durch ".0".

UPDATE: Meine ursprüngliche Version falsch angezeigt für Zahlen, die Mathematica standardmäßig in wissenschaftlicher Notation anzeigt. Ich habe das mit NumberForm behoben.

Hier ist die Version, die ich tatsächlich im wirklichen Leben verwende. Es ermöglicht die optionale Rundung:

(* Show Number. Convert to string w/ no trailing dot. Round to the nearest r. *) 
Unprotect[Round]; Round[x_,0] := x; Protect[Round]; 
re = RegularExpression; 
shn[x_, r_:0] := StringReplace[ 
    [email protected][Round[[email protected],r], ExponentFunction->(Null&)], [email protected]"\\.$"->""] 
+0

Dies spielt die Rolle von removeTrailingDot in meiner Antwort. Auch wenn ich natürlich ein großer Fan von Regex bin, ist es schneller, direkte String-Manipulation zu machen - überprüfe das letzte Zeichen und lasse es fallen, wenn es "." Ist. Die Regex ist natürlich schneller anzupassen, und vielleicht ist Geschwindigkeit kein Problem - aber diese Art von Funktion kann oft wiederholt aufgerufen werden. (Sie könnten auch die Funktion kompilieren - ich weiß nicht, ob das mit Regex funktioniert) – Cascabel

1

Die Funktionen NumberForm, ScientificForm, EngineeringForm etc. ... bietet die Möglichkeit, NumberFormat zu formatieren und die Mantisse, Basis und Exponent einer Reihe zu anordnen. Mit

die Standard-Mathematica-Ausgabe wird reproduziert, aber der nachfolgende Punkt wird entfernt.