2010-08-03 20 views
13

¿Cuál es la mejor manera de tomar una cadena que puede estar vacía o contener "1.2" por ejemplo, y convertirla a un número entero? int.TryParse falla, por supuesto, y no quiero usar float.TryParse y luego convertir a int.C# Conversión de una cadena que contiene un punto flotante en un entero

+0

por cierto, 1.2 no es un entero . – Zaki

+4

Appart analizándolo en un flotador y luego enrutado, no veo cómo podrías hacer eso ... – Philippe

+1

'(int) float.Parse (" 1.2 ")' - no es demasiado trabajo. Sin embargo, Ruby hace esto: '" 1.234 ".to_i' produce 1 – Gishu

Respuesta

33

Solución 1: Convert.ToDouble (dependiente de la cultura)

Es posible que el uso de Convert.ToDouble. ¡Pero cuidado! La siguiente solución funcionará solo cuando el separador de números en la configuración de la cultura actual sea un carácter de punto.

var a = (int)Convert.ToDouble("1.2");  

Solución 2: Convert.ToDouble (independiente del cultivo)

Es preferible utilizar IFormatProvider y convertir el número de una manera independiente de los ajustes actuales de cultivo:

var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat); 

Solución 3: Analizar & Dividir

Otra forma de realizar esta tarea es utilizar Dividir en una cadena analizada:

var a = int.Parse("1.2".Split('.')[0]); 

O:

var a = int.Parse("1.2".Split('.').First()); 

Notas

+2

+1. Especialmente para decir que 'Convert.ToDouble' utiliza el delimitador decimal de la configuración de la cultura del hilo (de forma predeterminada la configuración regional de Windows), y puede ser una coma. Puede obligarlo a usar un punto pasando 'CultureInfo.InvariantCulture.NumberFormat' – MarkJ

1

Tal vez pueda intentar eliminar todo después del punto flotante utilizando las funciones de cadena y luego convertir a int. Pero en serio, no creo que sea mejor que convertir a float y luego a int.

+0

Si lo hace de esa manera, no olvide que el delimitador decimal es diferente en diferentes configuraciones regionales. Nuestros primos franceses usan ',' – MarkJ

+0

Por supuesto, pensé que era obvio :) En Rusia también usamos comas. – fuwaneko

4

No sé qué le pasa a analizar a un float y convertir a un int. Dudo que cualquier otra forma sería más eficiente, pero esto es un intento:

//allows empty strings and floating point values 
int ParseInt(string s, bool alwaysRoundDown = false) 
{ 
    //converts null/empty strings to zero 
    if (string.IsNullOrEmpty(s)) return 0; 

    if (!s.Contains(".")) return int.Parse(s); 

    string parts = s.Split("."); 
    int i = int.Parse(parts[0]); 
    if (alwaysRoundDown || parts.Length==1) return i; 

    int digitAfterPoint = int.Parse(parts[1][0]); 
    return (digitAfterPoint < 5) ? i : i+1; 
} 

Con el fin de globalizar el código que se necesita para reemplazar "." con System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator.

+0

No olvide que el delimitador decimal puede ser diferente según la configuración regional. – MarkJ

+0

Agregué una nota sobre la globalización. ¡Gracias! –

+0

Sin lugar a dudas el mejor, @Mark. +1 de mi lado. – Kangkan

0

Creo que otra forma de hacerlo sería dividir la cadena en pedazos tomando el decimal (.) Como el delimitador y luego analizar el entero. Por supuesto, aún no he preguntado si la cadena podría contener valores como "37.56 miles in 32.65 seconds" type values.

Teniendo en cuenta que habrá un solo valor (cadena o número) en la cadena, se me ocurre algo en la línea siguiente:

public int64 GetInt64(string input) 
{ 
    if (string.IsNullOrEmpty(input)) return 0; 
    // Split string on decimal (.) 
    // ... This will separate all the digits. 
    // 
    string[] words = input.Split('.'); 
    return int.Parse(words[0]); 
} 
+0

Quizás no sea necesario devolver int64 al hacer un análisis int32. – btlog

1
int a = (int)Math.Round(float.Parse("0.9")); 

Es necesario redondear primero a menos que desee 0,9 f se convierte a 0 en lugar de 1.

0

Puede usar la Biblioteca de tiempo de ejecución de Visual Basic para lograr esto desde C#.

Debe agregar una referencia al ensamblado Microsoft.VisualBasic.dll a su solución.

A continuación, el siguiente código hará que su conversión:

using VB = Microsoft.VisualBasic.CompilerServices; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     int i = VB.Conversions.ToInteger("1.2"); 
    } 
} 
0

tenía este mismo problema y terminó utilizando un híbrido de Marcos y Dariusz ':

if (num == "") 
    { 
     num = "0.00"; 
    } 

    var num1 = (float)Convert.ToDouble(num); 
Cuestiones relacionadas