Làm cách nào để chuyển đổi dữ liệu từ chuỗi sang dài trong c #


101

Làm cách nào để chuyển đổi dữ liệu từ chuỗi sang dài trong C #?

Tôi có dữ liệu

String strValue[i] ="1100.25";

bây giờ tôi muốn nó trong

long l1;

1
Độ dài đại diện cho số nguyên. Bạn đã cung cấp một số không phải là số nguyên. Bạn muốn làm gì với điều đó?
Jon Skeet

1
Điều gì sẽ xảy ra nếu strValue là "1100.75"? Xem: stackoverflow.com/questions/633335/...
magma

@magma: nếu bạn chuyển đổi nó thành số thập phân sau đó nó sẽ được làm tròn số, tức là trong trường hợp này nếu số lượng nhất định là 1100,75 sau đó nó sẽ ra 1101.
tình yêu khoa học máy tính

1
@charlie Tôi chỉ đang nêu vấn đề, bởi vì MayP dường như không nhận thức đầy đủ về hàm ý ở đây. Anh ta có thể chỉ muốn loại bỏ phần không phải là số nguyên mà không cần làm tròn, và điều đó tốt thôi, miễn là đó thực sự là điều anh ta muốn. Cảm ơn bạn mặc dù.
magma

Câu trả lời:


187

Câu trả lời này không còn hoạt động nữa và tôi không thể nghĩ ra bất cứ điều gì tốt hơn thì các câu trả lời khác (xem bên dưới) được liệt kê ở đây. Vui lòng xem xét và bỏ phiếu cho họ.

Convert.ToInt64("1100.25")

Chữ ký phương thức từ MSDN:

public static long ToInt64(
    string value
)

3
Đây là cách tôi đã làm điều đó. Nên được đánh dấu là câu trả lời đúng.
sanpaco 17/10/13

2
Nó sẽ cung cấp cho chuỗi không có định dạng đúng ngoại lệ.
Badhon Jain

Điều này không hoạt động. Lỗi ngoại lệ định dạng hệ thống. Một số vấn đề với chuỗi ký tự ở định dạng không chính xác.
Ricardo Araújo

Đó là chính xác .... điều này dường như không còn hoạt động, như nó đã xảy ra vào năm 2013. Tôi sẽ đăng một bản cập nhật trong thời gian ngắn.
Will Bellman

46

Nếu bạn muốn lấy phần nguyên của số đó, trước tiên bạn phải chuyển nó thành số thực sau đó ép kiểu long.

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

Bạn có thể sử dụng Mathclass để làm tròn số theo ý muốn hoặc chỉ cần cắt bớt ...


Điều này sẽ cung cấp cho bạn FormatExceptionnếu bạn chạy điều này trên đầu vào được chỉ định.
Andrew Savinykh

1
@zespri, không, ít nhất là không ở hầu hết các nền văn hóa ... Nhưng nó thực sự sẽ thất bại ở các nền văn hóa nơi dấu phân tách thập phân không phải là "."
Thomas Levesque

15

Bạn cũng có thể sử dụng long.TryParselong.Parse.

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


6

Bạn sẽ không thể chuyển đổi nó trực tiếp thành long vì dấu thập phân, tôi nghĩ bạn nên chuyển nó thành thập phân và sau đó chuyển nó thành dài như thế này:

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

hi vọng điêu nay co ich!


3

long được biểu thị bên trong là System.Int64, là một số nguyên có dấu 64-bit. Giá trị bạn đã lấy "1100,25" thực sự là số thập phân chứ không phải số nguyên do đó không thể chuyển đổi thành giá trị dài.

Bạn có thể dùng:

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

để chuyển nó thành giá trị thập phân



1

Bạn cũng có thể thực hiện bằng Int64.TryParseMethod. Nó sẽ trả về '0' nếu chúng là bất kỳ giá trị chuỗi nào nhưng không tạo ra lỗi.

Int64 l1;

Int64.TryParse(strValue, out l1);

1

Bạn có thể tạo hàm chuyển đổi của riêng mình:

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

Nó có thể được cải thiện hơn nữa:

  • hiệu suât khôn ngoan
  • làm cho việc xác thực chặt chẽ hơn theo nghĩa là nó hiện không quan tâm nếu các ký tự sau số thập phân đầu tiên không phải là chữ số
  • chỉ định hành vi làm tròn làm tham số cho hàm chuyển đổi. nó hiện đang làm tròn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.