char를 int로 변환하는 방법?


123

a char를 로 변환하는 올바른 방법은 무엇입니까 int? 이것은 제공합니다 49:

int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works

문자열로 변환 한 다음 구문 분석하고 싶지 않습니다.


1
질문의 중복 가능성 있습니다.
RBT

의 가능한 중복 C #에서 int와 변환 문자
GSerg

답변:


282

아무도 바로 내장 된 정적 메서드를 언급하지 않은 것에 놀랐습니다 System.Char.

int val = (int)Char.GetNumericValue('8');
// val == 8

18
좋은 자리! 그것은을 반환 매우 이상한 일 double이지만,
마크 Gravell

4
동의합니다. 왜 'double'을 반환하는지 알 수 없습니다. 단일 문자가 어떻게 부동 소수점 숫자를 나타낼 수 있습니까?
Joel Mueller

49
정수가 아닌 숫자를 나타내는 유니 코드 문자가 많이 있습니다 (예 : U + 2153) .
dtb

26
@dtb-나는 그것을 고려하지 않았다. Char.GetNumericValue('⅓')실제로 반환 0.3333...합니다. 지적 해 주셔서 감사합니다!
Joel Mueller

1
참고 :이 기능은 현재 NetMF에서 사용할 수 없습니다.
GisMofx

40

어때 ( char c)

int i = (int)(c - '0');

char 값의 뺄셈은 무엇입니까?

API 질문 (코멘트), 확장 방법일까요?

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

그런 다음 사용 int x = c.ParseInt32();


1
내가 언급 했어야했는데 이것에 대해 알고 있었지만 다른 방법이 있습니까? 이 작업을 수행하는 API가 있는지 알고 싶었습니다.
tvr

4
에 유사한 bahavior를 원하면 int.Parse, 즉 유효하지 않은 입력에서 예외가 발생하는 경우 경계 검사를 추가해야합니다.if (i < 0 || i > 9) throw new FormatException();
Dirk Vollmar

@ user386338없는 것이 두렵습니다.
Eugene Cheverda

@ user386338- @ 0xA3의 피드백을 포함하여 API에 대한 옵션 업데이트
Marc Gravell

@ user386338-내장 API 메서드에 대한 Joel의 답변 참조
Marc Gravell

21

모두가 잊고있는 것은 왜 이런 일이 발생하는지 설명하는 것입니다.

Char는 기본적으로 정수이지만 ASCII 테이블에 포인터가 있습니다. 모든 문자에는 구문 분석을 시도 할 때 명확하게 볼 수있는 해당 정수 값이 있습니다.

Pranay는 분명히 다른 문자 집합을 가지고 있으므로 HIS 코드가 작동하지 않습니다. 유일한 방법은

int val = '1' - '0';

이것은 테이블에서 정수 값을 조회하기 때문에 '0''기본 값'에서 char 형식의 숫자를 빼면 원래 숫자가 제공됩니다.


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

또 다른 옵션 :

int i = c & 0x0f;

이것도 가능합니다.


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

이것은 '0'이 가장 낮은 ASCII 코드를 사용하여 수행 할 수 있으며 거기에서 문자 수를 계산합니다.


이것은 훌륭합니다! imo는 여기에서 가장 우아한 솔루션입니다.
arabisoft

3
int val = '1' - 48;

@Luke 쑤 - '0', '0'이 '1'과 동일하므로 십진수로 48이다 ASCII 코드는 0x30을 가지고
NiKiZe

3

다음 확장 방법을 사용할 수 있습니다.

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 범위 검사는 일반적으로 메서드의 시작 부분에 있어야합니다. 우리로 변환하는 의미있는 경우 charint우리는 입력 매개 변수가 아니라, 출력의 범위를 확인해야 int값.
Eugene Cheverda

int메서드의 시작 부분에 숫자 문자 범위가 수행 되었기 때문에 결과 값 을 확인할 필요가 없으므로 지정된 문자가 숫자 문자 범위에 포함되지 않으면 정확한 결과 값이 생성되며 예외가 발생합니다. 제공 한 것과 동일한 로직이지만 범위 검사는 메소드 시작시 수행됩니다.
Eugene Cheverda

죄송합니다. 코드 샘플을 잘못 읽었습니다. 때로는 가장 분명한 것을보기가 어렵습니다. 나는 코드가 말했다 셨을 텐데요 if (c < 0 || c > 9)...
더크 볼 마르

1

이를 수행하는 가장 안전한 방법은 Int32.TryParse 메서드를 사용하는 것입니다. 여기를 참조하십시오 : http://dotnetperls.com/int-tryparse


TryParse는 문자
용이

네, 그것은하지만 변환을 수행하는 가장 안전한 방법을 스틸리
MUG4N

1
단일 문자를 정수로 변환하는 것이 보안 문제입니까?
Joel Mueller

1
이 경우 '보안'은 문자가 실제로 ASCII 숫자가 아닌 경우 문제를 일으키지 않음을 의미합니다. 다중 바이트 유니 코드 문자 일 수 있습니다.
Robin Bennett

1
int val = '1' & 15;

ASCII 문자 0-9의 바이너리는 다음과 같습니다.

0-00110000

1-00110001

2-00110010

3-00110011

4-00110100

5-00110101

6-00110110

7-00110111

8-00111000

9-00111001

그리고 그들 각각을 처음 4 개의 LSB (비트 AND와 8'b00001111을 사용하여 15로 equels 사용)를 취하면 실제 숫자 (0000 = 0,0001 = 1,0010 = 2, ...)를 얻습니다.


유형 측면에서 어떻게 작동합니까? char와 int 사이에 비트 연산자를 사용하고 있으며 int를 반환합니까? 논리 AND는 char 및 int의 이진 표현을 사용하고 이진 표현을 반환 한 다음 var를 int로 정의 할 때 해당 표현을 사용합니까?
mitomed

@mitnomed yes 및 예를 들어 바이트를 사용하는 경우 바이트 표현을 사용합니다.
Tomer Wolberg

0

다음과 같이 시도 할 수 있습니다.

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

왜 .ToString ()이 아닙니까?
Veikedo

@Veikedo 그는 문자열이 아닌 int를 원합니다.
briba

6
내 말은Convert.ToInt32('1'.ToString())
Veikedo

0

16 진수 표현을 다루는 다른 답변의 확장 :

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.