C # 'da char'ı int'e dönüştür


160

C # 'da bir karakterim var:

char foo = '2';

Şimdi 2'yi bir int'e sokmak istiyorum. Convert.ToInt32'nin karakterin gerçek ondalık değerini 2 sayısını döndürdüğünü buldum. Aşağıdakiler çalışacaktır:

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

int.parse yalnızca dizeler üzerinde de çalışır.

C # 'da bir karakterden int karakterine bir dizge oluşturmadan gitmek için yerel bir işlev yok mu? Bunun önemsiz olduğunu biliyorum, ancak dönüşümü doğrudan yapacak yerel hiçbir şeyin olmaması garip görünüyor.

Yanıtlar:


154

İlginç cevaplar ama dokümanlar farklı söylüyor:

Bir sayıyı temsil eden GetNumericValuebir Charnesneyi sayısal değer türüne dönüştürmek için yöntemleri kullanın . Bir dizedeki bir karakteri nesneye dönüştürmek için Parseve tuşlarını kullanın . Bir nesneyi bir nesneye dönüştürmek için kullanın .TryParseCharToStringCharString

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


ahh! yani yerli bir şey var! Bir duble dönmesi garip. Bu cevabı daha çok beğendim. Gösterdiğiniz için teşekkürler.
KeithA

93
@KeithA: İkiye katlanmasının bir nedeni var: char.GetNumericValue('¼')0.25 verir. Unicode'un sevinçleri ... ;-)
Heinzi

1
Bu, asıl soruyu cevaplayan bir cevap değildir, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') ve sayısal olmayan herhangi bir karakter her zaman -1 döndürür - Jeremy Ruten doğru cevabı gönderdi
Rusty Nail

2
@RustyNail orijinal soru durumunda - özellikle nerede karakterin bir sayıyı temsil ettiğini bildiğini sormak - bu doğru cevap
Don Cheadle

@mmcrae ben öyle düşünmüyorum - Orijinal soru sorar chariçin intkullanmadan stringilk.
NetMage

172

Bu, onu bir int'e dönüştürecektir:

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

Bu işe yarar çünkü her karakter dahili olarak bir sayı ile temsil edilir. '0' ile '9' arasındaki karakterler ardışık sayılarla temsil edilir, bu nedenle '0' ve '2' karakterleri arasındaki farkı bulmak 2 rakamıyla sonuçlanır.


5
Belirli bir karakter kümesini varsayar.
EricSchaefer

9
Hayır değil, rakamlar sıralı olduğu sürece (hangi derleyiciler karakter setini gerektirir), hangi değerden başlarlarsa başlasınlar çalışacaktır.
Jeremy Ruten

2
Bu sorun değil, ancak yine de önce sınır denetimi yapmanız gerekmesi dışında ve bu noktada int.parse (foo.ToString ()) 'nin daha hızlı olup olmadığından emin değilim.
Matthew Flaschen

9
@EricSchaefer Ama bu C # için güvenli bir varsayım: charher zaman UTF-16'dır.
svick

3
@svick küçük nokta ve şimdi eski, ancak bunu yayınladığınızdan beri, UTF-8 kullanan Core çıktı. Yine de güvenli bir varsayım.
Joel Coehoorn

87

Herkes kullanarak kabul etti int.Parse()ve int.TryParse()bunun gibi

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

Bunun gibi daha da iyi

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

Çok daha güvenli ve hataya daha az meyilli


2
Kesinlikle doğru yaklaşım. Int olmayan girdilerin atılmasını istiyorsanız birincisini, başka bir şey yapmak istiyorsanız ikinciyi seçin.
Jay Bazuzi

Bu, genel bir dönüştürme yöntemi için iyi bir yaklaşımdır. Bir kenara, .NET'in bloatware'i nasıl desteklediğinin bir başka örneği. (Devam et ve TryParse () ve ToString () birim testi demek istiyorum - pratik olarak değil, yapamazsın).
çıkış

5
@logout hayır, bu StackOverflow'daki bir yanıtın bloatware'i nasıl desteklediğine dair bir örnek. Bu gerçekten gereksiz yere şişirilmiş ve bunun neden '0'karakterden çıkarmaya göre daha üstün olduğunu anlamıyorum .
Roman Starkov

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

ve ondan statik bir yöntem oluşturabilirsiniz:

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

Aradığım buydu. Ne yaptığınızı eksi sıfır kısmı ile açıklayabilirsiniz.
Xonatron

12

Bunu dene

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

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

Yorumunuz diyor '9', ancak kodunuz 9derlenmeyecek.
svick

8

Varsayılan olarak UNICODE kullanırsınız, bu yüzden Faulty yöntemini kullanmanızı öneririm

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

Altındaki sayısal değerler rakamlar ve temel Latin karakterler için aynı olsa da.


5

Gerçek yol şudur:

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

"theNameOfYourInt" - karakterinizin dönüştürülmesini istediğiniz int.

"theNameOfYourChar" - Kullanılmasını istediğiniz Char bir int'e dönüştürülür.

Her şeyi olduğu gibi bırakın.


4

Bu bir tam sayıya dönüştürür ve unicode'u işler

CharUnicodeInfo.GetDecimalDigitValue('2')

Daha fazlasını buradan okuyabilirsiniz .


4

@Chad Grant'e katılıyorum

Ayrıca dizeye dönüştürürseniz, bu değeri soruda belirtildiği gibi sayısal olarak kullanabilirsiniz.

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

Daha basit ve anlaşılır bir örnek oluşturmaya çalıştım

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

char.GetNumericValue (v) double olarak döner ve (int) değerine dönüştürür

Dizi olarak daha gelişmiş kullanım

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

3

Prensip:

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

0-9 ASCII karakterlerinin ikili değeri şöyledir:

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

ve her birini ilk 4 LSB'yi alırsanız (15'e eşit bit şeklinde VE 8'b00001111 kullanarak) gerçek sayıyı elde edersiniz (0000 = 0,0001 = 1,0010 = 2, ...)

Kullanım:

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

2
Bu kod parçacığı çözüm olabilir, ancak bir açıklama da dahil olmak üzere yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın.
yivi

1

Compact Framework 3.5 kullanıyorum ve "char.Parse" yöntemi yok. Convert sınıfını kullanmanın fena olmadığını düşünüyorum. (Bkz.C # aracılığıyla CLR, 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);

ASCII karakter veya Unicode karakter ile çalışır


1

Karakter bir ASCII rakamı olmadığında sonuca göre bazı yöntemlerin karşılaştırılması:

char c1 = (char)('0' - 1), c2 = (char)('9' + 1); 

Debug.Print($"{c1 & 15}, {c2 & 15}");                                   // 15, 10
Debug.Print($"{c1 ^ '0'}, {c2 ^ '0'}");                                 // 31, 10
Debug.Print($"{c1 - '0'}, {c2 - '0'}");                                 // -1, 10
Debug.Print($"{(uint)c1 - '0'}, {(uint)c2 - '0'}");                     // 4294967295, 10
Debug.Print($"{char.GetNumericValue(c1)}, {char.GetNumericValue(c2)}"); // -1, -1

-3

Bu benim için çalıştı:

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

5
Daha int.Parse(foo.ToString())az okunabilir olması dışında bunun nasıl bir farkı var ?
svick

-4

Pek çok cevap gördüm ama bana kafa karıştırıcı geliyor. Sadece Tip Döküm kullanamaz mıyız?

Örneğin: -

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

1
Bu, 2 değerini değil, karakter 2'nin ASCII kodunu döndürecektir.
cavpollo

O zaman char.GetNumericValue (Çift değer döndürür) kullanmaya ve int'e çevrim yapmaya ne dersiniz.
Öğrenci

Evet, @Chad Grant'in kabul edilen cevabının önerdiği şey bu
cavpollo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.