web-dev-qa-db-ja.com

C#でcharをintに変換します

私はC#で文字を持っています:

char foo = '2';

次に、2をintにしたいです。 Convert.ToInt32は、数値2ではなく、文字の実際の10進値を返すことがわかりました。次のように動作します。

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

int.parseは、文字列でも機能します。

文字列にせずにcharからintに移動するネイティブ関数はC#にありませんか?私はこれが些細なことであることを知っていますが、変換を直接行うためのネイティブが何もないことは奇妙に思えます。

118
KeithA

興味深い答えですが、ドキュメントの言い方は異なります:

GetNumericValueメソッドを使用して、数値を表すCharオブジェクトを数値型に変換します。 ParseおよびTryParseを使用して、文字列内の文字をCharオブジェクトに変換します。 ToStringを使用して、CharオブジェクトをStringオブジェクトに変換します。

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

114
Chad Grant

これにより、intに変換されます。

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

これは、各文字が数字で内部的に表されるため機能します。文字「0」から「9」は連続した数字で表されるため、文字「0」と「2」の違いを見つけると数字2になります。

133
Jeremy Ruten

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
}

はるかに安全でエラーが発生しにくい

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

そして、そこから静的メソッドを作成できます:

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

これを試して

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

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

デフォルトでは、UNICODEを使用するので、faultyのメソッドを使用することをお勧めします

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

下の数値は数字と基本的なラテン文字で同じですが。

7
Nikolay

これは整数に変換し、Unicodeを処理します

CharUnicodeInfo.GetDecimalDigitValue('2')

もっと読むことができます こちら

3
Dan Friedman

実際の方法は次のとおりです。

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

「theNameOfYourInt」-文字を変換する整数。

"theNameOfYourChar"-使用するCharで、intに変換されます。

他のすべてを残します。

原則:

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;
}
1
Tomer Wolberg

文字が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
Slai

Compact Framework 3.5を使用していますが、「char.Parse」メソッドはありません。 Convertクラスを使用するのは悪くないと思います。 (C#経由のCLR、Jeffrey Richterを参照)

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 charまたはUnicode charで動作します

0
antonio

@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
chmod