C#でcharをintに変換する


148

私はc#にcharがあります:

char foo = '2';

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

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

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

文字列にせずにcharからintに移行するC#のネイティブ関数はありませんか?これは取るに足らないことですが、直接変換するネイティブなものがないのは奇妙に思えます。

回答:


143

興味深い答えですが、ドキュメントは別の言い方をしています:

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

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


ああ!だからネイティブなものがあります!doubleを返すのは奇妙です。私はこの答えが好きです。指摘してくれてありがとう。
KeithA 2009

92
@KeithA:doubleを返す理由があります。0.25を返しchar.GetNumericValue('¼')ます。Unicodeの喜び... ;-)
Heinzi '26

1
これは実際の質問、Char.GetNumericValue( 'o')、Char.GetNumericValue( 'w')に答える答えではなく、非数値文字は常に-1を返します-Jeremy Rutenが正しい答えを投稿しました
Rusty Nail

2
元の質問の場合は@RustyNail-charが数値を表すことがわかっている場所を具体的に尋ねる- これが正解です
Don Cheadle

@mmcrae私はそうは思いません-元の質問は最初に使用せずにcharto intを要求しstringます。
NetMage

163

これはそれをintに変換します:

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

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


5
特定の文字セットを想定しています。
EricSchaefer 2008年

8
数字が適切である限り(コンパイラーが文字セットを必要とする場合)、それがどの値から始まっていても機能します。
Jeremy

2
これは問題ありませんが、最初に境界チェックを行う必要がありますが、その時点では、int.parse(foo.ToString())の方が速いかどうかはわかりません。
マシューFlaschen

7
@EricSchaeferしかし、これはC#では安全な前提charです。常にUTF-16です。
2014年

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入力をスローする場合は最初の1つを選択し、他の何かを実行する場合は2番目を選択します。
ジェイバズジ2008年

これは、一般的な変換方法に適したアプローチです。余談ですが、.NETがブロートウェアを宣伝するもう1つの例です。(つまり、TryParse()とToString()を単体テストして続行することはできません。実際にはできません)。
ログアウト

5
@logoutいいえ、StackOverflowでの回答がブロートウェアを促進する方法の例です。これは確かに不必要に肥大化しており、なぜこれがイワナから差し引く'0'より優れていると考えられるのか理解できません。
ローマスターコフ2014

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、コンパイルできません。
2014年

7

デフォルトではUNICODEを使用するため、フォールトの方法を使用することをお勧めします

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

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



3

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

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

"theNameOfYourInt"-charを変換するint。

「theNameOfYourChar」-intに変換されるように使用するChar。

他はすべてそのままにしておきます。


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を取り込む場合(ビット単位ANDを使用し、8'b00001111は15に等しい)、実際の数を取得します(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#を介した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文字またはUnicode文字で動作します


-4

これは私のために働きました:

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

5
int.Parse(foo.ToString())可読性が低いことを除いて、それはとどのように異なりますか?
2014年

-5

私は多くの答えを見てきましたが、それらは私を混乱させるようです。単純に型キャストを使用することはできません。

例:-

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

1
これは、文字2、ない値2のASCIIコードを返します
cavpollo

次に、char.GetNumericValue(これはdouble値を返します)を使用して、それをintにキャストします。
学習者

うん、それは@Chad Grantの承認された回答が提案するものです
cavpollo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.