C # 'da veriyi dizeden uzuna nasıl dönüştürebilirim


102

C # 'da verileri dizeden uzuna nasıl dönüştürebilirim?

Verilerim var

String strValue[i] ="1100.25";

şimdi onu istiyorum

long l1;

1
Uzunlar tam sayıları temsil eder. Tam sayı olmayan bir verdiniz. Bununla ne yapmak istersin?
Jon Skeet

1
StrValue "1100.75" ise ne olur? Bakınız: stackoverflow.com/questions/633335/…
magma

@magma: Eğer ondalık dönüştürmek eğer verilen sayı sonra çıktısı verecektir 1101. 1.100,75 olsaydı o zaman bu durumda yani numarayı, kapalı yuvarlak olacaktır
aşk Bilgisayar bilimi

1
@charlie Ben sadece konuyu gündeme getiriyordum, çünkü MayP buradaki sonuçların tam olarak farkında görünmüyordu. Tam sayı olmayan kısımdan herhangi bir yuvarlama yapmadan kurtulmak isteyebilir ve bu, gerçekten istediği şey olması koşuluyla sorun değil. Yine de teşekkürler.
magma

Yanıtlar:


187

Bu cevap artık işe yaramıyor ve burada listelenen diğer cevaplardan (aşağıya bakın) daha iyi bir şey bulamıyorum. Lütfen bunları inceleyin ve olumlu oy verin.

Convert.ToInt64("1100.25")

MSDN'den yöntem imzası:

public static long ToInt64(
    string value
)

3
Ben böyle yaptım. Doğru cevap olarak işaretlenmelidir.
sanpaco

2
Dizgeye doğru formatta olmayan istisna verecektir.
Badhon Jain

Bu çalışmıyor. Sistem biçimi istisna hatası. Hatalı formattaki karakter zinciriyle ilgili bazı sorunlar.
Ricardo Araújo

Bu doğru .... bu artık 2013'te olduğu gibi çalışmıyor gibi görünüyor. Kısa bir süre sonra bir güncelleme yayınlayacağım.
Will Bellman

46

Bu sayının tamsayı kısmını elde etmek istiyorsanız, önce onu kayan bir sayıya dönüştürmeli ve ardından uzun çevirmelisiniz.

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

MathSayıyı istediğiniz gibi yuvarlamak için sınıfı kullanabilirsiniz veya sadece kısaltabilirsiniz ...


Bunu FormatExceptionbelirtilen girişte çalıştırırsanız bu size verecektir .
Andrew Savinykh

1
@zespri, hayır, en azından çoğu kültürde değil ... Ama ondalık ayırıcının "" olmadığı kültürlerde gerçekten başarısız olur.
Thomas Levesque

17

Ayrıca long.TryParseve kullanabilirsiniz long.Parse.

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


6

Ondalık noktası nedeniyle onu doğrudan uzuna çeviremezsiniz, bence onu ondalık sayıya çevirmeli ve daha sonra uzun bir şeye dönüştürmelisiniz:

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

Bu yardımcı olur umarım!


3

long, dahili olarak 64 bitlik işaretli bir tamsayı olan System.Int64 olarak temsil edilir. "1100.25" olarak aldığınız değer aslında ondalıktır ve tamsayı değildir, bu nedenle uzun bir değere dönüştürülemez.

Kullanabilirsiniz:

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

ondalık değere dönüştürmek için



1

Int64.TryParseYöntem kullanarak da yapabilirsiniz . Herhangi bir dize değeriyse, ancak bir hata oluşturmadıysa '0' döndürür.

Int64 l1;

Int64.TryParse(strValue, out l1);

1

Kendi dönüştürme işlevinizi oluşturabilirsiniz:

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

Daha da geliştirilebilir:

  • performans açısından akıllıca
  • Doğrulamayı, ilk ondalıktan sonraki karakterlerin rakam olmaması halihazırda umursamadığı için daha sıkı hale getirin
  • yuvarlama davranışını dönüştürme işlevi için parametre olarak belirtin. şu anda yuvarlama yapıyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.