C #에서 char을 int로 변환


148

C #에 문자가 있습니다.

char foo = '2';

이제 2를 int로 가져오고 싶습니다. Convert.ToInt32가 숫자 2가 아닌 char의 실제 십진수 값을 반환한다는 것을 알았습니다. 다음은 작동합니다.

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

int.parse는 문자열에서도 작동합니다.

C #에 문자열을 만들지 않고 char에서 int로 이동하는 기본 함수가 없습니까? 나는 이것이 사소한 일이라는 것을 알고 있지만 직접 변환 할 기본 사항이 없다는 것이 이상하게 보입니다.

답변:


143

흥미로운 답변이지만 문서는 다르게 말합니다.

GetNumericValue방법을 사용하여 Char숫자를 나타내는 객체를 숫자 값 유형 으로 변환 하십시오 . ParseTryParse을 사용 하여 문자열의 문자를 Char 객체 로 변환 합니다. 객체를 객체 ToString로 변환하는 데 사용 합니다.CharString

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


아아! 그래서 네이티브가 있습니다! 두 배를 반환하는 것이 이상합니다. 이 답변이 더 좋습니다. 지적 해 주셔서 감사합니다.
KeithA

92
@ KeithA : 두 배를 반환하는 이유가 있습니다 : char.GetNumericValue('¼')수율 0.25. 유니 코드의 기쁨 ... ;-)
Heinzi

1
이것은 실제 질문, Char.GetNumericValue ( 'o'), Char.GetNumericValue ( 'w')에 대한 답변이 아니며 숫자가 아닌 문자는 항상 -1을 반환합니다. Jeremy Ruten이 정답을 게시했습니다
Rusty Nail

2
원래 질문의 경우 @RustyNail-문자가 숫자를 나타내는 지 구체적으로 물어보십시오- 이것은 정답입니다
Don Cheadle

@mmcrae 나는 그렇게 생각하지 않습니다 - 원래의 질문은 요청 charint사용하지 않고 string처음.
NetMage

163

이렇게하면 int로 변환됩니다.

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

이것은 각 문자가 내부적으로 숫자로 표시되기 때문에 작동합니다. 문자 '0'에서 '9'는 연속적인 숫자로 표시되므로 문자 '0'과 '2'의 차이를 찾으면 숫자 2가됩니다.


5
특정 문자 세트를 가정합니다.
EricSchaefer

8
아니, 숫자가 순서대로있는 한 (컴파일러에 필요한 문자 세트) 시작하는 값에 관계없이 작동하지 않습니다.
Jeremy Ruten

2
여전히 경계 검사를 먼저 수행해야한다는 점을 제외하고는 괜찮습니다. 그 시점에서 int.parse (foo.ToString ())가 더 빠른지 확실하지 않습니다.
Matthew Flaschen

7
@EricSchaefer 그러나 C #의 안전한 가정 char은 항상 UTF-16입니다.
svick

2
@svick은 작고 오래된 것이지만, 이것을 게시 한 이후에 UTF-8을 사용하는 Core가 나왔습니다. 그래도 여전히 안전한 가정입니다.
Joel Coehoorn

84

누구나 사용으로 간주했습니다 int.Parse()int.TryParse()같이

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

이처럼 더 나은

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

훨씬 안전하고 오류가 적습니다.


2
절대적으로 올바른 접근 방식입니다. 비 int 입력을 던지려면 첫 번째를 선택하고 다른 것을 수행하려면 두 번째를 선택하십시오.
Jay Bazuzi

이 방법은 일반적인 변환 방법에 적합합니다. 제쳐두고, .NET이 bloatware를 홍보하는 방법의 또 다른 예입니다. (계속해서 단위 테스트 TryParse () 및 ToString ()을 의미합니다-실제로는 할 수 없습니다.)
로그 아웃

5
@ logout 아니오, StackOverflow에 대한 답변이 어떻게 bloatware를 홍보하는지에 대한 예입니다. 이것은 실제로 불필요하게 부풀어 오르고 이것이 왜 '0'숯에서 빼는 것 보다 우월하다고 생각하는지 이해하지 못합니다 .
Roman Starkov

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

정적 메소드를 만들 수 있습니다.

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

이것이 내가 찾던 것입니다. 마이너스 제로 부분으로 수행중인 작업을 설명 할 수 있습니다.
Xonatron

10

이 시도

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

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

귀하의 의견은 '9'이지만 코드에는 9컴파일되지 않습니다.
svick

7

기본적으로 UNICODE를 사용하므로 잘못된 방법을 사용하는 것이 좋습니다.

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

아래 숫자는 숫자 및 기본 라틴 문자에 대해 동일하지만



4

진짜 방법은 :

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

"theNameOfYourInt"-문자를 변환 할 정수입니다.

"theNameOfYourChar"-사용하고자하는 Char로 int로 변환됩니다.

다른 모든 것을 그대로 두십시오.


2

원리:

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

ASCII 문자 0-9의 이진은 다음과 같습니다.

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

그리고 당신이 그들 각각의 첫 번째 4 LSB (15와 같은 8'b00001111로 비트 AND를 사용하여)를 사용하면 실제 숫자 (0000 = 0,0001 = 1,0010 = 2, ...)를 얻습니다.

용법:

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

2
이 코드 스 니펫이 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
yivi

2

@Chad Grant에 동의합니다

또한 문자열로 변환하면 질문에서 말한 것처럼 해당 값을 숫자로 사용할 수 있습니다

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

더 간단하고 이해하기 쉬운 예제를 만들려고했습니다.

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

char.GetNumericValue (v)는 double로 반환되고 (int)로 변환됩니다

배열로서의보다 고급 사용법

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

0

문자가 ASCII 숫자가 아닌 경우 결과를 기반으로 한 일부 메소드 비교 :

char c = '\n';                              
Debug.Print($"{c & 15}");                   // 10
Debug.Print($"{c ^ 48}");                   // 58
Debug.Print($"{c - 48}");                   // -38
Debug.Print($"{(uint)c - 48}");             // 4294967258
Debug.Print($"{char.GetNumericValue(c)}");  // -1 

0

Compact Framework 3.5를 사용하고 있으며 "char.Parse"메서드가 없습니다. Convert 클래스를 사용하는 것이 나쁘지 않다고 생각합니다. (C #, Jeffrey Richter를 통한 CLR 참조)

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 문자 또는 유니 코드 문자와 함께 작동


-4

이것은 나를 위해 일했다 :

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

5
어떻게 다르지는 int.Parse(foo.ToString())덜 읽을 수있는을 제외하고?
svick

-5

많은 답변을 보았지만 혼란스러워 보입니다. 단순히 유형 캐스팅을 사용할 수는 없습니다.

예를 들어 :-

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

1
이것은 값 2가 아닌 문자 2의 ASCII 코드를 반환합니다.
cavpollo

그런 다음 char.GetNumericValue (double 값을 반환)를 사용하여 int로 캐스팅하는 방법은 어떻습니까?
Learner

그렇습니다. @Chad Grant의 승인 된 답변은 다음과 같습니다.
cavpollo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.