型変換は何を使う?(その②)
型変換は何を使う?(その①)の続きです。
sasaki816.hatenablog.com
数値型で有意なParse、TryParse
数値型はnullは許容しませんので、関数化できるならTryParse一択だと思います。但し、string型からの変換のみ利用できることと、TryParseはout引数を持ちますので、変数宣言がひとつ必要となります。
public decimal NL(string value) { decimal res; if (decimal.TryParse(value, out res)) { return res; } else { return 0; } }
Public Function NL(ByVal value As String) As Decimal Dim res As Decimal If Decimal.TryParse(value, res) Then Return res Else Return 0 End If End Function
nullの時(エラーの時)何を返すのか?がミソですね。
なお、null許容型であればC#とVB.NETで少し処理が異なります。VB.NETの場合はIf文による条件分岐かnull条件演算子が有用ですが、C#の場合はnull合体演算子が使用できます。
nullを許容するConvertクラス
Convertクラスはnullが来ても例外が発生しません。例えばint32へのキャストの場合、nullの時は0を返します。よって、評価後の振る舞いそして意図しない結果を返してしまう恐れがありますので注意が必要です。
string a = "123"; string b = null; Console.WriteLine(Convert.ToInt32(a)); Console.WriteLine(Convert.ToInt32(b));
Dim a As String = "123" Dim b As String = Nothing Console.WriteLine(Convert.ToInt32(a)) Console.WriteLine(Convert.ToInt32(b))
123 0
そもそもParseでもDirectCastでも、構造化例外をしっかり立てればnullを許容する必要はないので、Convertクラスを利用しなければならないような場面は少ないです。逆にnullでも0を返してしまいますので、局所的な部分でなければ正直使いにくいクラスですね。
文字列変換専用のToString
書式設定付きで変換するならToStringが一番適しています。但し、nullは許容していませんので、必要に応じて構造化例外処理が必要となります。
int a = 12345; DateTime b = new DateTime(2019, 4, 1); Console.WriteLine(a.ToString("#,0")); Console.WriteLine(b.ToString("yyyyMMdd"));
Dim a As Integer = 12345 Dim b As DateTime = New Date(2019, 4, 1) Console.WriteLine(a.ToString("#,0")) Console.WriteLine(b.ToString("yyyyMMdd"))
12,345 20190401