2012-09-20 15 views
5

Quiero analizar una cadena para flotar. Y cuando la cadena es nula, pasará 0 (como un valor flotante).Manejar Parse para flotar, cuando la entrada es nula

que estaba haciendo el análisis sintáctico de esta manera:

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

Que dio errores:

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) 

Para sugerir la mejor manera de manejar esta situación.

+4

definir "dio error" –

+0

Consulte la edición en qsn. –

Respuesta

8

Si drInvetory["MSRP"] proviene de una DataRow, el operador coalescente nula no se evaluará como true si se compara con DBNull, por lo tanto el análisis sintáctico de flotación fallará. Puede comparar para DBNull.Value, o use float.TryParse().

De Código Original

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

Personalmente, me gustaría comprobar si hay DBNull y luego arrojado a un flotador (o unbox al tipo exacto, entonces fundido). Esto ahorra un análisis de cadenas comparativamente caro.

Mejor

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

SQL-CLR tipo de asignación: http://msdn.microsoft.com/en-us/library/bb386947.aspx
Ver también: Difference between decimal, float and double in .NET?

+0

Nunca lo sabía ... Sí ... viene de un DataRow –

+3

De hecho, 'DBNull' es un gran dolor en * tantos * niveles. –

+0

@Tim Medora..i comprobé esto dos veces ... tienes razón ... me enseñaste algo genial hoy ... Gracias –

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

'0.0' es un' doble'; '0f' sería mejor, o simplemente' 0'. –

+0

Gracias - estado en tierra de Java hoy (no hay excusa, 0.0 es doble en Java también). – John3136

+0

¿Por qué ToString()? Ya es una cadena. Y s no puede ser nulo, por lo que parece innecesario. Si drInvetory ["MSRP"] no es una cadena, esto no se compilará, creo. –

0

se debe utilizar el la TryParse:

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

Podría causada por inesperada coma en tu cadena. Intenta tirar la coma primero.

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

De esta manera, si falla el análisis sintáctico, entonces será siempre de repliegue a 0.

0

otra alternativa es sencilla:

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

sólo funcionará para los números positivos. de lo contrario use la función Microsoft.VisualBasic.Val que es la más conveniente.

Cuestiones relacionadas