2014-01-24 23 views
6

In meiner Anwendung habe ich ein Textfeld - txtDiscount, wo der Administrator einen Rabatt Prozentsatz für einen bestimmten Benutzer festlegen kann, oder er kann nicht. Am hinteren Ende möchte ich die Daten speichern, so jetzt habe ich dieses:Wie kann double.TryParse verwendet werden, wenn die Ausgabe null sein darf?

double? discount = null; 
if (!string.IsNullOrEmpty(txtDiscount.Text)) 
{ 
    if (!double.TryParse(txtDiscount.Text, out discount)) errors.Add("Discount must be a double."); 
} 

So bekomme ich einen Fehler für invalid argument und es ist offensichtlich die discount, die keine Nullwerte enthalten sein kann, wenn ich werde es in TryParse verwenden bin . Ich habe gesehen, dass viele Leute Erweiterungen für diese Art von Situationen machen, aber im Moment glaube ich nicht, dass es notwendig ist. Was ich denken kann ist eine andere Variable wie folgt:

double? discount = null; 
private double _discount; 
if (!string.IsNullOrEmpty(txtDiscount.Text)) 
{ 
    if (!double.TryParse(txtDiscount.Text, out _discount)) 
    { 
    errors.Add("Discount must be adouble."); 
    } 
    else 
    { 
    discount = _discount; 
    } 
} 

und dann verwenden, um meine NULL festlegbare discount den Wert an die Datenbank zu übergeben. Aber ich mag den obigen Code eigentlich nicht, es scheint mir für eine solche Aufgabe ziemlich kompliziert zu sein, aber ich kann mir nichts Besseres vorstellen. Wie kann ich mit dieser Situation umgehen, ohne die Erweiterungsmethode zu verwenden?

+3

Warum verkomplizieren Sie das Design der Anwendung durch spezielle Bearbeitung von Fällen? Warum nimmt das System immer einen Rabattwert (von 0.0) an und nur wenn jemand dies ändert, erhalten Sie eine neue Nummer. Wenn jede Berechnung immer den Rabatt enthält (auch wenn es 0.0 ist), benötigen Sie keine spezielle Fallbehandlung. Für Ihre GUI benötigen Sie zwar einen leeren String-Check, machen aber keinen Fehler und spiegeln das Datenbankdesign in Ihrem Frontend wider. – Samuel

+0

Nun, in diesem Fall denke ich, dass Nullable in Ordnung ist, denn '0.0' ist immer noch ein Wert, können Sie sagen, dass der Benutzer 0.0 Prozent Rabatt hat, wenn Nullable sagt, dass dieser Benutzer tatsächlich keinen Rabatt hat, was für mich macht mehr Sinn. Aber obwohl meine Frage allgemeiner ist, selbst wenn ich den Typ in "dobule" ändern sollte, möchte ich immer noch sehen, wie man mit diesem Fall umgeht, es scheint ziemlich normal zu sein. – Leron

+0

@Leron Was ist, wenn der Rabatt negativ ist? –

Antwort

4

Sie können Parsing ohne Erweiterungsmethode tun - nur lokal verwenden Nicht-Nullable-Wert, den es zu TryParse Methode zu übergeben:

double? discount = null; 

if (!String.IsNullOrEmpty(txtDiscount.Text)) 
{ 
    double value; 
    if (Double.TryParse(txtDiscount.Text, out value))  
     discount = value; 
    else  
     errors.Add("Discount must be a double."); // discount will have null value 
} 

Aber ich hatte all diese Logik Erweiterung bewegt.

+1

Glauben Sie nicht, ob der Zustand und sein Körper völlig überflüssig sind? Dies verbessert nichts von OP-Code –

+0

@SriramSakthivel danke! Verpasste das Ding (weil versucht, ternären Operator an erster Stelle zu verwenden) –

-1
Nullable<double> discount = new Nullable<double>(); 

Standardwert ist allready null Sie nicht brauchen, um es zu setzen wieder auf null

1
static void Main() 
{ 
    var testStrings = new[] { "", "1.234" }; 

    foreach(var testString in testStrings) 
    { 
     double output; 
     double? value = null; 

     if(double.TryParse(testString, out output)) 
     { 
      value = output; 
     } 

     Console.WriteLine("{0}", value.HasValue ? value.Value.ToString() : "<null>"); 
    } 
} 
-1
if(double.TryParse(txtDiscount.Text?? "", out _discount)) 
    discount=_discount; 
else Console.WriteLine("Discount must be adouble."); 
3

Du wirst nur den hässlichen Code mit einem lokalen Nicht-Nullable Type schreiben müssen oder verwenden Sie eine andere Möglichkeit zu definieren, dass es keinen Rabatt gibt. Ich stimme zu, dass ein NULL-fähiges Double eine ordentliche Art ist, es darzustellen, aber wenn der Code dich so nervt, dann versuche etwas anderes (ein Bool, zum Beispiel: discount_given = true).

Persönlich würde ich einfach mit einer Verlängerung, die doppelt auf Nullable-parst:

public static bool ParseDouble(string s, out double? dd) 
    { 
     double d; 
     bool ret = double.TryParse(s, out d); 

     if (ret) 
      dd = d; 
     else 
      dd = null; 

     return ret; 
    } 
0
public static double ToDouble(this string value, double fallbackValue = 0) 
    { 
     double result; 

     return double.TryParse(value, out result) ? result : fallbackValue; 
    }