2012-09-20 12 views
5

Chcę przeanalizować ciąg znaków, aby uaktywnić zmienną. A gdy łańcuch jest pusty, przejdzie 0 (jako wartość zmiennoprzecinkowa).Steruj analizatorem składni, gdy wejście ma wartość Null

robiłem parse tak:

aeVehicle.MSRP = float.Parse((drInvetory["MSRP"] ?? "0").ToString()); 

co dało błędy:

ERROR MESSAGE : Input string was not in a correct format. 
ERROR SOURCE : at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseSingle(String value, NumberStyles options, NumberFormatInfo numfmt) 
    at System.Single.Parse(String s, NumberStyles style, NumberFormatInfo info) 
    at System.Single.Parse(String s) 

Proszę zaproponować najlepszy sposób obsłużyć tej sytuacji.

+4

zdefiniuj "podałeś błędy" –

+0

Proszę zobaczyć edycję w qsn. –

Odpowiedz

8

Jeśli drInvetory["MSRP"] pochodzi z DataRow, null operator koalescencyjny nie oceni się prawdą w stosunku do DBNull, więc parse pływak zawiedzie. Możesz porównać dla DBNull.Value lub użyć float.TryParse().

z oryginalnego Kodeksu

aeVehicle.MSRP = float.Parse(drInvetory["MSRP"] == DBNull.Value ? "0" : drInvetory["MSRP"].ToString()); 

Osobiście chciałbym sprawdzić DBNull a następnie oddane do pływaka (lub unbox do dokładnego typu, a następnie cast). Pozwala to zaoszczędzić stosunkowo kosztowne przetwarzanie ciągów znaków.

Lepsze

aeVehicle.MSRP = drInvetory["MSRP"] == DBNull.Value ? default(float) : 
(float)drInvetory["MSRP"]; 

typu SQL-CLR mapowanie: http://msdn.microsoft.com/en-us/library/bb386947.aspx
Patrz także: Difference between decimal, float and double in .NET?

+0

Nigdy nie wiedziałem o tym .. Tak .. pochodzi z DataRow –

+3

Rzeczywiście, 'DBNull' jest ogromny ból na * tak wielu * poziomach. –

+0

@Tim Medora..i dwukrotnie sprawdził to .. masz rację .. nauczyłeś mnie dzisiaj wspaniałej rzeczy .. Dzięki –

0
float f = 0f; 
string s = (drInvetory["MSRP"] ?? "0").ToString(); 
if (s != null) { 
    f = float.Parse(s, ... 
} 
+2

'0.0' jest" podwójnym "; '0f' byłoby lepsze, lub po prostu' 0'. –

+0

Dzięki - już dziś w Java ziemi (bez wymówki, 0.0 jest podwójne w java też). – John3136

+0

Dlaczego ToString()? To już jest ciąg znaków. I s nie może być wartością null, więc jeśli nie wydaje się to konieczne. Jeśli drInvetory ["MSRP"] nie jest ciągiem, to nie skompiluję, tak myślę. –

0

należy użyć The TryParse:

float num = 0; 
    float.TryParse(s, out num); 
0

Może spowodowane nieoczekiwanym przecinek w twoim ciągu. Spróbuj najpierw wyrzucić przecinek.

0
float result = 0; 
float.TryParse(drInvetory["MSRP"], out result); 
aeVehicle.MSRP = result; 

W ten sposób, jeśli parse się nie powiedzie, to zawsze będzie spadać-powrotem na 0.

0

inny alternatywny jest prosty:

aeVehicle.MSRP = float.Parse("0" + drInvetory["MSRP"].ToString()); 

Będzie działać tylko dla liczb dodatnich. w przeciwnym razie użyj funkcji Microsoft.VisualBasic.Val, która jest najwygodniejsza.

Powiązane problemy