データ型の相互変換
数値型と文字列型
C#では、例えば見た目上は同じ「123」という値でも、数値型と文字列型は別物として扱われます。
文字列としての「123」はそのままでは足し算すらできないので、必要に応じて数値型に変換する必要があります。
この項では異なるデータ型の相互変換の仕方を解説します。
数値型同士の変換は組み込み型の型変換を参照してください。
文字列操作全般はstring型のメソッドを参照してください。
数値型から文字列型への変換
数値型を文字列に変換するにはToStringメソッドを使用します。
int intNum = 123;
float floatNum = 4.56f;
//123
string strInt = intNum.ToString();
//4.56
string strFloat = floatNum.ToString();
ちなみにC#のデータ型はすべてToStringメソッドで文字列にすることができます。
ただし意味のある(実用性のある)文字列になるかはデータ型に依ります。
書式の指定
ToStringメソッドは第一引数に書式を指定して文字列を整形することができます。
標準の数値書式指定文字列
int intNum = 123;
float floatNum = 4.56f;
//16進数表記
string strInt = intNum.ToString("X");
//小数点第1位まで
string strFloat = floatNum.ToString("F1");
Console.WriteLine(strInt);
Console.WriteLine(strFloat);
7B 4.6
書式指定はアルファベット一文字を指定します。
大文字でも小文字でも構いません。
アルファベットに続いて数値を指定することで精度(桁数)を指定することもできます。
書式指定には以下のようなものがあります。
(標準の数値書式指定文字列(Microsoft Docs))
書式指定子 | 説明 | 例 | 実行結果 |
---|---|---|---|
C、c | 通貨。 通貨記号と桁区切り記号を挿入して表示する。 精度指定は小数部の桁数。 |
(12345).ToString("C") (12345).ToString("C1") |
¥12,345 ¥12,345.0 |
D、d | 10進整数。 整数を表示する。 整数型でのみ有効。 精度指定は最低表示桁数。 |
(123).ToString("D") (123).ToString("D5") |
123 00123 |
E、e | 指数。 数値を指数表示する。 精度指定は小数部の桁数。 |
(1.23).ToString("E") (1.23).ToString("E1") (1.23).ToString("E8") |
1.230000E+000 1.2E+000 1.23000000E+000 |
F、f | 固定小数点。 小数を表示する。 精度指定は小数部の桁数。 |
(1.23).ToString("F") (1.23).ToString("F1") (1.23).ToString("F4") (123).ToString("F") |
1.23 1.2 1.2300 123.00 |
G、g | 全般。 指数または固定小数点のいずれかで表示。 (簡潔に表記できるほうで表示される) 精度指定は有効桁数。 |
(1.23).ToString("G") (0.0000123).ToString("G") (1.23).ToString("G2") (0.0000123).ToString("G2") |
1.23 1.23E-05 1.2 1.2E-5 |
N、n | 数値。 桁区切り記号が表示される。 精度指定は小数部の桁数。 |
(123).ToString("N") (12345).ToString("N")) (12345.67).ToString("N0") (12345.67).ToString("N4") |
123.00 12,345.00 12,346 12,345.6700 |
P、p | パーセント。 数値に100を掛け、%記号を挿入して表示する。 精度指定は小数部の桁数。 |
(0.123).ToString("P") (0.123).ToString("P0") (0.123).ToString("P4") |
12.30% 12% 12.3000% |
R、r | ラウンドトリップ。 出来る限り元の数値と同じになるように文字列を表示する。 float、double、BigInteger型でのみ有効。 精度指定は無視される。 |
(0.12345678912345678) .ToString("R") |
0.12345678912345678 |
X、x | 16進数。 16進数で表示する。 整数型のみ有効。 精度指定は結果の文字列の桁数。 |
(123456).ToString("X") (123456).ToString("X8") |
1E240 0001E204 |
通貨の変更
書式指定の「C(c)」は通貨を表しますが、日本語環境では標準で日本円(¥)で表示されます。
これを変更するにはSystem.Globalization.CultureInfo.GetCultureInfoメソッドを第二引数に指定します。
そのままではちょっと記述が長すぎるのでコードの先頭に以下の追加をします。
(usingディレクティブ)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//↓を追加
using System.Globalization;
int num = 123456;
//日本円
Console.WriteLine(num.ToString(
"C", CultureInfo.GetCultureInfo("ja-JP")));
//米ドル
Console.WriteLine(num.ToString(
"C", CultureInfo.GetCultureInfo("en-US")));
//英ポンド
Console.WriteLine(num.ToString(
"C", CultureInfo.GetCultureInfo("en-GB")));
¥123,456 $123,456.00 £123,456.00
同じ設定を使いまわしたい場合は変数に格納します。
CultureInfo ciUS = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine((12345).ToString("C", ciUS));
Console.WriteLine((6789).ToString("C", ciUS));
CultureInfo.GetCultureInfoメソッドに指定可能な文字列は[MS-LCID]: Appendix A: Product Behavior(Microsoft Docs)あたりを参考にしてください。
カスタム数値書式指定文字列
上記に加えてstring.Formatメソッドのカスタム数値書式指定文字列も使用できます。
詳細は上記リンク先のページを参照してください。
//桁数指定
Console.WriteLine((123).ToString("00000"));
//桁数指定(0省略)
Console.WriteLine((0.123).ToString("#.#####"));
//桁区切り
Console.WriteLine((12345.6789).ToString("#,#.####"));
00123 .123 12,345.6789
文字列型から数値型への変換
文字列を数値型に変換するにはデータ型.Parseメソッドまたはデータ型.TryParseメソッドを使用します。
Parse
string str1 = "123";
string str2 = "4.56";
int intNum = int.Parse(str1);
float floatNum = float.Parse(str2);
Console.WriteLine(intNum + floatNum);
127.56
例えばint型に変換したい場合は「int.Parse("123")」とします。
変換後の変数は通常の四則計算ができていることがわかります。
数値に変換できない文字列の場合
Parseメソッドの引数に、数値として判断できない文字列を指定するとエラー(例外)が発生します。
string str = "abc";
//エラー(例外)発生
int intNum = int.Parse(str);
例外は適切に処理をすれば問題ありませんが、Parseメソッドは例外処理が面倒なので次のTryParseメソッドを使用したほうが良いでしょう。
TryParse
TryParseメソッドは、文字列が数値に変換可能かどうかをチェックしてから変換を行います。
string str1 = "123";
string str2 = "4.56";
int intNum;
float floatNum;
bool b1 = int.TryParse(str1, out intNum); //true
bool b2 = float.TryParse(str2, out floatNum); //true
第二引数にout修飾子を指定して、変換結果を受け取りたい変数を指定します。
TryParseメソッドの戻り値は変換に成功すれば真、失敗すれば偽です。
数値に変換できない文字列の場合
変換に失敗した場合は値が「0」となります。
すでに別の値が代入されている変数を引数に指定した場合でも0で上書きされます。
string str = "abc";
int intNum = 555;
bool b = int.TryParse(str, out intNum); //false
Console.WriteLine(intNum);
0
変換の成否はbool型で返されるので、if文を使えば「変換に失敗した場合に特定の値を代入しておく」といった処理が容易に書けます。
string[] strs = new string[]
{
"123", "456", "abc", "123a"
};
int[] nums = new int[strs.Length];
for(int i= 0; i < strs.Length; i++)
{
if (!int.TryParse(strs[i], out nums[i]))
nums[i] = -1;
}
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}
123 456 -1 -1
bool型を文字列型に変換
bool型を文字列型に変換するには、数値型の時と同じくToStringメソッドを使用します。
bool bTrue = true;
bool bFalse = false;
Console.WriteLine(bTrue.ToString());
Console.WriteLine(bFalse.ToString());
True False
bool型のToStringメソッドは数値型の時のような書式指定はありません。
文字列型をbool型に変換
文字列をbool型へ変換するにはbool.Parseメソッドまたはbool.TryParseメソッドを使用します。
Parse
string str1 = "True";
string str2 = "tRuE";
string str3 = "false";
bool b1, b2, b3;
b1 = bool.Parse(str1); //true
b2 = bool.Parse(str2); //true
b3 = bool.Parse(str3); //false
大文字と小文字は無視して判別されるようです。
TryParse
TryParseの使い方も数値型の時と同じです。
変換に失敗した場合はfalseがセットされます。
string[] strs = new string[]
{
"abc", "1", "0", "trUE", "truee", null
};
bool[] bools = new bool[strs.Length];
for (int i = 0; i < strs.Length; i++)
{
if (bool.TryParse(strs[i], out bools[i]))
{
Console.WriteLine("成功: {0}", strs[i]);
}
else
{
Console.WriteLine("失敗: {0}", strs[i]);
}
}
失敗: abc 失敗: 1 失敗: 0 成功: trUE 失敗: truee 失敗:
bool.Parseおよびbool.TryParseは「TRUE」「FALSE」(大文字小文字の区別なし)以外はすべて変換に失敗するようです。