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;

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
)

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 ...


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


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!


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



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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.