文字列を小数値に変換するとなると以下のようなコードになります。
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}に変換されました。"); } } }
この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}に変換されました。"); } } }
小数値をフランス語形式の文字列に表示して、日本語環境で数値に変換します。
元の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}に変換されました。"); } } }
CultureInfo.InvariantCultureInfoは特定の国や言語圏に依存しないため、端末がどういった環境でも左右されないこと保証することができます。