Chuyển đổi char thành int trong C #


148

Tôi có một char trong c #:

char foo = '2';

Bây giờ tôi muốn đưa 2 vào một int. Tôi thấy rằng Convert.ToInt32 trả về giá trị thập phân thực của char chứ không phải số 2. Sau đây sẽ hoạt động:

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

int.parse chỉ hoạt động trên chuỗi là tốt.

Không có hàm riêng trong C # để chuyển từ char sang int mà không biến nó thành một chuỗi? Tôi biết điều này là tầm thường nhưng có vẻ kỳ lạ là không có gì bản địa để trực tiếp thực hiện chuyển đổi.

Câu trả lời:


143

Câu trả lời thú vị nhưng các tài liệu nói khác nhau:

Sử dụng các GetNumericValuephương thức để chuyển đổi một Charđối tượng đại diện cho một số thành một loại giá trị số. Sử dụng ParseTryParseđể chuyển đổi một ký tự trong chuỗi thành một Char đối tượng. Sử dụng ToStringđể chuyển đổi một Char đối tượng thành một Stringđối tượng.

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


à! Vì vậy, có một cái gì đó bản địa! Kì lạ là nó trả lại gấp đôi. Tôi thích câu trả lời này tốt hơn. Cảm ơn đã chỉ ra điều đó.
KeithA

92
@KeithA: Có một lý do để nó trả lại gấp đôi: char.GetNumericValue('¼')mang lại 0,25. Niềm vui của Unicode ... ;-)
Heinzi

1
Đây không phải là câu trả lời trả lời câu hỏi thực tế, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') và bất kỳ char không số nào sẽ luôn trả về -1 - Jeremy Ruten đã đăng câu trả lời đúng
Rusty Nail

2
@RustyNail trong trường hợp của câu hỏi ban đầu - hỏi cụ thể nơi anh ta biết char đại diện cho một số - đây là câu trả lời đúng
Don Cheadle

@mmcrae Tôi không nghĩ vậy - câu hỏi ban đầu yêu cầu charđể intmà không sử dụng stringđầu tiên.
NetMage

163

Điều này sẽ chuyển đổi nó thành một int:

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

Điều này hoạt động bởi vì mỗi nhân vật được đại diện bên trong bởi một số. Các ký tự '0' đến '9' được biểu thị bằng các số liên tiếp, do đó, việc tìm ra sự khác biệt giữa các ký tự '0' và '2' dẫn đến số 2.


5
Nó giả định một bộ ký tự nhất định.
EricSchaefer

8
Không, không, miễn là các chữ số theo thứ tự (trình biên dịch yêu cầu bộ ký tự) nó sẽ hoạt động, bất kể chúng bắt đầu từ giá trị nào.
Jeremy Ruten

2
Điều này tốt, ngoại trừ việc bạn vẫn cần kiểm tra giới hạn trước, và tại thời điểm đó tôi không chắc liệu int.parse (foo.ToString ()) có nhanh hơn không.
Matthew Flaschen

7
@EricSchaefer Nhưng đó là một giả định an toàn trong C #: charluôn là UTF-16.
Svick

2
@svick điểm nhỏ và cũ bây giờ, nhưng trong thời gian kể từ khi bạn đăng bài này, chúng tôi đã có Core xuất hiện, sử dụng UTF-8. Vẫn là một giả định an toàn.
Joel Coehoorn

84

Có ai cân nhắc sử dụng int.Parse()int.TryParse()thích cái này không

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

Thậm chí tốt hơn như thế này

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

Nó an toàn hơn rất nhiều và ít xảy ra lỗi


2
Hoàn toàn là phương pháp đúng đắn. Chọn cái đầu tiên nếu bạn muốn ném đầu vào không int, cái thứ hai nếu bạn muốn làm cái gì đó khác.
Jay Bazuzi

Đây là một cách tiếp cận tốt cho một phương pháp chuyển đổi chung. Bên cạnh đó, một ví dụ khác về cách .NET thúc đẩy bloatware. (Ý tôi là tiếp tục và kiểm tra đơn vị TryPude () và ToString () - bạn không thể, không thực tế).
đăng xuất

5
@logout không, đó là một ví dụ về cách một câu trả lời trên StackOverflow thúc đẩy bloatware. Điều này thực sự không cần thiết, và tôi không hiểu tại sao điều này được coi là vượt trội so với việc trừ '0'khỏi char.
Roman Starkov

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

và bạn có thể tạo một phương thức tĩnh từ nó:

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

Đây là những gì tôi đang tìm kiếm. Bạn có thể giải thích những gì bạn đang làm với phần không trừ.
Xonatron

10

Thử cái này

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

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

Nhận xét của bạn nói '9', nhưng mã của bạn có 9, sẽ không được biên dịch.
Svick

7

Theo mặc định, bạn sử dụng UNICODE vì vậy tôi khuyên bạn nên sử dụng phương pháp của errory

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

Mặc dù các giá trị số bên dưới là giống nhau cho các chữ số và ký tự Latin cơ bản.


4

Điều này chuyển đổi thành một số nguyên và xử lý unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Bạn có thể đọc thêm ở đây .


3

Cách thực sự là:

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

"theNameOfYourInt" - int bạn muốn char của bạn được chuyển đổi thành.

"theNameOfYourChar" - Char bạn muốn được sử dụng để nó sẽ được chuyển thành int.

Để lại mọi thứ khác.


2

Nguyên tắc:

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

Nhị phân của các ký tự ASCII 0-9 là:

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

và nếu bạn nhận được mỗi một trong số 4 LSB đầu tiên (sử dụng bitwise VÀ với 8'b00001111 tương đương với 15), bạn sẽ nhận được số thực tế (0000 = 0,0001 = 1,0010 = 2, ...)

Sử dụng:

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

2
Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
yivi

2

Tôi đồng ý với @Chad Grant

Cũng đúng nếu bạn chuyển đổi thành chuỗi thì bạn có thể sử dụng giá trị đó dưới dạng số như đã nói trong câu hỏi

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

Tôi đã cố gắng tạo ra một ví dụ đơn giản và dễ hiểu hơn

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

char.GetNumericValue (v) trả về gấp đôi và chuyển đổi thành (int)

Sử dụng nhiều hơn như là một mảng

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

0

So sánh một số phương pháp dựa trên kết quả khi ký tự không phải là chữ số 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

Tôi đang sử dụng Compact Framework 3.5 và không có phương thức "char.Pude". Tôi nghĩ không tệ khi sử dụng lớp Convert. (Xem CLR qua 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);

Hoạt động với char ASCII hoặc char char


-4

Điều này làm việc cho tôi:

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

5
Làm thế nào là khác nhau int.Parse(foo.ToString()), ngoại trừ là ít đọc?
Svick

-5

Tôi đã thấy nhiều câu trả lời nhưng chúng có vẻ khó hiểu với tôi. Chúng ta không thể đơn giản sử dụng Kiểu Đúc.

Ví dụ: -

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

1
Điều này sẽ trả về mã ASCII của ký tự 2, không phải giá trị 2.
cavpollo

Sau đó, làm thế nào về việc sử dụng char.GetNumericValue (Nó trả về giá trị gấp đôi) và chuyển nó thành int.
Học viên

Vâng, đó là những gì câu trả lời được chấp nhận của @Chad Grant đề xuất
cavpollo
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.