[C#]文字列から数値変換(TryParse, Parse)

C#

C#で文字列から数字などキャストするときのやり方についてまとめています。
stringからGuid、intに変換したかっただけなのですが、キャストについて色々情報があってよくわからなかったので、まとめてみました。

公式のリファレンスはこちら

as 演算子

クラスのインスタンスをキャストしたいときに使うようで、
stringやintなどの値型変数(値が直接入っている)には使えません。

下記のようなクラスを作成して試してみました。
乗り物クラスと、乗り物を継承した車クラスです。。

private class Transport
{
    public string name = "transport";
}

private class Car: Transport
{
    public new string name = "car";
}

asを使って、carからtransportに変換すると
出力内容が親のクラスになりました。

var car = new Car();

var transport = car as Transport;
Console.WriteLine(transport.name); // 結果: transport

クラス間の変換という認識でいいのかと思います。
変換できない場合は、エラーにならずにnullが返ってきます。

キャスト式

公式リファレンスを見ると、明示的な変換として記載されていないものは変換できないようです。

double型でいうと…

double testDouble = 1234.7;
var test1 = (sbyte)testDouble;
var test2 = (byte)testDouble;
var test3 = (short)testDouble;
var test4 = (ushort)testDouble;
var test5 = (int)testDouble;
var test6 = (uint)testDouble;
var test7 = (long)testDouble;
var test8 = (ulong)testDouble;
var test9 = (char)testDouble;
var testA = (float)testDouble;
var testB = (decimal)testDouble; // ここまではコンパイルが通る

var testC = (string)testDouble; // stringキャストはできないのでコンパイルエラーになる

上記のようになります。string変換は不可能…
キャスト式で変換失敗した場合は、Exceptionが投げられるようなので注意が必要です。

文字列からGuid/int変換したい(Guid.Parse / int.Parse)

じゃあ文字列から変換する場合は、どうすれば…
というとそれぞれの型にParseメソッドがあるので、Parseメソッドを使って変換するようです🤔

変換サンプル

stringからGuid / int変換するテストをfunctionsで書いてみました。

[FunctionName("CastTestController_Run")]
public static IActionResult CastTestRun(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "cast/default")] HttpRequest req
)
{
    var idText = req.Query["userId"];
    var ageText = req.Query["age"];

    Guid id;
    int age;

    try
    {
        id = Guid.Parse(idText);
        age = int.Parse(ageText);
    }
    catch (Exception e)
    {
        return new BadRequestObjectResult(new Dictionary<string, object> { { "エラーが発生しました。パラメータを確認してください。", e } });
    }


    var result = new Dictionary<string, string>
    {
        { "ID", id.ToString() },
        { "年齢", age.ToString() }
    };

    return new OkObjectResult(result);
}

解説

urlのqueryパラメータで受け取ったuserIdをGuid.Parseに渡して、Guidに変換しています。
同じようにageをint,Parseに渡して、数値に変換しています。

変換に失敗するとExceptionを投げるので、try catchで捕まえるようにしました。
変換成功すると、json形式のレスポンスを返すようにしています。

変換時にExeptionを投げたくない(Guid.TryParse / int.TryParse)

変換時にExceptionを投げられたくない場合は、TryParseを使います。

変換サンプル

上記で書いているものを書き換えて、stringからGuidもしくはintにTryParseを使って変換しています。

[FunctionName("CastTestController_Try")]
public static IActionResult CastTestTry(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "cast/try")] HttpRequest req
)
{
    string idText = req.Query["userId"];
    string ageText = req.Query["age"];

    if (!Guid.TryParse(idText, out Guid id))
    {
        return new BadRequestObjectResult(new Dictionary<string, object> { { "ユーザーIDでエラーが発生しました。パラメータを確認してください。", idText } });
    }

    if (!int.TryParse(ageText, out int age))
    {
        return new BadRequestObjectResult(new Dictionary<string, object> { { "年齢でエラーが発生しました。パラメータを確認してください。", ageText } });
    }

    var result = new Dictionary<string, string>
    {
        { "ID", id.ToString() },
        { "年齢", age.ToString() }
    };

    return new OkObjectResult(result);
}

解説 

urlのqueryパラメータで受け取ったuserIdをGuid.TryParseに渡して、Guidに変換しています。
同じようにageをint,TryParseに渡して、数値に変換しています。

TryPaseの使い方は、下記のように1番目に変換したい文字列を入れると、
変換できた場合、2番目の引数で指定している変数に入ります。

変換できなかった場合は、falseが返るので、サンプルではfalseが返ってきたら404でエラーとして返しています。

    if (!Guid.TryParse(idText, out Guid id))
    {
        return new BadRequestObjectResult(new Dictionary<string, object> { { "ユーザーIDでエラーが発生しました。パラメータを確認してください。", idText } });
    }

変換が完了すると、json形式のレスポンスを返しています。

github

コメント

タイトルとURLをコピーしました