Come posso convertire i dati da stringa a long in c #


102

Come posso convertire i dati da stringa a long in C #?

Ho dati

String strValue[i] ="1100.25";

ora lo voglio dentro

long l1;

1
I lunghi rappresentano numeri interi. Hai fornito un numero non intero. Cosa vorresti fare con quello?
Jon Skeet

1
Cosa succede se strValue è "1100,75"? Vedi: stackoverflow.com/questions/633335/…
magma

@magma: se lo converti in decimale, verrà arrotondato il numero, ovvero in questo caso se il numero specificato era 1100,75, restituirà 1101.
love Informatica

1
@charlie Stavo semplicemente sollevando il problema, perché MayP non sembrava essere pienamente consapevole dell'implicazione qui. Potrebbe voler semplicemente sbarazzarsi della parte non intera senza alcun arrotondamento, e va bene, a condizione che sia davvero quello che vuole. Grazie ugualmente.
magma

Risposte:


187

Questa risposta non funziona più e non riesco a trovare niente di meglio delle altre risposte (vedi sotto) elencate qui. Si prega di rivederli e votarli.

Convert.ToInt64("1100.25")

Firma del metodo da MSDN:

public static long ToInt64(
    string value
)

3
Ecco come l'ho fatto. Dovrebbe essere contrassegnato come risposta corretta.
sanpaco

2
Fornirà una stringa non nel formato corretto.
Badhon Jain

Questo non funziona. Errore di eccezione del formato del sistema. Qualche problema con la catena di caratteri in un formato errato.
Ricardo Araújo

È corretto .... sembra che non funzioni più, come nel 2013. Pubblicherò un aggiornamento a breve.
Will Bellman

46

Se vuoi ottenere la parte intera di quel numero, devi prima convertirlo in un numero mobile e poi lanciarlo in long.

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

Puoi usare la Mathclasse per arrotondare il numero come preferisci, o semplicemente troncare ...


Questo ti darà FormatExceptionse lo esegui sull'input specificato.
Andrew Savinykh

1
@zespri, no, almeno non nella maggior parte delle culture ... Ma in effetti fallirebbe nelle culture in cui il separatore decimale non è "."
Thomas Levesque

16

Puoi anche usare long.TryParsee long.Parse.

long l1;
l1 = long.Parse("1100.25");
//or
long.TryParse("1100.25", out l1);


6

Non sarai in grado di convertirlo direttamente in lungo a causa del punto decimale, penso che dovresti convertirlo in decimale e poi convertirlo in lungo qualcosa del genere:

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

spero che questo ti aiuti!


3

long è rappresentato internamente come System.Int64 che è un intero con segno a 64 bit. Il valore che hai preso "1100.25" è in realtà decimale e non intero, quindi non può essere convertito in long.

Puoi usare:

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

per convertirlo in valore decimale



1

Puoi anche farlo usando Int64.TryParseMethod. Restituirà "0" se è un valore stringa qualsiasi ma non ha generato un errore.

Int64 l1;

Int64.TryParse(strValue, out l1);

1

Puoi creare la tua funzione di conversione:

    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;
    }

Può essere ulteriormente migliorato:

  • dal punto di vista delle prestazioni
  • rendere la convalida più rigida nel senso che attualmente non gli importa se i caratteri dopo il primo decimale non sono cifre
  • specificare il comportamento di arrotondamento come parametro per la funzione di conversione. attualmente esegue l'arrotondamento
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.