¿Cómo podría convertir datos de cadena a larga en c #?

101

¿Cómo podría convertir datos de cadena a larga en C #?

Tengo datos

String strValue[i] ="1100.25";

ahora lo quiero en

long l1;
MayureshP
fuente
1
Los largos representan números enteros. Has dado un número no entero. ¿Qué querrías hacer con eso?
Jon Skeet
1
¿Qué pasa si strValue es "1100.75"? Ver: stackoverflow.com/questions/633335/…
magma
@magma: si convierte en decimal entonces será redondear el número, es decir, en este caso, si el número que se dio fue 1100,75 entonces se dará salida a 1101.
amor Informática
1
@charlie Simplemente estaba planteando el problema, porque MayP no parecía estar completamente al tanto de las implicaciones aquí. Es posible que desee simplemente deshacerse de la parte no entera sin ningún redondeo, y está bien, siempre que sea realmente lo que quiere. Gracias de cualquier forma.
magma

Respuestas:

187

Esta respuesta ya no funciona y no puedo encontrar nada mejor que las otras respuestas (ver más abajo) que se enumeran aquí. Revíselos y vote por ellos.

Convert.ToInt64("1100.25")

Firma del método de MSDN:

public static long ToInt64(
    string value
)
Will Bellman
fuente
3
Así es como lo hice. Debe marcarse como la respuesta correcta.
sanpaco
2
Dará una excepción de cadena que no tiene el formato correcto.
Badhon Jain
Esto no funciona. Error de excepción de formato del sistema. Algún problema con la cadena de caracteres en formato incorrecto.
Ricardo Araújo
Eso es correcto ... esto ya no parece funcionar, como lo hizo en 2013. Publicaré una actualización en breve.
Will Bellman
46

Si desea obtener la parte entera de ese número, primero debe convertirlo en un número flotante y luego convertirlo en largo.

long l1 = (long)Convert.ToDouble("1100.25");

Puede usar la Mathclase para redondear el número a su gusto, o simplemente truncar ...

BrunoLM
fuente
Esto le dará FormatExceptionsi ejecuta esto en la entrada especificada.
Andrew Savinykh
1
@zespri, no, al menos no en la mayoría de las culturas ... Pero de hecho fallaría en culturas donde el separador decimal no es "."
Thomas Levesque
15

También puede utilizar long.TryParsey long.Parse.

long l1;
l1 = long.Parse("1100.25");
//or
long.TryParse("1100.25", out l1);
majid zareei
fuente
6

No podrá convertirlo directamente en largo debido al punto decimal, creo que debería convertirlo en decimal y luego convertirlo en largo, algo como esto:

String strValue[i] = "1100.25";
long l1 = Convert.ToInt64(Convert.ToDecimal(strValue));

¡espero que esto ayude!

me encanta la informática
fuente
3

long se representa internamente como System.Int64, que es un entero de 64 bits con signo. El valor que ha tomado "1100.25" es en realidad decimal y no entero, por lo que no se puede convertir a largo.

Puedes usar:

String strValue = "1100.25";
decimal lValue = Convert.ToDecimal(strValue);

para convertirlo a valor decimal

Sandyiit
fuente
2
long l1 = Convert.ToInt64(strValue);

Deberias hacer eso.

Stuartmclark
fuente
1

También puedes hacerlo usando Int64.TryParseMethod. Devolverá '0' si hay algún valor de cadena pero no generó un error.

Int64 l1;

Int64.TryParse(strValue, out l1);
Pankaj Agarwal
fuente
1

Puede crear su propia función de conversión:

    static long ToLong(string lNumber)
    {
        if (string.IsNullOrEmpty(lNumber))
            throw new Exception("Not a number!");
        char[] chars = lNumber.ToCharArray();
        long result = 0;
        bool isNegative = lNumber[0] == '-';
        if (isNegative && lNumber.Length == 1)
            throw new Exception("- Is not a number!");

        for (int i = (isNegative ? 1:0); i < lNumber.Length; i++)
        {
            if (!Char.IsDigit(chars[i]))
            {
                if (chars[i] == '.' && i < lNumber.Length - 1 && Char.IsDigit(chars[i+1]))
                {
                    var firstDigit = chars[i + 1] - 48;
                    return (isNegative ? -1L:1L) * (result + ((firstDigit < 5) ? 0L : 1L));    
                }
                throw new InvalidCastException($" {lNumber} is not a valid number!");
            }
            result = result * 10 + ((long)chars[i] - 48L);
        }
        return (isNegative ? -1L:1L) * result;
    }

Se puede mejorar aún más:

  • En cuanto al rendimiento
  • hacer la validación más estricta en el sentido de que actualmente no le importa si los caracteres después del primer decimal no son dígitos
  • especificar el comportamiento de redondeo como parámetro para la función de conversión. actualmente hace redondeo
Cosmin Sontu
fuente