2011-02-12 24 views
22

Tengo una cadena "246246.246" que me gustaría pasar a la interfaz de IConvertable, ToInt16, ToInt32, ToIn64. ¿Cuál es la mejor manera de analizar una cadena con decimales en un entero?C# Convertir cadena decimal a Int

Esta es una solución, pero ¿hay una mejor solución?

string value = "34690.42724"; 
Convert.ToInt64(Convert.ToDouble(value)); 
+0

¿Le preocupa redondear o recortar las partes decimales? –

+2

Utilice siempre CultureInfo al convertir cadenas a números. – xsl

+0

Redondear al número entero más cercano estaría bien. La mayoría de las veces será como 99.99999999999 y quiero redondear a 100. – Mike

Respuesta

40

Para hacer esto el descuento de redondeo que podría hacer:

Convert.ToInt64(Math.Floor(Convert.ToDouble(value))); 

Si necesita redondear podría reemplazar Math.Floor con Math.Round.

Editar: Ya que menciona en un comentario que se le Redondeo:

Convert.ToInt64(Math.Round(Convert.ToDouble(value))); 

Si tiene que preocuparse acerca de la localización/globalización entonces como @xls dijo que debe aplicar un CultureInfo en las conversiones .

Edición 2: Método alternativo utilizando una función de cadena (no muy elegante OMI - tal vez se podría elegantized con una función de predicado):

Convert.ToInt64(value.Substring(0, value.IndexOf('.') > 0 ? value.IndexOf('.') : value.Length)); 
+1

Parece que no hay una forma especial de hacerlo. Simplemente Covnert() luego Convert() nuevamente. – Mike

+2

@Mike: a veces, la distancia más corta entre dos puntos es una línea recta. En algún nivel tienes que convertir. Posiblemente podría acortarlo con algunas funciones de cadena. –

+2

No debería tener que Redondear el valor ya que ToInt64 (doble) devuelve la versión redondeada ya – deepee1

8

que no debería tener para redondear el valor como ToInt64 (doble) devuelve la versión redondeada ya

 string value = "246246.246"; 
     Convert.ToInt64(Convert.ToDouble(value)); 
1

Si realmente se preocupe por la precisión, pero no se trata de velocidad, entonces el tipo decimal sería mejor.

(long)Math.Round(decimal.Parse(value)); 
0

Suponiendo que esta cadena proviene de la entrada del usuario, es probable que desee obtener el estilo de los números. Ejecútelo a través de una función reutilizable como ...

int? ConvertToNumber(string value) 
{ 
    if (value == string.Empty) return null; 

    try 
    { 
     var dec = decimal.Parse(value, 
      NumberStyles.AllowDecimalPoint | 
      NumberStyles.Number | 
      NumberStyles.AllowThousands); 

     return (int)Math.Round(dec); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Please input a number."); 
     return null; 
    } 
}