C#でdoubleに変換する方法|Parse・TryParseの違いとエラー対策を徹底解説

はじめに

C#で文字列を数値として扱いたい場合、よく使うのがdoubleへの変換です。

たとえば、次のような文字列があるとします。

C#
string text = "123.45";

この値は見た目は数値ですが、型はstringです。そのままでは足し算や掛け算などの数値計算には使いにくいため、double型に変換する必要があります。

C#で文字列をdoubleに変換する代表的な方法には、次の3つがあります。

C#
double.Parse()
double.TryParse()
Convert.ToDouble()

中でもよく使われるのがDouble.ParseDouble.TryParseです。

Parseはシンプルに変換できますが、変換できない文字列を渡すと例外が発生します。一方、TryParseは変換に失敗しても例外を発生させず、成功・失敗をboolで判定できます。

この記事では、C#でdoubleに変換する基本から、ParseTryParseの違い、エラー対策、カルチャによる小数点やカンマの問題まで、実務で使える形で解説します。

1. C#で文字列をdoubleに変換する基本

1-1. double型とは何か

doubleは、C#で小数を扱うための数値型です。

正式には倍精度浮動小数点数と呼ばれ、整数だけでなく小数を含む値を表現できます。

C#
double price = 123.45;
double rate = 0.08;
double temperature = -12.5;

doubleは次のような値を扱うときによく使われます。

C#
double height = 170.5;
double weight = 62.3;
double average = 87.6;
double distance = 12.75;

ただし、doubleは浮動小数点数であるため、計算結果にわずかな誤差が出ることがあります。科学計算や座標、統計、測定値などには向いていますが、金額計算ではdecimalを使うのが一般的です。

1-2. 文字列をdoubleに変換する主な方法

C#で文字列をdoubleに変換する主な方法は、次の3つです。

C#
double value1 = double.Parse("123.45");

bool success = double.TryParse("123.45", out double value2);

double value3 = Convert.ToDouble("123.45");

それぞれ特徴があります。

double.Parseは、文字列が必ず数値として正しいと分かっている場合に使いやすい方法です。

C#
double value = double.Parse("123.45");
Console.WriteLine(value);

double.TryParseは、ユーザー入力やCSV、APIレスポンスなど、変換できるか分からない文字列を扱うときに安全です。

C#
if (double.TryParse("123.45", out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("doubleに変換できませんでした。");
}

Convert.ToDoubleは、object型や他の型から変換したい場合にも使えます。

C#
string text = "123.45";
double value = Convert.ToDouble(text);
Console.WriteLine(value);

1-3. Double.Parse・Double.TryParse・Convert.ToDoubleの使い分け

Double.ParseDouble.TryParseConvert.ToDoubleは似ていますが、使う場面が異なります。

文字列が必ず数値であると分かっている場合は、Double.Parseで十分です。

C#
string text = "100.5";
double value = Double.Parse(text);

一方で、ユーザー入力のように不正な値が入る可能性がある場合は、Double.TryParseを使うべきです。

C#
string input = "abc";

if (Double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("数値ではありません。");
}

Convert.ToDoubleは、nullを渡したときに0を返すという特徴があります。

C#
string text = null;

double value = Convert.ToDouble(text);

Console.WriteLine(value); // 0

一方、Double.Parsenullを渡すと例外が発生します。

C#
string text = null;

double value = Double.Parse(text); // ArgumentNullException

そのため、単純な文字列変換ではParseまたはTryParseを使い、null0として扱いたい場合や、他の型から変換したい場合にConvert.ToDoubleを検討するとよいでしょう。

1-4. まず覚えるべき基本構文

最初に覚えるべき基本構文は、次の2つです。

C#
double value = double.Parse("123.45");
C#
bool result = double.TryParse("123.45", out double value);

Parseは、変換結果をそのまま戻り値として受け取ります。

C#
double value = double.Parse("123.45");
Console.WriteLine(value);

TryParseは、変換できたかどうかをboolで返し、変換結果はout引数で受け取ります。

C#
if (double.TryParse("123.45", out double value))
{
Console.WriteLine($"変換成功: {value}");
}
else
{
Console.WriteLine("変換失敗");
}

実務では、固定値や内部データにはParse、外部から入ってくる値にはTryParseを使う、と覚えると分かりやすいです。

2. Double.Parseで文字列をdoubleに変換する方法

2-1. Double.Parseの基本的な使い方

Double.Parseは、文字列をdoubleに変換するためのメソッドです。

C#
string text = "123.45";

double value = Double.Parse(text);

Console.WriteLine(value);

実行結果は次のようになります。

123.45

C#ではDouble.Parsedouble.Parseのどちらも使えます。

C#
double value1 = Double.Parse("123.45");
double value2 = double.Parse("123.45");

Doubleは.NETの型名で、doubleはC#のキーワードです。基本的にはどちらを使っても同じですが、C#のコードではdouble.Parseと書かれることが多いです。

2-2. 小数を含む文字列を変換するサンプルコード

小数を含む文字列も、double.Parseで変換できます。

C#
string text = "98.76";

double value = double.Parse(text);

Console.WriteLine(value);

実行結果は次のとおりです。

98.76

変換後はdouble型なので、計算にも使えます。

C#
string text = "12.5";

double value = double.Parse(text);

double result = value * 2;

Console.WriteLine(result);

実行結果は次のようになります。

25

文字列のままでは数値計算として扱えませんが、doubleに変換すれば四則演算が可能になります。

C#
string a = "10.5";
string b = "2.5";

double x = double.Parse(a);
double y = double.Parse(b);

Console.WriteLine(x + y);
Console.WriteLine(x - y);
Console.WriteLine(x * y);
Console.WriteLine(x / y);

2-3. 負の数・指数表記・空白を含む文字列の変換

double.Parseでは、負の数も変換できます。

C#
double value = double.Parse("-123.45");

Console.WriteLine(value);

実行結果は次のとおりです。

-123.45

指数表記も変換できます。

C#
double value = double.Parse("1.23E3");

Console.WriteLine(value);

実行結果は次のようになります。

1230

1.23E3は、1.23 × 10の3乗を意味します。

また、前後に空白がある文字列も変換できます。

C#
double value = double.Parse("  123.45  ");

Console.WriteLine(value);

実行結果は次のとおりです。

123.45

ただし、数値の途中に不自然な空白がある場合は変換できません。

C#
double value = double.Parse("123 .45"); // FormatException

2-4. Parseで変換できる文字列とできない文字列

double.Parseで変換できる文字列の例は、次のとおりです。

C#
double.Parse("123");
double.Parse("123.45");
double.Parse("-123.45");
double.Parse("+123.45");
double.Parse("1.23E3");
double.Parse(" 123.45 ");

一方、次のような文字列は変換できません。

C#
double.Parse("abc");      // FormatException
double.Parse(""); // FormatException
double.Parse(" "); // FormatException
double.Parse("123abc"); // FormatException
double.Parse(null); // ArgumentNullException

Parseは、変換できない値を渡すと例外が発生します。そのため、変換できるかどうか分からない文字列には、基本的にTryParseを使う方が安全です。

3. Double.TryParseで安全にdoubleへ変換する方法

3-1. Double.TryParseの基本的な使い方

Double.TryParseは、文字列をdoubleに変換できるか試すメソッドです。

Parseと違い、変換に失敗しても例外を発生させません。

C#
string text = "123.45";

bool success = double.TryParse(text, out double value);

Console.WriteLine(success);
Console.WriteLine(value);

実行結果は次のようになります。

True
123.45

変換に成功した場合、戻り値はtrueになり、out引数の変数に変換後の値が入ります。

変換に失敗した場合は、戻り値がfalseになります。

C#
string text = "abc";

bool success = double.TryParse(text, out double value);

Console.WriteLine(success);
Console.WriteLine(value);

実行結果は次のようになります。

False
0

3-2. out引数で変換結果を受け取る方法

TryParseでは、変換後の値をout引数で受け取ります。

C#
double.TryParse("123.45", out double value);

このvalueに、変換に成功した場合の数値が入ります。

C#
string text = "456.78";

if (double.TryParse(text, out double value))
{
Console.WriteLine($"変換結果: {value}");
}

C#では、out double valueのように、TryParseの引数内で変数を宣言できます。

C#
if (double.TryParse("123.45", out double value))
{
Console.WriteLine(value);
}

古い書き方では、先に変数を宣言してから渡します。

C#
double value;

bool success = double.TryParse("123.45", out value);

if (success)
{
Console.WriteLine(value);
}

現在のC#では、out変数をその場で宣言する書き方が一般的です。

3-3. 変換成功・失敗をif文で判定する方法

TryParseは、if文と組み合わせて使うことが多いです。

C#
string input = "123.45";

if (double.TryParse(input, out double value))
{
Console.WriteLine($"数値です: {value}");
}
else
{
Console.WriteLine("数値に変換できません。");
}

変換に成功した場合だけ計算したい場合は、次のように書けます。

C#
string input = "10.5";

if (double.TryParse(input, out double value))
{
double result = value * 2;
Console.WriteLine(result);
}
else
{
Console.WriteLine("入力値が不正です。");
}

ユーザー入力を受け取る場合の例です。

C#
Console.Write("数値を入力してください: ");
string input = Console.ReadLine();

if (double.TryParse(input, out double value))
{
Console.WriteLine($"入力された数値は {value} です。");
}
else
{
Console.WriteLine("正しい数値を入力してください。");
}

このように書くことで、不正な入力があってもプログラムが異常終了しにくくなります。

3-4. ユーザー入力や外部データではTryParseを使うべき理由

ユーザー入力や外部データでは、必ずしも正しい数値が渡されるとは限りません。

たとえば、次のような値が入力される可能性があります。

abc
未入力
空白
1,234.56
123.45
123円

これらをそのままdouble.Parseで変換すると、FormatExceptionなどの例外が発生する可能性があります。

C#
string input = "abc";

double value = double.Parse(input); // 例外が発生する

一方、TryParseを使えば、例外を発生させずに変換できるかどうかを判定できます。

C#
string input = "abc";

if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("数値に変換できませんでした。");
}

CSV、JSON、API、フォーム入力、設定ファイルなど、外部から取得する値には基本的にTryParseを使うのが安全です。

4. ParseとTryParseの違い

4-1. 例外が発生するかどうかの違い

ParseTryParseの大きな違いは、変換に失敗したときに例外が発生するかどうかです。

Parseは、変換できない文字列を渡すと例外が発生します。

C#
double value = double.Parse("abc"); // FormatException

一方、TryParseは例外を発生させず、戻り値で成功・失敗を返します。

C#
bool success = double.TryParse("abc", out double value);

Console.WriteLine(success); // False

そのため、入力値が正しいことを保証できない場合は、TryParseを使う方が適しています。

4-2. 戻り値と変換結果の受け取り方の違い

Parseは、変換結果そのものを戻り値として返します。

C#
double value = double.Parse("123.45");

TryParseは、戻り値としてboolを返します。変換結果はout引数で受け取ります。

C#
bool success = double.TryParse("123.45", out double value);

つまり、役割は次のように異なります。

C#
// Parse: 戻り値が変換結果
double value1 = double.Parse("123.45");

// TryParse: 戻り値が成功・失敗、out引数が変換結果
bool success = double.TryParse("123.45", out double value2);

Parseは短く書けますが、失敗時の例外処理が必要です。TryParseは少し長くなりますが、安全に判定できます。

4-3. パフォーマンスと可読性の違い

正常な値だけを扱う場合、Parseはシンプルで読みやすいです。

C#
double taxRate = double.Parse("0.1");

しかし、不正な値が頻繁に入る可能性がある場合にParseを使い、例外処理で対応するのはおすすめできません。

C#
try
{
double value = double.Parse(input);
}
catch (FormatException)
{
Console.WriteLine("変換できませんでした。");
}

例外は、本来は予期しない異常を扱うための仕組みです。通常の入力チェックとして多用すると、コードが読みにくくなり、処理効率の面でも不利になる場合があります。

そのため、変換失敗が通常の流れとして起こり得る場合は、TryParseを使う方が自然です。

C#
if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("変換できませんでした。");
}

4-4. Parseを使うべきケース

Parseを使うべきケースは、文字列が必ず数値として正しいと分かっている場合です。

たとえば、プログラム内で固定された文字列を変換する場合です。

C#
double value = double.Parse("123.45");

また、事前にバリデーション済みの値を変換する場合にも使えます。

C#
string text = "98.6";

// すでに数値形式であることが保証されている場合
double value = double.Parse(text);

設定ファイルや内部データなどで、値の形式が厳密に管理されている場合もParseを使えます。ただし、ファイルの中身がユーザーによって変更される可能性があるなら、TryParseの方が安全です。

4-5. TryParseを使うべきケース

TryParseを使うべきケースは、変換できるかどうか分からない文字列を扱う場合です。

代表的な例は次のとおりです。

C#
Console.ReadLine()
フォーム入力
CSVファイル
JSONデータ
APIレスポンス
データベースの文字列データ
ログファイル
Excelから読み込んだ値

たとえば、ユーザー入力にはTryParseを使います。

C#
Console.Write("身長を入力してください: ");
string input = Console.ReadLine();

if (double.TryParse(input, out double height))
{
Console.WriteLine($"身長: {height}");
}
else
{
Console.WriteLine("数値を入力してください。");
}

APIから取得した文字列にもTryParseが向いています。

C#
string responseValue = "123.45";

if (double.TryParse(responseValue, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("APIの値をdoubleに変換できませんでした。");
}

「失敗する可能性がある変換」には、まずTryParseを使うと覚えておくとよいでしょう。

5. double変換で発生しやすいエラーと対策

5-1. FormatExceptionが発生する原因と対処法

FormatExceptionは、文字列の形式が数値として正しくない場合に発生します。

C#
double value = double.Parse("abc"); // FormatException

次のような値はFormatExceptionの原因になります。

C#
double.Parse("abc");
double.Parse("");
double.Parse(" ");
double.Parse("123abc");
double.Parse("123円");

対策としては、TryParseを使うのが基本です。

C#
string input = "abc";

if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("数値形式が正しくありません。");
}

どうしてもParseを使う場合は、try-catchで例外を捕捉します。

C#
try
{
double value = double.Parse("abc");
Console.WriteLine(value);
}
catch (FormatException)
{
Console.WriteLine("数値に変換できない形式です。");
}

ただし、通常の入力チェックであればtry-catchよりTryParseの方が扱いやすいです。

5-2. ArgumentNullExceptionが発生する原因と対処法

ArgumentNullExceptionは、double.Parsenullを渡した場合に発生します。

C#
string text = null;

double value = double.Parse(text); // ArgumentNullException

対策として、変換前にnullチェックを行います。

C#
string text = null;

if (text != null)
{
double value = double.Parse(text);
Console.WriteLine(value);
}
else
{
Console.WriteLine("値がnullです。");
}

より安全に書くなら、TryParseを使います。

C#
string text = null;

if (double.TryParse(text, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("doubleに変換できませんでした。");
}

TryParsenullを渡しても例外を発生させず、falseを返します。

また、Convert.ToDoublenullを渡すと0を返します。

C#
string text = null;

double value = Convert.ToDouble(text);

Console.WriteLine(value); // 0

ただし、nullを本当に0として扱ってよいかは、アプリケーションの仕様に合わせて判断する必要があります。

5-3. OverflowExceptionが発生する原因と対処法

OverflowExceptionは、変換しようとした値がdoubleで表現できる範囲を超えた場合に発生する可能性があります。

C#
double value = double.Parse("1E5000");

doubleは非常に大きな値を扱えますが、無限に大きな値を扱えるわけではありません。

対策としては、TryParseを使って変換できるか確認します。

C#
string text = "1E5000";

if (double.TryParse(text, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("doubleの範囲外、または数値形式が不正です。");
}

.NETのバージョンによっては、非常に大きな値がInfinityとして扱われる場合もあります。そのため、変換後に無限大かどうかを確認するとより安全です。

C#
string text = "1E5000";

if (double.TryParse(text, out double value))
{
if (double.IsInfinity(value))
{
Console.WriteLine("値が大きすぎます。");
}
else
{
Console.WriteLine(value);
}
}
else
{
Console.WriteLine("変換できませんでした。");
}

5-4. null・空文字・スペースを安全に処理する方法

null、空文字、スペースだけの文字列は、double変換でよく問題になります。

C#
string text1 = null;
string text2 = "";
string text3 = " ";

これらを安全に処理するには、string.IsNullOrWhiteSpaceを使うと便利です。

C#
string input = " ";

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("入力が空です。");
}
else if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("数値に変換できません。");
}

string.IsNullOrWhiteSpaceは、null、空文字、空白だけの文字列をまとめて判定できます。

C#
Console.WriteLine(string.IsNullOrWhiteSpace(null)); // True
Console.WriteLine(string.IsNullOrWhiteSpace("")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True
Console.WriteLine(string.IsNullOrWhiteSpace("123")); // False

入力値を変換する前には、このようなチェックを入れると安全です。

5-5. 変換失敗時にデフォルト値を設定する方法

変換に失敗したときに、デフォルト値として0を使いたい場合があります。

C#
string input = "abc";

double value = double.TryParse(input, out double result) ? result : 0;

Console.WriteLine(value);

このコードでは、変換に成功した場合は変換後の値を使い、失敗した場合は0を使います。

メソッド化すると、再利用しやすくなります。

C#
static double ToDoubleOrDefault(string input, double defaultValue = 0)
{
return double.TryParse(input, out double value) ? value : defaultValue;
}

使い方は次のとおりです。

C#
double value1 = ToDoubleOrDefault("123.45");
double value2 = ToDoubleOrDefault("abc");
double value3 = ToDoubleOrDefault("abc", -1);

Console.WriteLine(value1); // 123.45
Console.WriteLine(value2); // 0
Console.WriteLine(value3); // -1

変換失敗時の値を明確に決めておくことで、エラー処理の方針が分かりやすくなります。

6. 小数点やカンマで失敗する場合のカルチャ対策

6-1. double.Parseが環境によって失敗する理由

double.Parsedouble.TryParseは、実行環境のカルチャ設定の影響を受けます。

カルチャとは、言語や地域ごとの数値・日付・通貨などの表記ルールです。

たとえば、日本語環境や英語環境では、小数点に.を使うのが一般的です。

123.45

一方、一部のヨーロッパ圏では、小数点として,を使うことがあります。

123,45

そのため、同じ文字列でも実行環境によって変換できたり、できなかったりする場合があります。

C#
double value = double.Parse("1.23");

このコードは多くの環境で問題なく動きますが、カルチャによっては意図しない解釈になる可能性があります。

特に、CSV、JSON、APIなど、国や環境に依存しないデータを扱う場合は、カルチャを明示することが重要です。

6-2. CultureInfo.InvariantCultureを指定する方法

カルチャの影響を避けたい場合は、CultureInfo.InvariantCultureを指定します。

C#
using System.Globalization;

string text = "123.45";

double value = double.Parse(text, CultureInfo.InvariantCulture);

Console.WriteLine(value);

TryParseでも指定できます。

C#
using System.Globalization;

string text = "123.45";

if (double.TryParse(
text,
NumberStyles.Float,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("変換できませんでした。");
}

InvariantCultureは、特定の国や地域に依存しないカルチャです。JSONやAPIなど、.を小数点として扱うデータでは、InvariantCultureを指定すると安全です。

6-3. 日本語環境と海外環境での小数点・桁区切りの違い

日本語環境では、一般的に小数点には.、桁区切りには,を使います。

1,234.56

この場合、1,234.56は「千二百三十四点五六」を意味します。

一方、地域によっては小数点と桁区切りの意味が逆になることがあります。

1.234,56

この形式では、.が桁区切り、,が小数点として使われる場合があります。

そのため、海外向けのデータや多言語対応アプリケーションでは、次のような点に注意が必要です。

C#
using System.Globalization;

string text = "1,234.56";

double value = double.Parse(text, CultureInfo.InvariantCulture);

Console.WriteLine(value);

日本語環境だけで動かすアプリケーションでは問題になりにくいですが、サーバー環境やコンテナ、クラウド環境ではカルチャが想定と異なる場合があります。

そのため、データ形式が決まっている場合は、実行環境に任せずカルチャを明示するのがおすすめです。

6-4. NumberStylesを使ってカンマや指数表記に対応する方法

NumberStylesを使うと、どのような数値形式を許可するかを指定できます。

たとえば、カンマ区切りの数値を許可するには、NumberStylesAllowThousandsを含めます。

C#
using System.Globalization;

string text = "1,234.56";

double value = double.Parse(
text,
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture);

Console.WriteLine(value);

TryParseでも同じように指定できます。

C#
using System.Globalization;

string text = "1,234.56";

if (double.TryParse(
text,
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("変換できませんでした。");
}

指数表記を扱う場合も、NumberStyles.Floatを指定すると対応できます。

C#
using System.Globalization;

string text = "1.23E3";

if (double.TryParse(
text,
NumberStyles.Float,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value); // 1230
}

よく使う指定は、次の組み合わせです。

C#
NumberStyles.Float

小数、符号、指数表記などを扱う場合に使います。

C#
NumberStyles.Float | NumberStyles.AllowThousands

小数、符号、指数表記に加えて、桁区切りのカンマも許可したい場合に使います。

6-5. CSV・JSON・APIデータを変換するときの注意点

CSV、JSON、APIデータをdoubleに変換するときは、カルチャを明示することが重要です。

特にJSONでは、小数点には.が使われます。

JSON
{
"value": 123.45
}

文字列として取得した場合も、基本的にはInvariantCultureで変換すると安全です。

C#
using System.Globalization;

string valueFromApi = "123.45";

if (double.TryParse(
valueFromApi,
NumberStyles.Float,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value);
}

CSVでは、桁区切りのカンマが含まれている場合があります。

1,234.56

この場合は、AllowThousandsを指定します。

C#
using System.Globalization;

string valueFromCsv = "1,234.56";

if (double.TryParse(
valueFromCsv,
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value);
}

ただし、CSVではカンマが区切り文字としても使われるため、1,234.56のような値はダブルクォーテーションで囲まれていることがあります。

csv
"name","amount"
"apple","1,234.56"

CSVパーサーで正しく読み込んだうえで、数値変換するようにしましょう。

7. 実践で使えるdouble変換のコード例

7-1. 入力文字列をdoubleに変換する基本例

最も基本的な例です。

C#
string input = "123.45";

double value = double.Parse(input);

Console.WriteLine(value);

変換できることが分かっている文字列であれば、Parseで簡潔に書けます。

ただし、入力値が不確実な場合は、次のようにTryParseを使います。

C#
string input = "123.45";

if (double.TryParse(input, out double value))
{
Console.WriteLine($"変換成功: {value}");
}
else
{
Console.WriteLine("変換失敗");
}

実務では、外部入力に対してはこちらの書き方を基本にすると安全です。

7-2. 変換できない場合にエラーメッセージを表示する例

ユーザーが入力した文字列をdoubleに変換し、失敗した場合にエラーメッセージを表示する例です。

C#
Console.Write("数値を入力してください: ");
string input = Console.ReadLine();

if (double.TryParse(input, out double value))
{
Console.WriteLine($"入力値: {value}");
}
else
{
Console.WriteLine("エラー: 数値を入力してください。");
}

空文字やスペースだけの入力を別扱いにしたい場合は、次のように書けます。

C#
Console.Write("数値を入力してください: ");
string input = Console.ReadLine();

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("エラー: 入力が空です。");
}
else if (double.TryParse(input, out double value))
{
Console.WriteLine($"入力値: {value}");
}
else
{
Console.WriteLine("エラー: 数値形式が正しくありません。");
}

このように分けることで、ユーザーにより分かりやすいエラーメッセージを表示できます。

7-3. nullや空文字なら0を返す例

nullや空文字なら0を返し、それ以外はdouble変換を試す例です。

C#
static double ToDoubleOrZero(string input)
{
if (string.IsNullOrWhiteSpace(input))
{
return 0;
}

return double.TryParse(input, out double value) ? value : 0;
}

使い方は次のとおりです。

C#
Console.WriteLine(ToDoubleOrZero("123.45")); // 123.45
Console.WriteLine(ToDoubleOrZero(null)); // 0
Console.WriteLine(ToDoubleOrZero("")); // 0
Console.WriteLine(ToDoubleOrZero("abc")); // 0

デフォルト値を引数で指定できるようにすると、さらに使いやすくなります。

C#
static double ToDoubleOrDefault(string input, double defaultValue)
{
if (string.IsNullOrWhiteSpace(input))
{
return defaultValue;
}

return double.TryParse(input, out double value) ? value : defaultValue;
}
C#
double value = ToDoubleOrDefault("abc", -1);

Console.WriteLine(value); // -1

7-4. カルチャを固定して安全に変換する例

APIやJSONなど、.を小数点として扱うデータでは、InvariantCultureを指定します。

C#
using System.Globalization;

static bool TryParseDoubleInvariant(string input, out double value)
{
return double.TryParse(
input,
NumberStyles.Float,
CultureInfo.InvariantCulture,
out value);
}

使い方は次のとおりです。

C#
if (TryParseDoubleInvariant("123.45", out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("変換できませんでした。");
}

カンマ区切りも許可したい場合は、AllowThousandsを追加します。

C#
using System.Globalization;

static bool TryParseDoubleInvariantWithThousands(string input, out double value)
{
return double.TryParse(
input,
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture,
out value);
}
C#
if (TryParseDoubleInvariantWithThousands("1,234.56", out double value))
{
Console.WriteLine(value); // 1234.56
}

このように、変換ルールをメソッド化しておくと、プロジェクト全体で統一した変換ができます。

7-5. LINQで文字列配列をdouble配列に変換する例

文字列配列をdouble配列に変換する場合、すべての値が正しい数値だと分かっているならSelectParseを使えます。

C#
using System.Linq;

string[] texts = { "1.1", "2.2", "3.3" };

double[] values = texts
.Select(x => double.Parse(x))
.ToArray();

foreach (double value in values)
{
Console.WriteLine(value);
}

ただし、不正な値が含まれる可能性がある場合は、TryParseを使います。

C#
using System.Linq;

string[] texts = { "1.1", "abc", "2.2", "", "3.3" };

double[] values = texts
.Select(x => double.TryParse(x, out double value) ? (double?)value : null)
.Where(x => x.HasValue)
.Select(x => x.Value)
.ToArray();

foreach (double value in values)
{
Console.WriteLine(value);
}

このコードでは、変換できた値だけをdouble配列にしています。

変換できない値を0に置き換える場合は、次のように書けます。

C#
using System.Linq;

string[] texts = { "1.1", "abc", "2.2", "", "3.3" };

double[] values = texts
.Select(x => double.TryParse(x, out double value) ? value : 0)
.ToArray();

foreach (double value in values)
{
Console.WriteLine(value);
}

データの性質に応じて、「不正値を除外する」のか「デフォルト値に置き換える」のかを決めましょう。

8. double変換時に知っておきたい注意点

8-1. doubleは誤差が発生する可能性がある

doubleは浮動小数点数のため、小数の計算で誤差が出ることがあります。

たとえば、次のコードを見てください。

C#
double a = 0.1;
double b = 0.2;

Console.WriteLine(a + b);

期待する結果は0.3ですが、環境や表示方法によっては次のような値になることがあります。

0.30000000000000004

これはC#特有の問題ではなく、浮動小数点数の仕組みによるものです。

doubleは多くの計算で便利ですが、完全に正確な小数計算が必要な場合には注意が必要です。

8-2. 金額計算にはdecimalを使うべき理由

金額計算では、doubleではなくdecimalを使うのが一般的です。

C#
decimal price = 100.25m;
decimal taxRate = 0.10m;

decimal total = price * (1 + taxRate);

Console.WriteLine(total);

decimalは、doubleよりも10進数の小数を正確に扱いやすい型です。

たとえば、次のような用途ではdecimalが向いています。

C#
金額
税率
請求額
割引額
会計処理

一方、doubleは次のような用途に向いています。

C#
測定値
統計値
科学計算
座標
距離
角度

文字列をdecimalに変換する場合は、decimal.Parsedecimal.TryParseを使います。

C#
if (decimal.TryParse("123.45", out decimal amount))
{
Console.WriteLine(amount);
}

金額を扱う場合は、安易にdoubleへ変換しないようにしましょう。

8-3. int・float・decimalへの変換との違い

C#には、double以外にも数値型があります。

intは整数を扱う型です。

C#
int value = int.Parse("123");

小数を含む文字列は、通常そのままint.Parseでは変換できません。

C#
int value = int.Parse("123.45"); // FormatException

floatは単精度浮動小数点数です。

C#
float value = float.Parse("123.45");

doubleより使用メモリは少ないですが、精度も低くなります。

decimalは、10進数の小数を正確に扱いやすい型です。

C#
decimal value = decimal.Parse("123.45");

それぞれの使い分けは次のように考えると分かりやすいです。

C#
int     // 整数
float // 精度より軽さを重視する小数
double // 一般的な小数計算
decimal // 金額など正確な10進小数

文字列を変換するときは、目的に合った型のParseまたはTryParseを使いましょう。

8-4. 変換前に入力チェックを行う重要性

double変換では、変換処理そのものだけでなく、変換前の入力チェックも重要です。

たとえば、次のような入力はそのまま変換できない可能性があります。

空文字
空白
null
単位付きの値
全角文字
カンマを含む値
想定外のカルチャ形式

単位付きの値を扱う場合は、単位を取り除いてから変換します。

C#
string input = "123.45kg";

input = input.Replace("kg", "");

if (double.TryParse(input, out double value))
{
Console.WriteLine(value);
}

ただし、単純なReplaceでは想定外の文字列に弱い場合があります。実務では、入力仕様を明確にしたうえで、必要に応じて正規表現や専用のパーサーを使うことも検討します。

基本は、次の流れです。

C#
入力値を取得する
null・空文字をチェックする
必要なら不要な文字を取り除く
カルチャやNumberStylesを指定する
TryParseで変換する
失敗時の処理を行う

変換処理だけでなく、入力値の前処理と失敗時の扱いまで設計しておくことが大切です。

9. C#のdouble変換に関するよくある質問

9-1. double.ParseとConvert.ToDoubleは何が違う?

double.Parseは、文字列をdoubleに変換するためのメソッドです。

C#
double value = double.Parse("123.45");

Convert.ToDoubleは、文字列だけでなく、他の型からdoubleへ変換する用途でも使われます。

C#
int number = 123;

double value = Convert.ToDouble(number);

大きな違いの1つは、nullの扱いです。

C#
string text = null;

double value = Convert.ToDouble(text);

Console.WriteLine(value); // 0

Convert.ToDouble(null)0を返します。

一方、double.Parse(null)は例外になります。

C#
string text = null;

double value = double.Parse(text); // ArgumentNullException

文字列が必ず数値である場合はdouble.Parse、変換失敗の可能性がある場合はdouble.TryParsenull0として扱いたい場合や他の型も扱いたい場合はConvert.ToDoubleを検討するとよいでしょう。

9-2. TryParseで変換失敗したとき変数の値はどうなる?

double.TryParseで変換に失敗した場合、戻り値はfalseになります。

C#
bool success = double.TryParse("abc", out double value);

Console.WriteLine(success);
Console.WriteLine(value);

実行結果は次のようになります。

False
0

out引数の変数には、doubleの既定値である0が入ります。

ただし、0が入るからといって、変換に成功して0になったのか、失敗して0になったのかは、値だけでは判断できません。

そのため、必ず戻り値のboolを確認しましょう。

C#
if (double.TryParse("abc", out double value))
{
Console.WriteLine($"変換成功: {value}");
}
else
{
Console.WriteLine("変換失敗");
}

9-3. “1,234.56”をdoubleに変換するには?

1,234.56のように桁区切りカンマを含む文字列を変換するには、NumberStyles.AllowThousandsを指定します。

C#
using System.Globalization;

string text = "1,234.56";

double value = double.Parse(
text,
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture);

Console.WriteLine(value);

TryParseを使う場合は、次のように書きます。

C#
using System.Globalization;

string text = "1,234.56";

if (double.TryParse(
text,
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("変換できませんでした。");
}

CSVやAPIなどから取得した値では、実行環境のカルチャに依存しないようにCultureInfo.InvariantCultureを指定するのがおすすめです。

9-4. “1.23”がFormatExceptionになるのはなぜ?

"1.23"FormatExceptionになる場合、実行環境のカルチャで.が小数点として扱われていない可能性があります。

たとえば、一部の地域設定では,を小数点として扱います。

その場合、"1.23"が想定どおりの小数として解釈されないことがあります。

対策として、.を小数点として扱うデータではInvariantCultureを指定します。

C#
using System.Globalization;

string text = "1.23";

double value = double.Parse(text, CultureInfo.InvariantCulture);

Console.WriteLine(value);

TryParseの場合は次のように書きます。

C#
using System.Globalization;

string text = "1.23";

if (double.TryParse(
text,
NumberStyles.Float,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("変換できませんでした。");
}

環境によって動作が変わると困る場合は、カルチャを明示しましょう。

9-5. 文字列が数値かどうかだけ判定できる?

文字列が数値かどうかだけを判定したい場合も、double.TryParseを使えます。

C#
string input = "123.45";

bool isNumber = double.TryParse(input, out _);

Console.WriteLine(isNumber);

out _を使うと、変換結果を使わずに成功・失敗だけを判定できます。

C#
if (double.TryParse("123.45", out _))
{
Console.WriteLine("数値です。");
}
else
{
Console.WriteLine("数値ではありません。");
}

カルチャを固定して判定したい場合は、次のように書きます。

C#
using System.Globalization;

string input = "123.45";

bool isNumber = double.TryParse(
input,
NumberStyles.Float,
CultureInfo.InvariantCulture,
out _);

Console.WriteLine(isNumber);

数値かどうかを判定するだけでも、対象データの形式に合わせてNumberStylesCultureInfoを指定すると安全です。

まとめ

C#で文字列をdoubleに変換するには、主にdouble.Parsedouble.TryParseConvert.ToDoubleを使います。

double.Parseは、文字列が数値として正しいと分かっている場合に便利です。

C#
double value = double.Parse("123.45");

ただし、変換できない文字列を渡すとFormatExceptionArgumentNullExceptionなどの例外が発生します。

ユーザー入力やCSV、JSON、APIなど、変換できるか分からない値を扱う場合は、double.TryParseを使うのが安全です。

C#
if (double.TryParse("123.45", out double value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("変換できませんでした。");
}

また、小数点やカンマの扱いはカルチャによって変わることがあります。環境に依存しない変換を行いたい場合は、CultureInfo.InvariantCultureNumberStylesを指定しましょう。

C#
using System.Globalization;

if (double.TryParse(
"1,234.56",
NumberStyles.Float | NumberStyles.AllowThousands,
CultureInfo.InvariantCulture,
out double value))
{
Console.WriteLine(value);
}

基本的な使い分けは次のとおりです。

C#
Parse          // 正しい数値文字列であることが保証されている場合
TryParse // 変換に失敗する可能性がある場合
Convert.ToDouble // nullを0として扱いたい場合や他の型から変換したい場合

実務では、外部入力にはTryParseを使い、必要に応じてCultureInfoNumberStylesを指定することで、エラーに強いdouble変換を実装できます。