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ó.
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ó.
Câu trả lời:
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
double
, mặc dù
Char.GetNumericValue('⅓')
thực sự trở lại 0.3333...
. Cảm ơn đã chỉ ra rằng!
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();
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();
Đ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.
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';
}
}
char
sang int
chúng ta phải kiểm tra phạm vi của tham số đầu vào, không phải int
giá trị đầu ra .
int
giá 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.
if (c < 0 || c > 9)
...
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
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, ...)
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;
}