文字列から数値への変換
アプリケーションを開発する際、ユーザーが入力したテキストボックスの値、ファイルから読み込んだデータ、APIから受信したJSONの文字列など、プログラムが受け取るデータの多くはstring(文字列)型です。
これらの文字列(例: "123" や "98.6")を数値として計算で使用するには、intやdoubleなどの数値型に変換する必要があります。C#では、この変換を行うための標準的な方法として Parse と TryParse メソッドが提供されています。
この記事では、これらのメソッドの基本的な使い方と、カンマ区切りや空白を含む書式付き文字列を扱うための NumberStyles について解説します。
Parse メソッド (基本的な変換)
Parse メソッドは、指定された文字列を数値に変換する最も直接的な方法です。各数値型(int, double, decimalなど)が静的メソッドとして提供しています。
using System;
public class ParseBasicExample
{
public static void Main()
{
string stringInteger = "1024";
string stringDouble = "123.45";
// 文字列を int に変換
int intValue = int.Parse(stringInteger);
// 文字列を double に変換
double doubleValue = double.Parse(stringDouble);
Console.WriteLine($"int の結果: {intValue} (型: {intValue.GetType().Name})");
Console.WriteLine($"double の結果: {doubleValue} (型: {doubleValue.GetType().Name})");
}
}
出力結果:
int の結果: 1024 (型: Int32)
double の結果: 123.45 (型: Double)
Parse の注意点: FormatException
Parse メソッドは非常に便利ですが、変換に失敗すると例外(FormatException)をスローするという重大な特性があります。
例えば、文字列が空であったり、"abc" のように数値として解釈できない文字を含んでいたりすると、プログラムは例外で停止します。
// string invalidInput = "NotANumber";
// int result = int.Parse(invalidInput); //ここで FormatException が発生し停止する
TryParse メソッド (安全な変換)
Parse の例外リスクを回避するために、C#では TryParse メソッドの使用が強く推奨されます。
TryParse は、変換の「試行」を行います。
- 変換に成功した場合:
trueを返し、outキーワードで指定した変数に変換後の数値を格納します。 - 変換に失敗した場合:
falseを返し、例外はスローしません。out変数にはその型のデフォルト値(intなら0)が格納されます。
if 文と組み合わせて使用するのが一般的です。
TryParse のコード例
TryParse を使用すれば、ユーザーからの予期しない入力(例: 空白やアルファベット)があっても、プログラムを安全に続行させることができます。
using System;
public class TryParseExample
{
public static void Main()
{
string validNumberString = "500";
string invalidNumberString = "500-ABC";
string emptyString = "";
// 1. 成功する例
if (int.TryParse(validNumberString, out int successResult))
{
Console.WriteLine($"成功: {successResult}");
}
else
{
Console.WriteLine("失敗 (1)");
}
// 2. 失敗する例 (例外は発生しない)
if (double.TryParse(invalidNumberString, out double failureResult))
{
Console.WriteLine($"成功: {failureResult}");
}
else
{
// 変換に失敗するため、こちらが実行される
Console.WriteLine($"失敗 (2): '{invalidNumberString}' は数値ではありません。");
}
// 3. 空白の例
if (int.TryParse(emptyString, out int emptyResult))
{
Console.WriteLine($"成功: {emptyResult}");
}
else
{
Console.WriteLine($"失敗 (3): 文字列が空です。");
}
}
}
出力結果:
成功: 500
失敗 (2): '500-ABC' は数値ではありません。
失敗 (3): 文字列が空です。
NumberStyles による書式指定
"1,234,500"(カンマ区切り)や "-150 "(符号や空白を含む)のような文字列は、標準のParseやTryParseでは変換に失敗します。
これらの書式付き文字列を正しく解釈させるためには、NumberStyles 列挙型を使用して、どのような書式を許可するかを明示的に指定する必要があります。
NumberStyles のコード例
NumberStyles は | (OR) 演算子で複数組み合わせることができます。
using System;
using System.Globalization; // NumberStyles を使用するために必要
public class NumberStylesExample
{
public static void Main()
{
// 1. カンマ区切りとマイナス符号を許可
string stringWithComma = "-1,500,000";
NumberStyles commaStyle = NumberStyles.AllowThousands | NumberStyles.AllowLeadingSign;
if (int.TryParse(stringWithComma, commaStyle, CultureInfo.CurrentCulture, out int commaResult))
{
Console.WriteLine($"カンマ区切り: {commaResult}");
}
// 2. 通貨記号、カンマ、空白、小数点、マイナス符号など、一般的な数値書式を許可
string stringFormatted = " (1,234.50) "; // () は負の数を表す書式
// NumberStyles.Number は AllowLeadingWhite, AllowTrailingWhite,
// AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, AllowThousands を含む
NumberStyles generalStyle = NumberStyles.Number | NumberStyles.AllowParentheses;
if (decimal.TryParse(stringFormatted, generalStyle, CultureInfo.CurrentCulture, out decimal currencyResult))
{
Console.WriteLine($"書式付き数値: {currencyResult}");
}
}
}
(注: TryParseでNumberStylesを使用する場合、CultureInfo.CurrentCultureなどのカルチャ情報を指定するオーバーロードを使用するのが一般的です。)
出力結果:
カンマ区切り: -1500000
書式付き数値: -1234.50
NumberStyles の主なフィールド
NumberStyles には、許可する書式を指定するための多くのフィールドが定義されています。
| フィールド名 | 意味 |
AllowDecimalPoint | 小数点(.)を許可します。 |
AllowExponent | 指数表記(例: 1E05)を許可します。 |
AllowLeadingSign | 先頭の符号(- または +)を許可します。 |
AllowLeadingWhite | 先頭の空白文字を許可します。 |
AllowTrailingSign | 末尾の符号(- または +)を許可します。 |
AllowTrailingWhite | 末尾の空白文字を許可します。 |
AllowThousands | 桁区切り記号(例: ,)を許可します。 |
Number | AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowDecimalPoint, AllowThousands の組み合わせです。(AllowExponent や AllowTrailingSign は含まれません) |
まとめ
C#で文字列を数値に変換する方法は、状況によって使い分けることが重要です。
Parse: 変換できることが確実な場合、または例外処理で対応する場合に使用します。TryParse: ユーザー入力など、変換に失敗する可能性がある文字列を扱う際の標準的な方法です。if文と組み合わせることで、安全かつ効率的なコードになります。NumberStyles: カンマ区切りや通貨記号など、標準的ではない書式の文字列を変換する必要がある場合に使用します。
