Làm thế nào để chuyển đổi char thành int?


123

Cách thích hợp để chuyển đổi một là gì charđể int? Điều này mang lại 49:

int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works

Tôi không muốn chuyển đổi thành chuỗi và sau đó phân tích nó.


1
Có thể trùng lặp câu hỏi này .
RBT

Bản sao có thể có của Convert char thành int trong C #
GSerg

Câu trả lời:


282

Tôi ngạc nhiên không ai đề cập đến phương thức tĩnh được tích hợp ngay vào System.Char...

int val = (int)Char.GetNumericValue('8');
// val == 8

18
Điểm tốt! +1 Rất kỳ lạ là nó trả về một double, mặc dù
Marc Gravell

4
Tôi đồng ý, tôi không thể hiểu tại sao nó trả về 'gấp đôi' - làm thế nào một nhân vật có thể đại diện cho một số dấu phẩy động?
Joel Mueller

49
Có nhiều ký tự Unicode đại diện cho một số không nguyên, ví dụ: U + 2153 .
dtb

26
@dtb - Tôi chưa xem xét điều đó. Char.GetNumericValue('⅓')thực sự trở lại 0.3333.... Cảm ơn đã chỉ ra rằng!
Joel Mueller

1
Lưu ý chân: chức năng này hiện không có sẵn trong NetMF.
GisMofx

40

làm thế nào về (cho char c)

int i = (int)(c - '0');

mà chất nền của giá trị char?

Re câu hỏi API (ý kiến), có lẽ là một phương pháp mở rộng?

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

sau đó sử dụng int x = c.ParseInt32();


1
Tôi nên đề cập, tôi biết về điều này nhưng có cách nào khác không? Tôi muốn biết nếu có một API để làm điều này?
tvr

4
Nếu bạn muốn một bahavior tương tự int.Parse, nghĩa là một ngoại lệ được đưa vào đầu vào không hợp lệ, bạn sẽ cần thêm kiểm tra giới hạn bổ sung:if (i < 0 || i > 9) throw new FormatException();
Dirk Vollmar

@ user386338 Tôi sợ rằng không có.
Eugene Cheverda

@ user386338 - cập nhật với một tùy chọn tái API, cũng bao gồm @ phản hồi 0xA3 của
Marc Gravell

@ user386338 - xem câu trả lời của Joel cho phương pháp API sẵn có
Marc Gravell

21

Điều mà mọi người đang quên là giải thích TẠI SAO điều này xảy ra.

Char, về cơ bản là một số nguyên, nhưng có một con trỏ trong bảng ASCII. Tất cả các ký tự có một giá trị nguyên tương ứng như bạn có thể thấy rõ khi cố gắng phân tích nó.

Pranay rõ ràng có một bộ ký tự khác, đó là lý do tại sao mã NGUỒN không hoạt động. cách duy nhất là

int val = '1' - '0';

bởi vì điều này tìm kiếm giá trị số nguyên trong bảng '0'mà sau đó là 'giá trị cơ sở' trừ đi số của bạn ở định dạng char từ đây sẽ cung cấp cho bạn số gốc.


15
int i = (int)char.GetNumericValue(c);

Một lựa chọn khác:

int i = c & 0x0f;

Điều này sẽ thực hiện điều này là tốt.


4
int val = '1' - '0';

Điều này có thể được thực hiện bằng cách sử dụng mã ascii trong đó '0' là mức thấp nhất và số ký tự được tính từ đó


Thật là tuyệt vời! Imo giải pháp thanh lịch nhất ở đây.
arabisoft

3
int val = '1' - 48;

@Luke Xu: '0' có mã ASCII 0x30 là số thập phân 48, do đó, đây giống như '1' - '0'
NiKiZe

3

Bạn có thể sử dụng phương pháp mở rộng sau:

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

1
@ 0xA3 Việc kiểm tra phạm vi phải ở đầu phương thức nói chung. Về mặt ngữ nghĩa nếu chúng ta muốn chuyển đổi charsang intchúng ta phải kiểm tra phạm vi của tham số đầu vào, không phải intgiá trị đầu ra .
Eugene Cheverda

Không cần kiểm tra intgiá trị kết quả vì phạm vi ký tự số được thực hiện khi bắt đầu phương thức, do đó sẽ có giá trị kết quả chính xác, nếu char được chỉ định không nằm trong phạm vi ký tự số sẽ có ngoại lệ ném. Logic giống như bạn đã cung cấp nhưng kiểm tra phạm vi được thực hiện ở đầu phương thức.
Eugene Cheverda

Xin lỗi, tôi đã đọc sai mẫu mã của bạn. Đôi khi thật khó để nhìn thấy những điều rõ ràng nhất. Tôi cá là mã đã nói if (c < 0 || c > 9)...
Dirk Vollmar

1

Cách an toàn nhất để thực hiện việc này là sử dụng phương thức Int32.TryPude. Xem tại đây: http://dotnetperls.com/int-tryparse


TryPude dành cho các chuỗi không dành cho ký tự
tvr

Đúng vậy, nhưng vẫn là cách an toàn nhất để thực hiện chuyển đổi
MUG4N

1
Chuyển đổi một ký tự thành một số nguyên có phải là vấn đề bảo mật?
Joel Mueller

1
'Bảo mật' trong trường hợp này có nghĩa là nó sẽ không gây ra vấn đề nếu char của bạn không thực sự là số ascii - nó có thể là ký tự unicode nhiều byte.
Robin Bennett

1
int val = '1' & 15;

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

0 - 00110000

1 - 00110001

2 - 00110010

3 - 00110011

4 - 00110100

5 - 00110101

6 - 00110110

7 - 00110111

8 - 00111000

9 - 00111001

và nếu bạn nhận được mỗi một trong số 4 LSB đầu tiên (sử dụng bitwise AND 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, ...)


Làm thế nào điều này làm việc về các loại? bạn đang sử dụng toán tử bitwise giữa char và int rồi trả về int? Liệu logic AND sử dụng biểu diễn nhị phân của cả char và int và trả về một biểu diễn nhị phân và sau đó khi bạn định nghĩa var là một int nó sử dụng biểu diễn đó?
giảm nhẹ

@mitnomed có và nếu bạn sử dụng byte chẳng hạn thì nó sử dụng biểu diễn byte.
Tomer Wolberg

0

Bạn có thể thử một cái gì đó như thế này:

int val = Convert.ToInt32("" + '1');

Tại sao không chỉ .ToString ()?
Veikedo

@Veikedo anh ấy muốn một int chứ không phải một chuỗi.
hối lộ

6
Ý tôi làConvert.ToInt32('1'.ToString())
Veikedo

0

Một phần mở rộng của một số câu trả lời khác bao gồm biểu diễn thập lục phân:

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