Gibt es eine Möglichkeit, Decimal.TryParse zu erhalten, um einen Zeichenfolgenwert von "0.0" oder "00.00" oder "000.000" als 0 zu analysieren?
Ich habe versucht, NumberStyles auf Any zu setzen.
Gibt es eine Möglichkeit, Decimal.TryParse zu erhalten, um einen String-Wert von
"0.0"
oder"00.00"
oder"000.000"
als 0 zu analysieren?
Ich interpretiere deine Frage so, dass sie bedeutet. Angenommen, ich nehme die Zeichenfolgen "0.0"
, "00.00"
und "000.000"
ask Decimal.TryParse
, um sie zu analysieren. Wenn ich die resultierende Dezimalzahl auf die Konsole schreibe, sehe ich 0.0
, 0.00
bzw. 0.000
. Gibt es eine Möglichkeit, Decimal.TryParse
in all diesen Fällen einen decimal
zurückzugeben, der als 0
?
Nein. Überlegen Sie, warum das so sein sollte. Decimal
types stellen genaue Zahlen dar; In bestimmten Kreisen wird 0.00
als genauer betrachtet als 0.0
, was als genauer betrachtet wird als 0
. Wenn Decimal.TryParse
diese Genauigkeit abgeschnitten hat, ist% c_de% für diese Zwecke nicht geeignet.
Das heißt, es ist einfach genug, die abschließenden Nullen vor dem Aufruf von Parse zu trimmen:
%Vor%Verwendung:
%Vor%Ausgabe:
%Vor% Bitte beachten Sie, dass das obige nur den Kern zeigt, wie Sie Ihr Problem lösen können. Es liegt an Ihnen zu entscheiden, ob und wie Sie mit Lokalisierungsproblemen umgehen. Bevor Sie diese in Produktion nehmen, sollten Sie zumindest überlegen, die fest codierten Decimal
durch '.'
zu ersetzen. Sie sollten eine Überladung von CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
mit der gleichen Parameterliste wie TryParseAfterTrim
in Betracht ziehen. Das ist:
Mit der InvariantCulture interpretiert decimal.TryParse alle diese Zeichenfolgen erfolgreich als null. Dieser Code, zum Beispiel:
%Vor%Erzeugt diese Ausgabe:
%Vor%Vielleicht besteht das Problem darin, die Werte zu drucken und die Werte nicht zu analysieren? Wenn dies der Fall ist, verwenden Sie einfach eine Formatzeichenfolge, die angibt, dass die Dezimalstellen optional sind.
%Vor%Produziert
%Vor%In .NET 1.1 wurde die Einhaltung abschließender Nullen in Dezimalwerten eingeführt, um eine strengere Übereinstimmung mit der ECMA-CLI-Spezifikation zu gewährleisten. Siehe diese Antwort auf eine ähnliche Frage .
Während die ursprüngliche Frage darauf beschränkt ist, nachgestellte Nullen beim Parsen einer Zeichenkette zu entfernen, ist es wichtig zu verstehen, warum und unter welchen Umständen nachfolgende Nullen in der internen Darstellung eines Dezimalwertes erhalten bleiben.
Nachgestellte Nullen können als Ergebnis von:
in einem Dezimalwert erscheinena) Analysieren von Eingaben mit abschließenden Nullen, wie im ursprünglichen Post oder
b) als Ergebnis einer Berechnung. Zum Beispiel: Multiplikation der Dezimalwerte 1.2 * 1.5 ergibt ein Ergebnis von 1.80: Dies liegt daran, dass die Multiplikation von zwei Werten mit jeweils genau einer Dezimalstelle ein Ergebnis liefert, das auf zwei Dezimalstellen genau ist - die zweite Dezimalstelle bleibt daher erhalten Sein Wert ist Null.
Was ist mit nachgestellten Nullen in der internen Dezimaldarstellung zu tun? Im Allgemeinen tun Sie nichts: Sie können bei Ausgabe auf Ihre gewünschte Anzahl von Dezimalzahlen formatieren, damit sie nicht wehtun.
Dezimal wird hauptsächlich für Finanzberechnungen verwendet, und es ist im Allgemeinen wünschenswert, abschließende Nullen beizubehalten, so dass ein auf den nächsten Cent gerundeter Betrag als 1,20 und nicht als 1,2 dargestellt wird. Normalerweise arbeiten Sie bei der Verwendung von Dezimalzahlen mit einer festen Genauigkeit (vielleicht in einer Einzelhandelsanwendung auf den nächsten Cent oder bei der Berechnung der Mobilfunknutzungsgebühren auf den nächsten Hundertstel eines Cent). Ihre Anwendungslogik wird also explizit dafür sorgen, dass eine Rundung auf eine feste Anzahl von Dezimalstellen unter Verwendung expliziter Rundungsregeln, z. eine Steuerberechnung, die mit MidpointRounding.AwayFromZero auf den nächsten Cent aufrundet:
%Vor%Wenn Sie auf diese Weise nicht auf eine bestimmte Anzahl von Dezimalstellen arbeiten, können Sie überlegen, ob Sie lieber double als dezimal verwenden sollten.
Trotzdem kann es gelegentlich erforderlich sein, nachgestellte Nullen zu entfernen, während alle signifikanten Ziffern beibehalten werden. AFAIK, dafür gibt es keine eingebaute Methode.
Wenn Sie dies tun müssen, wäre eine grundlegende Lösung die Formatierung als String unter Verwendung der Standardformatzeichenfolge "G28" (entspricht der benutzerdefinierten Formatzeichenfolge "0". ############) ################ "), dann parse das Ergebnis zurück auf eine Dezimalzahl.
Ein alternativer Weg, um nachfolgende Nullen zu entfernen, ohne zu einer Zeichenfolge zu konvertieren (wahrscheinlich schneller, obwohl ich sie nicht gemessen habe), ist die Verwendung von Math.Round - z. die folgende Methode:
%Vor%Was funktioniert nicht? Das funktioniert bei mir (getestet mit "0.0", "00.00" und "000.000"):
%Vor%Wenden Sie in Ihrer Console.Writeline ein Zeichenfolgenformat an, um die doppelte Null-Genauigkeit beizubehalten.
Ich verstehe was du meinst. Der folgende Code:
%Vor%druckt:
%Vor% Also beeinflusst die Eingabe die Ausgabe. Wenn Sie jedoch den Wert von number
mit dem Debugger überprüfen, wird im Tooltip- und Locals-Fenster "0" angezeigt, was darauf hinweist, dass es sich um ein Formatierungsproblem und nicht um ein grundlegendes Problem mit dem gespeicherten Wert handelt.
Wie andere jedoch gesagt haben, trimmen Sie die abschließenden Nullen (und den Dezimalpunkt) vor dem Konvertieren.
Eine Möglichkeit, nachgestellte Nullen nach dem Dezimalpunkt loszuwerden, würde darin bestehen, sie in der Dezimalzahl zu eliminieren.
Der Brute-Force-Weg würde sich in die interne Struktur der Dezimalstelle einmischen:
%Vor%Nicht hübsch, nicht schnell, aber es wird die interne Darstellung von "0.000" in "0" in einer Dezimalzahl ändern.