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.