Konversi char ke int di C #

149

Saya memiliki char di c #:

char foo = '2';

Sekarang saya ingin memasukkan 2 ke int. Saya menemukan bahwa Convert.ToInt32 mengembalikan nilai desimal sebenarnya dari char dan bukan angka 2. Berikut ini akan berfungsi:

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

int.parse hanya bekerja pada string juga.

Apakah tidak ada fungsi asli di C # untuk beralih dari char ke int tanpa membuatnya menjadi string? Saya tahu ini sepele tetapi sepertinya aneh bahwa tidak ada yang asli untuk langsung melakukan konversi.

KeithA
sumber

Jawaban:

144

Jawaban menarik tetapi dokumen mengatakan berbeda:

Gunakan GetNumericValuemetode untuk mengonversi Charobjek yang mewakili angka ke tipe nilai numerik. Gunakan Parsedan TryParseuntuk mengkonversi karakter dalam string menjadi Char objek. Gunakan ToStringuntuk mengonversi Char objek ke Stringobjek.

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

Chad Grant
sumber
ahh! jadi ada sesuatu yang asli! Aneh bahwa itu mengembalikan ganda. Saya suka jawaban ini lebih baik. Terima kasih telah menunjukkannya.
KeithA
92
@KeithA: Ada alasan untuk mengembalikan dua kali lipat: char.GetNumericValue('¼')menghasilkan 0,25.
Kegembiraan
1
Ini bukan jawaban yang menjawab pertanyaan aktual, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') dan setiap karakter non numerik akan selalu kembali -1 - Jeremy Ruten telah memposting jawaban yang benar
Rusty Nail
2
@RustyNail dalam kasus pertanyaan aslinya - menanyakan secara spesifik di mana dia tahu char mewakili angka - ini adalah jawaban yang tepat
Don Cheadle
@mmcrae Saya tidak berpikir begitu - pertanyaan awal meminta charuntuk inttanpa menggunakan stringpertama.
NetMage
164

Ini akan mengubahnya menjadi int:

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

Ini berfungsi karena setiap karakter secara internal diwakili oleh angka. Karakter '0' hingga '9' diwakili oleh angka berurutan, sehingga menemukan perbedaan antara karakter '0' dan '2' menghasilkan angka 2.

Jeremy Ruten
sumber
5
Ini mengasumsikan seperangkat karakter tertentu.
EricSchaefer
8
Tidak, tidak, selama digit-nya teratur (yang dibutuhkan oleh kompiler dari charset) itu akan berfungsi, tidak peduli berapa nilai mereka mulai.
Jeremy Ruten
2
Ini bagus, kecuali bahwa Anda masih perlu melakukan pengecekan batas terlebih dahulu, dan pada saat itu saya tidak yakin apakah int.parse (foo.ToString ()) lebih cepat.
Matthew Flaschen
7
@EricSchaefer Tapi itu asumsi yang aman dalam C #: charselalu UTF-16.
svick
2
@svick titik kecil dan tua sekarang, tetapi pada saat Anda memposting ini, kami telah mengeluarkan Core, yang menggunakan UTF-8. Namun, masih asumsi yang aman.
Joel Coehoorn
84

Adakah yang mempertimbangkan untuk menggunakan int.Parse()dan int.TryParse()menyukai ini

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

Bahkan lebih baik seperti ini

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

Jauh lebih aman dan lebih sedikit kesalahan

salah
sumber
2
Benar-benar pendekatan yang tepat. Pilih yang pertama jika Anda ingin input non-int untuk melempar, yang kedua jika Anda ingin melakukan sesuatu yang lain.
Jay Bazuzi
Ini adalah pendekatan yang baik untuk metode konversi generik. Selain itu, ini contoh lain tentang bagaimana .NET mempromosikan bloatware. (Maksud saya lanjutkan dan uji unit TryParse () dan ToString () - Anda tidak bisa, tidak secara praktis).
logout
5
@logout no, ini adalah contoh bagaimana jawaban di StackOverflow mempromosikan bloatware. Ini memang kembung yang tidak perlu, dan saya tidak mengerti mengapa ini dianggap lebih unggul daripada mengurangi '0'dari char.
Roman Starkov
26
char c = '1';
int i = (int)(c-'0');

dan Anda dapat membuat metode statis dari itu:

static int ToInt(this char c)
{
    return (int)(c - '0');
}
sontek
sumber
Ini yang saya cari. Anda mungkin bisa menjelaskan apa yang Anda lakukan dengan bagian minus nol.
Xonatron
10

Coba ini

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

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
RollerCosta
sumber
Komentar Anda mengatakan '9', tetapi kode Anda sudah 9, yang tidak dapat dikompilasi.
svick
7

Secara default Anda menggunakan UNICODE jadi saya sarankan menggunakan metode yang salah

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

Meskipun nilai numerik di bawah adalah sama untuk digit dan karakter dasar Latin.

Nikolay
sumber
4

Ini mengkonversi ke integer dan menangani unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Anda dapat membaca lebih lanjut di sini .

Dan Friedman
sumber
4

Cara sebenarnya adalah:

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

"theNameOfYourInt" - int yang Anda inginkan untuk diubah char Anda.

"theNameOfYourChar" - Char yang ingin Anda gunakan sehingga akan diubah menjadi int.

Biarkan yang lainnya.

Normantas Stankevičius
sumber
2

Prinsip:

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

Biner dari charecters 0-9 ASCII adalah:

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

dan jika Anda mengambil masing-masing dari mereka 4 LSB pertama (menggunakan bitwise AND dengan 8'b00001111 yang sama dengan 15) Anda mendapatkan angka aktual (0000 = 0,0001 = 1.0010 = 2, ...)

Pemakaian:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}
Tomer Wolberg
sumber
2
Sementara cuplikan kode ini mungkin solusinya, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
yivi
2

Saya setuju dengan @Chad Grant

Juga benar jika Anda mengonversi ke string maka Anda dapat menggunakan nilai itu sebagai angka seperti yang dikatakan dalam pertanyaan

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

Saya mencoba membuat contoh yang lebih sederhana dan mudah dimengerti

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

char.GetNumericValue (v) kembali sebagai dua kali lipat dan dikonversi ke (int)

Penggunaan lebih lanjut sebagai array

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

Perbandingan beberapa metode berdasarkan hasil ketika karakter bukan digit 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 
Slai
sumber
0

Saya menggunakan Compact Framework 3.5, dan tidak memiliki metode "char.Parse". Saya pikir tidak buruk untuk menggunakan kelas Convert. (Lihat CLR via 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);

Bekerja dengan char ASCII atau char Unicode

antonio
sumber
-4

Ini bekerja untuk saya:

int bar = int.Parse("" + foo);
Renán Díaz
sumber
5
Bagaimana itu berbeda dari int.Parse(foo.ToString()), kecuali karena kurang dibaca?
svick
-5

Saya telah melihat banyak jawaban tetapi tampaknya membingungkan bagi saya. Tidak bisakah kita cukup menggunakan Tipe Casting.

Sebagai contoh: -

int s;
char i= '2';
s = (int) i;
Pelajar
sumber
1
Ini akan mengembalikan kode ASCII dari karakter 2, bukan nilai 2.
cavpollo
Lalu bagaimana dengan menggunakan char.GetNumericValue (Ini mengembalikan nilai ganda) dan melemparkannya ke int.
Learner
Yup, itulah yang diusulkan jawaban yang diterima @Chad Grant
cavpollo