เป็นวิธีที่เหมาะสมในการแปลงอะไรcharไปint? สิ่งนี้ให้49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
ฉันไม่ต้องการแปลงเป็นสตริงแล้วแยกวิเคราะห์
เป็นวิธีที่เหมาะสมในการแปลงอะไรcharไปint? สิ่งนี้ให้49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
ฉันไม่ต้องการแปลงเป็นสตริงแล้วแยกวิเคราะห์
คำตอบ:
ฉันแปลกใจที่ไม่มีใครพูดถึงวิธีการคงที่ที่สร้างขึ้นในSystem.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
doubleแม้ว่า
Char.GetNumericValue('⅓') 0.3333...ขอบคุณที่ชี้ให้ดู!
แล้ว (สำหรับchar c)
int i = (int)(c - '0');
การย่อยของค่าถ่านคืออะไร
คำถามเกี่ยวกับ API (ความคิดเห็น) อาจเป็นวิธีการขยายหรือไม่
public static class CharExtensions {
public static int ParseInt32(this char value) {
int i = (int)(value - '0');
if (i < 0 || i > 9) throw new ArgumentOutOfRangeException("value");
return i;
}
}
จากนั้นใช้ int x = c.ParseInt32();
int.Parseกล่าวคือมีข้อยกเว้นเกิดขึ้นกับอินพุตที่ไม่ถูกต้องคุณจะต้องเพิ่มการตรวจสอบขอบเขตเพิ่มเติม:if (i < 0 || i > 9) throw new FormatException();
สิ่งที่ทุกคนลืมคือการอธิบายว่าทำไมสิ่งนี้จึงเกิดขึ้น
Char เป็นจำนวนเต็ม แต่มีตัวชี้ในตาราง ASCII อักขระทั้งหมดมีค่าจำนวนเต็มที่สอดคล้องกันดังที่คุณเห็นได้ชัดเจนเมื่อพยายามแยกวิเคราะห์
Pranay มีชุดอักขระที่แตกต่างกันอย่างชัดเจนนั่นคือสาเหตุที่รหัส HIS ใช้ไม่ได้ วิธีเดียวคือ
int val = '1' - '0';
เนื่องจากสิ่งนี้ค้นหาค่าจำนวนเต็มในตาราง'0'ซึ่งเป็น 'ค่าฐาน' ที่ลบตัวเลขของคุณในรูปแบบถ่านจากสิ่งนี้จะทำให้คุณได้ตัวเลขเดิม
int i = (int)char.GetNumericValue(c);
อีกทางเลือกหนึ่ง:
int i = c & 0x0f;
สิ่งนี้ควรทำให้สำเร็จเช่นกัน
int val = '1' - '0';
สามารถทำได้โดยใช้รหัส ascii โดยที่ '0' เป็นค่าต่ำสุดและอักขระตัวเลขจะนับขึ้นจากที่นั่น
int val = '1' - 48;
คุณสามารถใช้วิธีการขยายต่อไปนี้:
public static class CharExtensions
{
public static int CharToInt(this char c)
{
if (c < '0' || c > '9')
throw new ArgumentException("The character should be a number", "c");
return c - '0';
}
}
charไปintเราจะต้องตรวจสอบช่วงของพารามิเตอร์ที่ไม่ได้ผลผลิตintคุ้มค่า
intค่าผลลัพธ์เนื่องจากช่วงของอักขระตัวเลขถูกดำเนินการในช่วงเริ่มต้นของวิธีการดังนั้นจะมีค่าผลลัพธ์ที่ถูกต้องหาก char ที่ระบุไม่อยู่ในช่วงของอักขระตัวเลขจะมีข้อยกเว้น ตรรกะเดียวกันกับที่คุณระบุ แต่การตรวจสอบช่วงจะดำเนินการที่จุดเริ่มต้นของวิธีการ
if (c < 0 || c > 9)...
วิธีที่ปลอดภัยที่สุดในการทำสิ่งนี้คือการใช้เมธอด Int32.TryParse ดูที่นี่: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
ไบนารีของอักขระ ASCII 0-9 คือ:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
และถ้าคุณใช้ LSB 4 ตัวแรกในแต่ละตัว (โดยใช้ bitwise และด้วย 8'b00001111 ที่เท่ากับ 15) คุณจะได้จำนวนจริง (0000 = 0,0001 = 1,0010 = 2, ... )
ส่วนขยายของคำตอบอื่น ๆ ที่ครอบคลุมการแสดงเลขฐานสิบหก:
public int CharToInt(char c)
{
if (c >= '0' && c <= '9')
{
return c - '0';
}
else if (c >= 'a' && c <= 'f')
{
return 10 + c - 'a';
}
else if (c >= 'A' && c <= 'F')
{
return 10 + c - 'A';
}
return -1;
}