Bir dönüştürmek için doğru yolu nedir chariçin int? Bu şunu verir 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Dizeye dönüştürmek ve sonra onu ayrıştırmak istemiyorum.
Bir dönüştürmek için doğru yolu nedir chariçin int? Bu şunu verir 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Dizeye dönüştürmek ve sonra onu ayrıştırmak istemiyorum.
Yanıtlar:
Hiç kimsenin doğrudan içine yerleştirilmiş statik yöntemden bahsetmediğine şaşırdım System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
doubleYine de a döndürmesi çok garip
Char.GetNumericValue('⅓')gerçekten geri dönüyor 0.3333.... Bunu belirttiğiniz için teşekkürler!
peki ya (için char c)
int i = (int)(c - '0');
char değerinin çıkarılması hangisidir?
API sorusu (yorumlar), belki bir uzantı yöntemi mi?
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;
}
}
sonra kullan int x = c.ParseInt32();
int.Parse, yani geçersiz girişte bir istisna atılırsa, ek sınır kontrolü eklemeniz gerekir:if (i < 0 || i > 9) throw new FormatException();
Herkesin unuttuğu şey bunun NEDEN olduğunu açıklamaktır.
Bir Char temelde bir tamsayıdır, ancak ASCII tablosunda bir gösterici vardır. Ayrıştırmaya çalışırken açıkça görebileceğiniz gibi, tüm karakterlerin karşılık gelen bir tamsayı değeri vardır.
Pranay'in açıkça farklı bir karakter seti vardır, bu yüzden HIS kodu çalışmaz. tek yol
int val = '1' - '0';
Bu, tablodaki tamsayı değerini '0'aradığından, o zaman 'temel değer' sayınızı char biçiminde çıkarırsanız, orijinal sayıyı verir.
Aşağıdaki uzatma yöntemini kullanabilirsiniz:
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';
}
}
charhiç intbiz girdi parametresi, çıkışını aralığını kontrol etmek zorunda intdeğer.
intdeğerinin kontrol edilmesine gerek yoktur çünkü sayısal karakter aralığı yöntemin başlangıcında gerçekleştirilmiştir, bu nedenle doğru sonuç değeri olacaktır, belirtilen karakter sayısal karakter aralığında değilse istisna atılacaktır. Sağladığınız mantıkla aynı ancak aralık kontrolü, yöntemin başında gerçekleştirilir.
if (c < 0 || c > 9)...
Bunu başarmanın en güvenli yolu Int32. TryParse yöntemini kullanmaktır. Buraya bakın: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
0-9 ASCII karakterlerinin ikili değeri şöyledir:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
ve eğer her birini ilk 4 LSB'yi alırsanız (15'e eşit olan bitsel VE 8'b00001111 kullanarak) gerçek sayıyı elde edersiniz (0000 = 0,0001 = 1,0010 = 2, ...)
Onaltılık gösterimi kapsayan diğer bazı yanıtların bir uzantısı:
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;
}