Jak mogę przekonwertować dane z ciągu na długie w języku C #

102

Jak mogę przekonwertować dane z ciągu na długie w C #?

Mam dane

String strValue[i] ="1100.25";

teraz chcę to mieć

long l1;
MayureshP
źródło
1
Długie reprezentują liczby całkowite. Podałeś liczbę niecałkowitą. Co byś chciał z tym zrobić?
Jon Skeet
1
A co jeśli strValue to „1100.75”? Zobacz: stackoverflow.com/questions/633335/…
magma
@magma: jeśli zamienisz to na dziesiętne, to zaokrągli liczbę, tj. w tym przypadku, jeśli podana liczba wynosi 1100,75, to wyświetli 1101.
kocham Informatykę
1
@charlie Po prostu poruszyłem tę kwestię, ponieważ MayP nie wydawała się w pełni świadoma konsekwencji tutaj. Mógłby chcieć po prostu pozbyć się części niecałkowitej bez zaokrąglania i to jest w porządku, pod warunkiem, że naprawdę tego chce. Ale dziękuję.
magma

Odpowiedzi:

187

Ta odpowiedź już nie działa i nie mogę wymyślić nic lepszego niż inne odpowiedzi (patrz poniżej) wymienione tutaj. Przejrzyj je i zagłosuj na nie.

Convert.ToInt64("1100.25")

Podpis metody z MSDN:

public static long ToInt64(
    string value
)
Will Bellman
źródło
3
Tak to zrobiłem. Powinien być oznaczony jako poprawna odpowiedź.
sanpaco
2
Zwróci łańcuch o niepoprawnym formacie.
Badhon Jain
To nie działa. Błąd wyjątku formatu systemu. Pewien problem z łańcuchem znaków w nieprawidłowym formacie.
Ricardo Araújo
Zgadza się… to już nie działa, tak jak w 2013 roku. Wkrótce opublikuję aktualizację.
Will Bellman
46

Jeśli chcesz uzyskać część całkowitą tej liczby, musisz najpierw przekonwertować ją na liczbę zmiennoprzecinkową, a następnie rzucić na długość.

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

Możesz użyć Mathklasy, aby zaokrąglić liczbę, jak chcesz, lub po prostu skrócić ...

BrunoLM
źródło
To da ci, FormatExceptionjeśli uruchomisz to na określonym wejściu.
Andrew Savinykh
1
@zespri, nie, przynajmniej nie w większości kultur ... Ale to rzeczywiście by się nie udało w kulturach, w których separatorem dziesiętnym nie jest „”.
Thomas Levesque
16

Możesz także użyć long.TryParsei long.Parse.

long l1;
l1 = long.Parse("1100.25");
//or
long.TryParse("1100.25", out l1);
majid zareei
źródło
6

Nie będziesz w stanie zamienić go bezpośrednio na długi z powodu przecinka dziesiętnego, myślę, że powinieneś zamienić go na dziesiętny, a następnie zamienić na długi, coś takiego:

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

mam nadzieję że to pomoże!

kocham informatykę
źródło
3

long jest wewnętrznie reprezentowany jako System.Int64, który jest 64-bitową liczbą całkowitą ze znakiem. Wartość, którą wybrałeś "1100,25" jest w rzeczywistości dziesiętną, a nie całkowitą, dlatego nie można jej zamienić na długość.

Możesz użyć:

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

aby przekonwertować go na wartość dziesiętną

sandyiit
źródło
2
long l1 = Convert.ToInt64(strValue);

Że należy to zrobić.

stuartmclark
źródło
1

Możesz również użyć Int64.TryParsemetody. Zwróci „0”, jeśli ich wartość jest ciągiem znaków, ale nie wygenerowała błędu.

Int64 l1;

Int64.TryParse(strValue, out l1);
Pankaj Agarwal
źródło
1

Możesz stworzyć własną funkcję konwersji:

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

Można go dalej ulepszyć:

  • pod względem wydajności
  • czynią walidację bardziej rygorystyczną w tym sensie, że obecnie nie ma znaczenia, czy znaki po pierwszym dziesiętnym nie są cyframi
  • określ zachowanie zaokrąglania jako parametr funkcji konwersji. obecnie wykonuje zaokrąglanie
Cosmin Sontu
źródło