Apa cara yang tepat untuk mengkonversi charke int? Ini memberi 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Saya tidak ingin mengubahnya menjadi string dan kemudian menguraikannya.
Apa cara yang tepat untuk mengkonversi charke int? Ini memberi 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Saya tidak ingin mengubahnya menjadi string dan kemudian menguraikannya.
Jawaban:
Saya terkejut tidak ada yang menyebutkan metode statis yang dibangun langsung ke System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
double, meskipun
Char.GetNumericValue('⅓')memang kembali 0.3333.... Terima kasih telah menunjukkannya!
bagaimana dengan (untuk char c)
int i = (int)(c - '0');
yang melakukan substraksi dari nilai char?
Apakah pertanyaan API (komentar), mungkin metode ekstensi?
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;
}
}
lalu gunakan int x = c.ParseInt32();
int.Parse, yaitu pengecualian dilemparkan pada input yang tidak valid Anda perlu menambahkan pemeriksaan batas tambahan:if (i < 0 || i > 9) throw new FormatException();
Apa yang semua orang lupakan adalah menjelaskan MENGAPA ini terjadi.
A Char, pada dasarnya adalah integer, tetapi dengan penunjuk di tabel ASCII. Semua karakter memiliki nilai integer yang sesuai seperti yang dapat Anda lihat dengan jelas saat mencoba menguraikannya.
Pranay jelas memiliki himpunan karakter yang berbeda, itulah sebabnya kodeNYA tidak berfungsi. satu-satunya cara adalah
int val = '1' - '0';
karena ini mencari nilai integer dalam tabel '0'yang kemudian merupakan 'nilai dasar' mengurangi bilangan Anda dalam format karakter dari ini akan memberi Anda bilangan asli.
Anda dapat menggunakan metode ekstensi berikut:
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';
}
}
charke intkita harus memeriksa rentang parameter input, bukan nilai output int.
intnilai hasil karena rentang karakter numerik dilakukan pada awal metode, sehingga akan ada nilai yang benar, jika karakter yang ditentukan tidak berada dalam rentang karakter numerik, pengecualian akan muncul. Logika yang sama seperti yang Anda berikan tetapi pemeriksaan rentang dilakukan di awal metode.
if (c < 0 || c > 9)...
Cara paling aman untuk melakukannya adalah menggunakan metode Int32.TryParse. Lihat di sini: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
Biner dari karakter ASCII 0-9 adalah:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
dan jika Anda mengambil masing-masing 4 LSB pertama (menggunakan bitwise AND dengan 8'b00001111 yang setara dengan 15) Anda mendapatkan angka sebenarnya (0000 = 0,0001 = 1,0010 = 2, ...)
Perpanjangan dari beberapa jawaban lain yang mencakup representasi heksadesimal:
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;
}