Nasıl char int türüne dönüştürülür?


Yanıtlar:


283

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

18
İyi nokta! +1 doubleYine de a döndürmesi çok garip
Marc Gravell

4
Katılıyorum, neden 'çift' döndürdüğünü anlayamıyorum - tek bir karakter bir kayan nokta sayısını nasıl temsil edebilir?
Joel Mueller

49
Tam sayı olmayan bir sayıyı temsil eden birçok Unicode karakteri vardır, örneğin U + 2153 .
dtb

26
@dtb - Bunu düşünmemiştim. Char.GetNumericValue('⅓')gerçekten geri dönüyor 0.3333.... Bunu belirttiğiniz için teşekkürler!
Joel Mueller

1
Ayak Notu: bu işlev şu anda NetMF'de mevcut değildir.
GisMofx

40

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();


1
Bahsetmeliydim, bunu biliyordum ama başka yolu var mı? Bunu yapmak için bir API olup olmadığını bilmek istedim.
tvr

4
Benzer bir davranış istiyorsanız 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();
Dirk Vollmar

@ user386338 Korkarım ki yok.
Eugene Cheverda

@ user386338 - ile güncel bir zamanda 0xA3 gelen görüşleri @ dahil seçeneği yeniden API
Marc Gravell

@ user386338 - Joel'in dahili bir API yöntemi için cevabına bakın
Marc Gravell

21

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.


15
int i = (int)char.GetNumericValue(c);

Yine başka bir seçenek:

int i = c & 0x0f;

Bu da bunu başarmalıdır.


4
int val = '1' - '0';

Bu, '0'ın en düşük olduğu ve sayı karakterlerinin oradan sayıldığı ascii kodları kullanılarak yapılabilir.


Bu harika! Burada en şık çözüm imo.
arabisoft

3
int val = '1' - 48;

@Luke Xu: '0', ondalık sayı olarak 48 olan ASCII 0x30 koduna sahiptir, bu nedenle bu '1' - '0' ile
aynıdır

3

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';
        }
    }

1
@ 0xA3 Aralık kontrolü, genel olarak yöntemin başında olmalıdır. Biz dönüştürmek için vardır anlamsal olarak eğer charhiç intbiz girdi parametresi, çıkışını aralığını kontrol etmek zorunda intdeğer.
Eugene Cheverda

Sonuç 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.
Eugene Cheverda

Üzgünüm, kod örneğinizi yanlış okuyordum. Bazen en bariz şeyleri görmek zordur. Bahse girerim kodun dediğine göre if (c < 0 || c > 9)...
Dirk Vollmar

1

Bunu başarmanın en güvenli yolu Int32. TryParse yöntemini kullanmaktır. Buraya bakın: http://dotnetperls.com/int-tryparse


TryParse karakter için değil dizeler içindir
tvr

Evet bu, ancak dönüşümü gerçekleştirmenin en güvenli yolu stille
MUG4N

1
Tek bir karakteri tam sayıya dönüştürmek bir güvenlik meselesi mi?
Joel Mueller

1
Bu durumda 'güvenli', karakteriniz aslında bir ascii numarası değilse soruna yol açmayacağı anlamına gelir - çok baytlı bir unicode karakter olabilir.
Robin Bennett

1
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, ...)


Bu türler açısından nasıl işliyor? char ve int arasında bitsel bir operatör kullanıyorsunuz ve sonra bir int döndürüyor? Mantıksal AND, hem char hem de int'in ikili gösterimini kullanıyor ve bir ikili gösterim döndürüyor mu ve sonra siz var'ı bir int olarak tanımlarken, bu gösterimi kullanıyor mu?
1818 21

@mitnomed evet ve örneğin bayt kullanırsanız, bayt gösterimini kullanır.
Tomer Wolberg

0

Bunun gibi bir şey deneyebilirsiniz:

int val = Convert.ToInt32("" + '1');

neden sadece .ToString () değil?
Veikedo

@Veikedo bir dize değil, bir int istiyor.
briba

6
Demek istediğimConvert.ToInt32('1'.ToString())
Veikedo

0

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;
}
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.