Ich habe einige Felder von einer Sammlung als zurückgegeben
2.4200
2.0044
2.0000
Ich möchte Ergebnisse wie
2.42
2.0044
2
Ich habe es mit versucht String.Format
, aber es kehrt zurück 2.0000
und setzt es so, dass auch N0
die anderen Werte gerundet werden.
String.Format()
mit 'G' sollte bekommen, was Sie wollen .. Ich habe meine Antwort mit einem Link zu Standard-Zahlenformaten aktualisiert. Sehr benutzerfreundlich.double
, und die StandardeinstellungToString
für double gibt die nachfolgenden Nullen aus. Lesen Sie diesToString
Funktion.Antworten:
Ist es nicht so einfach, wenn die Eingabe eine Zeichenfolge ist? Sie können eine davon verwenden:
Dies sollte für alle Eingaben funktionieren.
Update Schauen Sie sich die numerischen Standardformate an. Ich musste den Präzisionsspezifizierer explizit auf 29 setzen, da in den Dokumenten eindeutig angegeben ist:
Update Konrad wies in den Kommentaren darauf hin:
quelle
Ich bin auf das gleiche Problem gestoßen, aber in einem Fall, in dem ich keine Kontrolle über die Ausgabe in einen String habe, der von einer Bibliothek erledigt wurde. Nachdem ich mich mit Details bei der Implementierung des Dezimaltyps befasst hatte (siehe http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx ), kam ich auf einen tollen Trick (hier als Erweiterung) Methode):
Der Exponententeil der Dezimalstelle wird auf das reduziert, was benötigt wird. Wenn Sie ToString () auf der Ausgangsdezimalstelle aufrufen, wird die Zahl ohne nachgestellte 0 geschrieben
quelle
1
gefolgt von 330
-s, aber das erzeugt genau die gleichedecimal
Instanz wie eine Zahl mit 29 Ziffern, eins1
und 280
-s. Genau wie @ThomasMaterna in seinem Kommentar sagte. NeinSystem.Decimal
kann mehr als 29 Ziffern haben (Zahlen mit führenden Ziffern größer als insgesamt79228...
nur 28 Ziffern). Wenn Sie mehr nachgestellte Nullen wünschen , multiplizieren Sie mit,1.000...m
anstatt zu teilen. AuchMath.Round
können einige Nullen abhacken, zum BeispielMath.Round(27.40000m, 2)
gibt27.40m
, so dass nur eine Null links.Meiner Meinung nach ist es sicherer, benutzerdefinierte Zeichenfolgen im numerischen Format zu verwenden .
quelle
Ich benutze diesen Code, um die wissenschaftliche Notation "G29" zu vermeiden:
BEARBEITEN: Verwenden des Systems CultureInfo.NumberFormat.NumberDecimalSeparator:
quelle
Culture.NumberFormat.NumberDecimalSeparator
Verwenden Sie das
#
Symbol hash ( ), um nachfolgende Nullen nur bei Bedarf anzuzeigen. Siehe die Tests unten.quelle
num1.ToString("0.##")
sollte zurückgegeben werden13.1534545765
(keine Änderung), da keine nachgestellten Nullen vorhanden sind.Ich fand eine elegante Lösung von http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/
Grundsätzlich
quelle
v
ist0m
, ist das Ergebnis des Codes eine leere Zeichenfolge statt"0"
.Ein Ansatz auf sehr niedriger Ebene, aber ich glaube, dies wäre der performanteste Weg, wenn nur schnelle Ganzzahlberechnungen (und keine langsamen String-Parsing- und kultursensitiven Methoden) verwendet werden:
quelle
a
undb
) in jeder Iteration , während , wenn sie alle Null ohnehin sind. Dann fand ich jedoch diese überraschend einfache Lösung, die auch das übertrifft, was Sie und ich in Bezug auf die Leistung entwickelt haben .Das wird funktionieren:
Oder wenn Ihr Anfangswert ist
string
:Achten Sie auf diesen Kommentar .
quelle
double.ToString
nachgestellte Nullen entfernt werden.Das ist einfach.
Geprüft.
Prost :)
quelle
Hängt davon ab, was Ihre Nummer darstellt und wie Sie die Werte verwalten möchten: Ist es eine Währung, benötigen Sie eine Rundung oder Kürzung, benötigen Sie diese Rundung nur für die Anzeige?
Wenn für die Anzeige eine Formatierung in Betracht gezogen wird, lauten die Zahlen x.ToString ("")
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx und
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
Wenn es sich nur um eine Rundung handelt, verwenden Sie die Math.Round-Überladung, die eine MidPointRounding-Überladung erfordert
http://msdn.microsoft.com/en-us/library/ms131274.aspx )
Wenn Sie Ihren Wert aus einer Datenbank erhalten, ziehen Sie das Casting anstelle der Konvertierung in Betracht: double value = (decimal) myRecord ["columnName"];
quelle
Sie können einfach einstellen als:
quelle
Wenn Sie die Dezimalzahl beibehalten möchten, versuchen Sie folgendes Beispiel:
quelle
Versuch, eine benutzerfreundlichere Lösung für DecimalToString zu finden ( https://stackoverflow.com/a/34486763/3852139 ):
Ausgabe:
quelle
Eine sehr einfache Antwort ist die Verwendung von TrimEnd (). Hier ist das Ergebnis,
Ausgabe ist 1 Wenn mein Wert 1,01 ist, ist meine Ausgabe 1,01
quelle
value = 100
?Der folgende Code kann verwendet werden, um den Zeichenfolgentyp nicht zu verwenden:
Rückgabe 789.5
quelle
Das Abschneiden von nachgestellten Nullen ist sehr einfach und kann mit einer Duplex-Besetzung gelöst werden:
(I) -> Analysiert den Dezimalwert aus einer beliebigen Zeichenfolgenquelle.
(II) -> Zuerst: Um dies zu verdoppeln, entfernen Sie die nachgestellten Nullen. Zweitens: Andere Umwandlung in Dezimalzahl, da keine implizite Konvertierung von Dezimalzahl in Doppel- und umgekehrt existiert.
quelle
Versuchen Sie diesen Code:
quelle
versuche es so
und konvertiere das dann in float
quelle
subString()
Methode dafür verwenden, aber laut der hier geposteten Frage sehe ich keine solche Anforderung =)"12300.00"
darauf zugeschnitten wird"123"
. Ein weiterer Effekt, unerwünscht scheint , ist , dass einige Zahlen, wie die"0.00"
ganze Art und Weise beschnitten werden nach unten auf die leere Zeichenfolge""
(obwohl diese Zahl ist ein Spezialfall ein integrales „Vielfach von 10,0“).