charをintに変換する方法は?


123

変換する適切な方法は何であるcharにはint?これにより49

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

文字列に変換して解析したくありません。


1
この質問の重複の可能性があります。
RBT 2017

回答:


282

誰もが、組み込みの静的メソッドについて言及していないことに驚いていSystem.Charます...

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

18
良い場所!+1 doubleしかし、それがを返すのは非常に奇妙です
マークグラベル

4
同意します。なぜ「double」を返すのかわかりません。単一の文字が浮動小数点数を表すにはどうすればよいですか。
Joel Mueller、

49
非整数を表すUnicode文字はたくさんあります(例:U + 2153)
dtb

26
@dtb-私はそれを考慮していませんでした。Char.GetNumericValue('⅓')確かに戻り0.3333...ます。指摘してくれてありがとう!
Joel Mueller、

1
脚注:この機能は現在NetMFでは使用できません。
GisMofx 2015

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();
ダーク・フォルマール

@ user386338ありません。
Eugene Cheverda

@ user386338- オプションre APIで更新され @ 0xA3のフィードバックも含まれます
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';

これは、ASCIIコードを使用して行うことができます。ここで、「0」が最も低く、そこから文字数がカウントされます。


これは素晴らしいです!ここで最もエレガントなソリューションです。
arabisoft

3
int val = '1' - 48;

@Luke Xu: '0'のASCIIコード0x30は10進数で48であるため、これは '1'-'0'と同じ
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)...
Dirk Vollmar

1

これを実現する最も安全な方法は、Int32.TryParseメソッドを使用することです。こちらをご覧ください:http : //dotnetperls.com/int-tryparse


TryParseは文字用ではなく文字列用
tvr

はい、しかし
それでも

1
単一の文字を整数に変換することはセキュリティの問題ですか?
Joel Mueller

1
この場合の「安全」とは、実際の文字がASCII番号でなくても問題が発生しないことを意味します。マルチバイトのUnicode文字である可能性があります。
ロビンベネット

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を使用し、15に等しい8'b00001111を使用)、実際の数を取得します(0000 = 0,0001 = 1,0010 = 2、...)


これはタイプに関してどのように機能しますか?あなたはcharとintの間にビットごとの演算子を使用していて、intを返しますか?論理ANDは、charとintの両方のバイナリ表現を使用し、バイナリ表現を返します。次に、varをintとして定義するときに、その表現を使用しますか?
18年

@mitnomedはい、たとえばバイトを使用する場合は、バイト表現を使用します。
Tomer Wolberg、2018

0

あなたはこのようなことを試すことができます:

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

なぜ.ToString()だけではないのですか?
Veikedo

@Veikedo彼は文字列ではなく整数を望んでいます。
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.