ฉันจะแปลงข้อมูลจากสตริงเป็น long ใน c # ได้อย่างไร


105

ฉันจะแปลงข้อมูลจาก string เป็น long ใน C # ได้อย่างไร

ฉันมีข้อมูล

String strValue[i] ="1100.25";

ตอนนี้ฉันต้องการมัน

long l1;

1
ลองแทนจำนวนเต็ม คุณได้ระบุจำนวนที่ไม่ใช่จำนวนเต็ม คุณต้องการทำอะไรกับสิ่งนั้น?
Jon Skeet

1
จะเกิดอะไรขึ้นถ้า strValue เป็น "1100.75" ดู: stackoverflow.com/questions/633335/…
magma

@magma: ถ้าคุณแปลงเป็นทศนิยมมันจะปัดเศษออกเช่นในกรณีนี้ถ้าให้เป็น 1100.75 ก็จะออก 1101
รักวิทยาการคอมพิวเตอร์

1
@ ชาร์ลีฉันเพียงแค่ยกประเด็นขึ้นมาเท่านั้นเพราะ MayP ดูเหมือนจะไม่ได้ตระหนักถึงความหมายที่นี่ เขาอาจต้องการเพียงแค่กำจัดส่วนที่ไม่ใช่จำนวนเต็มโดยไม่ต้องปัดเศษใด ๆ และนั่นก็เป็นสิ่งที่ดีหากเป็นสิ่งที่เขาต้องการจริงๆ ขอบคุณแม้ว่า
magma

คำตอบ:


190

คำตอบนี้ใช้ไม่ได้อีกต่อไปและฉันไม่สามารถหาอะไรที่ดีไปกว่าคำตอบอื่น ๆ ได้ (ดูด้านล่าง) ที่แสดงไว้ที่นี่ โปรดตรวจสอบและโหวตให้คะแนน

Convert.ToInt64("1100.25")

ลายเซ็นวิธีจาก MSDN:

public static long ToInt64(
    string value
)

3
นี่คือวิธีที่ฉันทำ ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
sanpaco

2
มันจะทำให้สตริงไม่อยู่ในรูปแบบที่ถูกต้องยกเว้น
Badhon Jain

วิธีนี้ใช้ไม่ได้ ข้อผิดพลาดข้อยกเว้นของรูปแบบระบบ ปัญหาบางอย่างเกี่ยวกับห่วงโซ่อักขระในรูปแบบที่ไม่ถูกต้อง
Ricardo Araújo

ถูกต้อง .... ดูเหมือนจะใช้ไม่ได้อีกต่อไปเหมือนในปี 2013 ฉันจะโพสต์การอัปเดตในไม่ช้า
Will Bellman

46

หากคุณต้องการรับส่วนจำนวนเต็มของจำนวนนั้นก่อนอื่นคุณต้องแปลงเป็นตัวเลขลอยตัวจากนั้นจึงร่ายยาว

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

คุณสามารถใช้Mathคลาสเพื่อปัดเศษจำนวนตามที่คุณต้องการหรือเพียงแค่ตัดทอน ...


สิ่งนี้จะให้คุณFormatExceptionถ้าคุณเรียกใช้สิ่งนี้กับอินพุตที่ระบุ
Andrew Savinykh

1
@zespri ไม่อย่างน้อยก็ไม่ใช่ในวัฒนธรรมส่วนใหญ่ ... แต่มันจะล้มเหลวในวัฒนธรรมที่ตัวคั่นทศนิยมไม่ใช่ "."
Thomas Levesque

โดยใช้รหัสของคุณค่านี้ 2037104000005652013 เปลี่ยนเป็น 2037104000005651968?
Pranesh Janarthanan



6

คุณจะไม่สามารถแปลงเป็น long ได้โดยตรงเนื่องจากจุดทศนิยมฉันคิดว่าคุณควรแปลงเป็นทศนิยมแล้วแปลงเป็นแบบยาวดังนี้:

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

หวังว่านี่จะช่วยได้!


3

long จะแสดงภายในเป็น System.Int64 ซึ่งเป็นจำนวนเต็ม 64 บิตที่ลงชื่อ ค่าที่คุณได้รับ "1100.25" เป็นทศนิยมและไม่ใช่จำนวนเต็มดังนั้นจึงไม่สามารถแปลงเป็น long ได้

คุณสามารถใช้ได้:

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

เพื่อแปลงเป็นค่าทศนิยม



1

คุณยังสามารถทำได้โดยใช้Int64.TryParseวิธีการ มันจะคืนค่า '0' หากเป็นค่าสตริงใด ๆ แต่ไม่ได้สร้างข้อผิดพลาด

Int64 l1;

Int64.TryParse(strValue, out l1);

0

คุณสามารถสร้างฟังก์ชันการแปลงของคุณเอง:

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

สามารถปรับปรุงเพิ่มเติมได้:

  • ประสิทธิภาพที่ชาญฉลาด
  • ทำให้การตรวจสอบความถูกต้องเข้มงวดขึ้นในแง่ที่ว่าปัจจุบันไม่สนใจว่าอักขระหลังทศนิยมตัวแรกไม่ใช่ตัวเลขหรือไม่
  • ระบุพฤติกรรมการปัดเศษเป็นพารามิเตอร์สำหรับฟังก์ชันการแปลง มันกำลังปัดเศษ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.