2012-04-04 21 views
12

Tengo una función que recibe parámetros de cadena y los convierte en enteros.
Para una conversión segura se usa int.TryParse().int.TryParse() devuelve falso para "#. ##"

public IEnumerable<object> ReportView(string param1, string param2) 
{ 
    int storeId = int.TryParse(param1, out storeId) ? storeId : 0; 
    int titleId = int.TryParse(param2, out titleId) ? titleId : 0; 
    IEnumerable<object> detailView = new Report().GetData(storeId, titleId); 
    return detailView; 
} 

llamada Función ReportView (“2”,”4”) -> int.TryParse analizar con éxito los números
función de llamada ReportView (‘2.00’,” 4.00”) -> int.TryParse falla para analizar los números

¿Por qué? ¿Alguna idea?

@Update
Lo siento muchachos, mi concepto era incorrecto. Soy nuevo en C#, pensé que Int.TryParse() devolvería la parte integral e ignoraría los decimales. Pero no lo hará, incluso Convert.ToInt32 ("cadena")
Gracias a todos.

+1

También debe especificar una cultura. – CodesInChaos

+4

No veo por qué esto es downvoted. La pregunta es claramente una pregunta para principiantes, pero está clara y razonablemente bien formulada. –

+1

@moguzalp ¿Debería la gente recibir una votación negativa por no saber algo cuando hacen una pregunta? –

Respuesta

6
public IEnumerable<object> ReportView(string param1, string param2) 
{ 
    decimal tmp; 
    int storeId = decimal.TryParse(param1, out tmp) ? (int)tmp : 0; 
    int titleId = decimal.TryParse(param2, out tmp) ? (int)tmp : 0; 
    IEnumerable<object> detailView = new Report().GetData(storeId, titleId); 
    return detailView; 
} 

Lo anterior funcionará con cadenas enteras o decimales. Tenga en cuenta que las cadenas del formulario "2.123" darán como resultado que se devuelva el valor entero de 2.

5

int.TryParse no intentará analizar la cadena y convertirla en un entero por si acaso. Debe usar decimal.TryParse para una cadena de número decimal.

2

2.00 y 4.00 no son de tipos de datos enteros, es por eso. Si quiere que sean verdaderos intente, double.TryParse() o decimal.TryParse()

1

No se analiza porque los números decimales no son enteros.

1

Porque "2.00" es un decimal, no un número entero.

2

bien 2.00 es un número decimal, no un int en los ojos de una computadora.

3

2.00 y 4.00 no son enteros. Si quiere analizar decimales, use decimal.TryParse() o double.TryParse(), y trunquetelos o verifique si hay mantisa de valor cero.

1

Un Int32 (int) solo puede contener valores integrales; por lo tanto, las funciones Int32 Parse/TryParse no pueden analizar cadenas con decimales. Si los valores de su cadena pueden contener decimales pero están destinados a representar enteros, use Decimal.TryParse y luego haga la conversión.

2

Para una computadora "2.00" es un flotante/decimal, no un número entero. En lugar de hacer decimal.TryParse() puede preprocesar la cadena eliminando los ceros finales y luego int.TryParse(). Entonces, si tienes "2.00", sigues comprobando (y soltando) el último carácter de la cadena hasta que alcances el "." (decimal). Si es "0" o "." puedes soltarlo Al final terminarás con solo "2".

Cuestiones relacionadas