より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

double.TryParseとCultureInfo.InvariantCulture

文字列を小数値に変換するとなると以下のようなコードになります。

double.Parseもありますが失敗すると例外を投げてしまうので、TryParseを使います。

using System;
using System.Globalization;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "123.4";
            if (!double.TryParse(text,out var result))
            {
                Console.WriteLine($"{text}は数字ではありません。");
                return;
            }
            Console.WriteLine($"{result}に変換されました。");
        }
    }
}

f:id:rimever:20191118212406p:plain

このTryParseではCultureInfoやNumberStylesを指定することができます。

こんなの使うことあるのか?

あるから用意されています。

例えばこんなコード

using System;
using System.Globalization;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // フランス語の数値
            string text = 123.4.ToString(new CultureInfo("fr-fr"));
            if (!double.TryParse(text, out var result))
            {
                Console.WriteLine($"{text}は数字ではありません。");
                return;
            }
            Console.WriteLine($"{text}は{result}に変換されました。");
        }
    }
}

f:id:rimever:20191118212744p:plain
もちろん、環境は日本語です。

小数値をフランス語形式の文字列に表示して、日本語環境で数値に変換します。

元の123.4にはなりません。

というのもフランス語では小数値は123,4 となるためです。

なので、言語の違いはズレを生んでしまうことになります。多様性も良いことづくめな訳がないのです。

というわけで共通に揃える必要が出てきます。CultureInfo.InvariantCultureの出番です。

using System;
using System.Globalization;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = 123.4.ToString(CultureInfo.InvariantCulture);
            if (!double.TryParse(text,NumberStyles.Number,CultureInfo.InvariantCulture, out var result))
            {
                Console.WriteLine($"{text}は数字ではありません。");
                return;
            }
            Console.WriteLine($"{text}は{result}に変換されました。");
        }
    }
}

f:id:rimever:20191118213116p:plain

CultureInfo.InvariantCultureInfoは特定の国や言語圏に依存しないため、端末がどういった環境でも左右されないこと保証することができます。

docs.microsoft.com