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