Wie kann ich Daten in c # von string in long konvertieren?

101

Wie kann ich Daten in C # von String zu Long konvertieren?

Ich habe Daten

String strValue[i] ="1100.25";

jetzt will ich es rein

long l1;
MayureshP
quelle
1
Longs stehen für ganze Zahlen. Sie haben eine Nicht-Ganzzahl angegeben. Was würdest du damit machen wollen?
Jon Skeet
1
Was ist, wenn strValue "1100.75" ist? Siehe: stackoverflow.com/questions/633335/…
Magma
@magma: Wenn Sie es in Dezimalzahlen konvertieren, wird es die Zahl abrunden, dh in diesem Fall, wenn die angegebene Zahl 1100,75 war, wird es 1101 ausgeben.
Liebe Informatik
1
@charlie Ich habe das Problem lediglich angesprochen, da MayP sich der Auswirkungen hier nicht voll bewusst zu sein schien. Er möchte vielleicht einfach den nicht ganzzahligen Teil ohne Rundung loswerden, und das ist in Ordnung, vorausgesetzt, es ist wirklich das, was er will. Trotzdem danke.
Magma

Antworten:

186

Diese Antwort funktioniert nicht mehr und ich kann mir nichts Besseres einfallen lassen als die anderen hier aufgeführten Antworten (siehe unten). Bitte überprüfen und stimmen Sie sie ab.

Convert.ToInt64("1100.25")

Methodensignatur von MSDN:

public static long ToInt64(
    string value
)
Will Bellman
quelle
3
So habe ich es gemacht. Sollte als die richtige Antwort markiert werden.
Sanpaco
2
Es wird eine Zeichenfolge ausgegeben, die nicht im richtigen Format vorliegt.
Badhon Jain
Das funktioniert nicht. Systemformat-Ausnahmefehler. Einige Probleme mit der Zeichenkette in einem falschen Format.
Ricardo Araújo
Das ist richtig ... das scheint nicht mehr so ​​zu funktionieren wie 2013. Ich werde in Kürze ein Update veröffentlichen.
Will Bellman
46

Wenn Sie den ganzzahligen Teil dieser Zahl erhalten möchten, müssen Sie ihn zuerst in eine schwebende Zahl konvertieren und dann in long umwandeln.

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

Sie können Mathclass verwenden, um die Zahl nach Ihren Wünschen aufzurunden oder einfach abzuschneiden ...

BrunoLM
quelle
Dies erhalten Sie, FormatExceptionwenn Sie dies auf dem angegebenen Eingang ausführen.
Andrew Savinykh
1
@zespri, nein, zumindest nicht in den meisten Kulturen ... Aber es würde in der Tat in Kulturen scheitern, in denen das Dezimaltrennzeichen nicht "ist".
Thomas Levesque
15

Sie können auch long.TryParseund verwenden long.Parse.

long l1;
l1 = long.Parse("1100.25");
//or
long.TryParse("1100.25", out l1);
Majid Zareei
quelle
6

Sie werden es aufgrund des Dezimalpunkts nicht direkt in long konvertieren können. Ich denke, Sie sollten es in dezimal konvertieren und dann in long konvertieren, ungefähr so:

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

hoffe das hilft!

liebe Informatik
quelle
3

long wird intern als System.Int64 dargestellt, eine 64-Bit-Ganzzahl mit Vorzeichen. Der Wert, den Sie "1100.25" angenommen haben, ist tatsächlich dezimal und nicht ganzzahlig, daher kann er nicht in long konvertiert werden.

Sie können verwenden:

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

um es in einen Dezimalwert umzuwandeln

sandyiit
quelle
2
long l1 = Convert.ToInt64(strValue);

Das sollte es tun.

stuartmclark
quelle
1

Sie können dies auch mit Int64.TryParseMethod tun . Es wird '0' zurückgegeben, wenn es sich um einen Zeichenfolgenwert handelt, der jedoch keinen Fehler generiert hat.

Int64 l1;

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

Sie können Ihre eigene Konvertierungsfunktion erstellen:

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

Es kann weiter verbessert werden:

  • leistungsmäßig
  • Verschärfen Sie die Validierung in dem Sinne, dass es derzeit egal ist, ob Zeichen nach der ersten Dezimalstelle keine Ziffern sind
  • Geben Sie das Rundungsverhalten als Parameter für die Konvertierungsfunktion an. Derzeit wird gerundet
Cosmin Sontu
quelle