แปลงถ่านเป็น int ใน C #


148

ฉันมีถ่านใน c #:

char foo = '2';

ตอนนี้ฉันอยากให้ทั้ง 2 เป็น int ฉันพบว่า Convert.ToInt32 ส่งคืนค่าทศนิยมจริงของ char และไม่ใช่ตัวเลข 2 ข้อมูลต่อไปนี้จะทำงาน:

int bar = Convert.ToInt32(new string(foo, 1));

int.parse ใช้งานได้กับสตริงเท่านั้นเช่นกัน

ไม่มีฟังก์ชั่นพื้นเมืองใน C # ที่จะไปจากถ่านเพื่อ int โดยไม่ทำให้มันเป็นสตริง? ฉันรู้ว่านี่มันเล็กน้อย แต่ก็แปลก ๆ ที่ไม่มีคนพื้นเมืองที่ทำให้เกิดการเปลี่ยนแปลงโดยตรง

คำตอบ:


143

คำตอบที่น่าสนใจ แต่เอกสารพูดต่างกัน:

ใช้GetNumericValueวิธีการในการแปลงCharวัตถุที่แสดงตัวเลขเป็นชนิดค่าตัวเลข ใช้ ParseและTryParseเพื่อแปลงอักขระในสตริงเป็นChar วัตถุ ใช้ToStringในการแปลงChar วัตถุเป็นStringวัตถุ

http://msdn.microsoft.com/en-us/library/system.char.aspx


อ่า! ดังนั้นจึงมีสิ่งที่พื้นเมือง! มันแปลกที่มันจะคืนค่าเป็นสองเท่า ฉันชอบคำตอบนี้ดีกว่า ขอบคุณที่ชี้นำ
KeithA

92
@KeithA: มีเหตุผลที่ทำให้มันกลับมาเป็นสองเท่า: ได้char.GetNumericValue('¼')ผลตอบแทน 0.25 ความสุขของ Unicode ... ;-)
Heinzi

1
นี่ไม่ใช่คำตอบที่ตอบคำถามจริง Char.GetNumericValue ('o'), Char.GetNumericValue ('w') และอักขระที่ไม่ใช่ตัวเลขใด ๆ จะคืนค่า -1 เสมอ - Jeremy Ruten ได้โพสต์คำตอบที่ถูกต้อง
Rusty Nail

2
@RealNail ในกรณีของคำถามต้นฉบับ - ถามเฉพาะที่เขารู้ว่าถ่านแทนตัวเลข - นี่คือคำตอบที่ถูกต้อง
Don Cheadle

@ mmcrae ฉันไม่คิดอย่างนั้น - คำถามเดิมถาม charที่จะintไม่ใช้stringครั้งแรก
NetMage

163

สิ่งนี้จะแปลงเป็น int:

char foo = '2';
int bar = foo - '0';

วิธีนี้ใช้ได้ผลเพราะตัวเลขแต่ละตัวมีการแสดงภายใน อักขระ '0' ถึง '9' แสดงด้วยตัวเลขที่ต่อเนื่องกันดังนั้นการค้นหาความแตกต่างระหว่างผลลัพธ์ '0' และ '2' ในหมายเลข 2


5
มันถือว่าชุดตัวละครบางอย่าง
EricSchaefer

8
ไม่มันไม่ได้ตราบใดที่ตัวเลขนั้นอยู่ในระเบียบ (ซึ่งคอมไพเลอร์ต้องการชุดอักขระ) มันจะทำงานได้ไม่ว่าจะเริ่มด้วยอะไรก็ตาม
Jeremy Ruten

2
นี่เป็นเรื่องปกติยกเว้นคุณยังต้องตรวจสอบขอบเขตก่อนและถึงจุดนั้นฉันไม่แน่ใจว่า int.parse (foo.ToString ()) นั้นเร็วกว่าหรือไม่
467 Matthew Flaschen

7
@EricSchaefer แต่นั่นเป็นสมมติฐานที่ปลอดภัยใน C #: charเป็น UTF-16 เสมอ
svick

2
@svick เป็นจุดเล็ก ๆ และแก่แล้วในตอนนี้ แต่ในเวลาที่คุณโพสต์สิ่งนี้เรามี Core ออกมาซึ่งใช้ UTF-8 ยังคงเป็นสมมติฐานที่ปลอดภัยแม้ว่า
Joel Coehoorn

84

มีใครพิจารณาใช้int.Parse()และint.TryParse()เช่นนี้

int bar = int.Parse(foo.ToString());

ดียิ่งกว่านี้อีก

int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
    //Do something to correct the problem
}

มันปลอดภัยและผิดพลาดน้อยกว่ามาก


2
แนวทางที่ถูกต้องอย่างแน่นอน เลือกอันแรกถ้าคุณต้องการให้อินพุทที่ไม่ใช่อินพุทที่สองถ้าคุณต้องการทำอย่างอื่น
Jay Bazuzi

นี่เป็นวิธีที่ดีสำหรับวิธีการแปลงแบบทั่วไป มันเป็นอีกตัวอย่างหนึ่งของวิธีที่. NET ส่งเสริม bloatware (ฉันหมายถึงไปและทดสอบหน่วย TryParse () และ ToString () - คุณทำไม่ได้ไม่ใช่ในทางปฏิบัติ)
ออกจากระบบ

5
@ ไม่ได้ออกมันเป็นตัวอย่างของวิธีการที่คำตอบเกี่ยวกับ StackOverflow ส่งเสริม bloatware นี่คือป่องจริง ๆ โดยไม่จำเป็นและฉันไม่เข้าใจว่าทำไมสิ่งนี้จึงถือว่าดีกว่าการลบออก'0'จากถ่าน
Roman Starkov

26
char c = '1';
int i = (int)(c-'0');

และคุณสามารถสร้างวิธีการคงที่จากมัน:

static int ToInt(this char c)
{
    return (int)(c - '0');
}

นี่คือสิ่งที่ฉันกำลังมองหา คุณอาจอธิบายสิ่งที่คุณกำลังทำกับส่วนลบเป็นศูนย์
Xonatron

10

ลองสิ่งนี้

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9

ความคิดเห็นของคุณบอกว่า'9'แต่รหัสของคุณมี9ซึ่งจะไม่รวบรวม
svick

7

โดยค่าเริ่มต้นคุณใช้ UNICODE ดังนั้นฉันขอแนะนำให้ใช้วิธีการที่ผิดพลาด

int bar = int.Parse(foo.ToString());

แม้ว่าค่าตัวเลขภายใต้จะเหมือนกันสำหรับหลักและตัวอักษรละตินพื้นฐาน


4

สิ่งนี้จะแปลงเป็นจำนวนเต็มและจัดการกับ Unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

คุณสามารถอ่านเพิ่มเติมที่นี่


4

วิธีที่แท้จริงคือ:

int theNameOfYourInt = (int) .Char.GetNumericValue (theNameOfYourChar);

"theNameOfYourInt" - int ที่คุณต้องการแปลงถ่านของคุณ

"theNameOfYourChar" - Char ที่คุณต้องการใช้ดังนั้นมันจะถูกเปลี่ยนเป็น int

ปล่อยให้ทุกสิ่งทุกอย่างเป็นไปได้


2

หลักการ:

char foo = '2';
int bar = foo & 15;

ไบนารีของ ASCII charecters 0-9 คือ:

0   -   0011 0000
1   -   0011 0001
2   -   0011 0010
3   -   0011 0011
4   -   0011 0100
5   -   0011 0101
6   -   0011 0110
7   -   0011 0111
8   -   0011 1000
9   -   0011 1001

และถ้าคุณใช้แต่ละ LSB 4 ตัวแรก (ใช้ bitwise และ 8'b00001111 ที่เท่ากับ 15) คุณจะได้รับจำนวนจริง (0000 = 0,0001 = 1,0010 = 2, ... )

การใช้งาน:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}

2
ในขณะที่ข้อมูลโค้ดนี้อาจเป็นโซลูชันรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพการโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ
yivi

2

ฉันเห็นด้วยกับ @Chad Grant

นอกจากนี้หากคุณแปลงเป็นสตริงคุณสามารถใช้ค่านั้นเป็นตัวเลขตามที่กล่าวไว้ในคำถาม

int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2

ฉันพยายามสร้างตัวอย่างที่ง่ายและเข้าใจได้ง่ายขึ้น

char v = '1';
int vv = (int)char.GetNumericValue(v); 

char.GetNumericValue (v) ส่งคืนเป็น double และแปลงเป็น (int)

การใช้งานที่มีความรู้มากขึ้นเป็นอาร์เรย์

int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();

0

การเปรียบเทียบวิธีการบางอย่างตามผลลัพธ์เมื่อตัวละครไม่ใช่ตัวเลข ASCII:

char c = '\n';                              
Debug.Print($"{c & 15}");                   // 10
Debug.Print($"{c ^ 48}");                   // 58
Debug.Print($"{c - 48}");                   // -38
Debug.Print($"{(uint)c - 48}");             // 4294967258
Debug.Print($"{char.GetNumericValue(c)}");  // -1 

0

ฉันใช้ Compact Framework 3.5 และไม่มีวิธี "char.Parse" ฉันคิดว่าการใช้คลาสแปลงไม่เลว (ดู CLR ผ่าน C #, Jeffrey Richter)

char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);

ทำงานร่วมกับ ASCII ถ่านหรือ Unicode ถ่าน


-4

สิ่งนี้ใช้ได้กับฉัน:

int bar = int.Parse("" + foo);

5
มันแตกต่างint.Parse(foo.ToString())อย่างไรยกเว้นการอ่านน้อยกว่า
svick

-5

ฉันเห็นคำตอบมากมาย แต่พวกเขาดูสับสนสำหรับฉัน ไม่เพียงแค่เราใช้ Type Casting

ตัวอย่างเช่น: -

int s;
char i= '2';
s = (int) i;

1
นี่จะคืนค่ารหัส ASCII ของอักขระ 2 ไม่ใช่ค่า 2
cavpollo

จากนั้นวิธีการเกี่ยวกับการใช้ char.GetNumericValue (มันจะส่งกลับค่าสองเท่า) และหล่อมันเพื่อ int
ผู้เรียน

ใช่นั่นคือสิ่งที่ @Chad Grant ให้คำตอบที่ยอมรับ
cavpollo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.