佐々木屋

技術的なことから趣味まで色々書きます

TryParseメソッドのカンマ区切り挙動

TryParseメソッドは、数値ではなくカンマ区切りの数値を渡したときの挙動が型によって微妙に違います。

よく使われるint、long、double、decimalで説明します。

int value;
Console.WriteLine(int.TryParse("1,234", out value)); //false

long value;
Console.WriteLine(long.TryParse("1,234", out value)); //false

double value;
Console.WriteLine(double.TryParse("1,234", out value)); //true

decimal value;
Console.WriteLine(decimal.TryParse("1,234", out value)); //true
Dim value As Integer
Console.WriteLine(Integer.TryParse("1,234", value)) 'False

Dim value As Long
Console.WriteLine(Long.TryParse("1,234", value)) 'False

Dim value As Double
Console.WriteLine(Double.TryParse("1,234", value)) 'True

Dim value As Decimal
Console.WriteLine(Decimal.TryParse("1,234", value)) 'True

double型とdecimal型は問題なく型変換できますが、int型とlong型ではエラーになります。なぜこのようなことが起きるのでしょうか。


原因はSystem.GlobalizationクラスのNumberStyles列挙体の既定値が異なるためです。double型とdecimal型はAnyが指定されていますが、int型とlong型は(恐らく)Integerが指定されています。この為カンマが入った数値は許容外となるためfalseを返すわけです。

これを回避するには、NumberStyles列挙体でAllowThousandsなどを明示的に指定します。なお、NumberStyles列挙体を第二引数に指定した場合、第三引数にNumberFormatInfoクラスを指定しなければなりません。通常は現在のカルチャに対して実行しますので、CurrentInfoを指定します。

int value;
Console.WriteLine(int.TryParse(" 1234", NumberStyles.AllowThousands
                               , NumberFormatInfo.CurrentInfo, out value));
Dim value As Integer
Console.WriteLine(Integer.TryParse("1,234", NumberStyles.AllowThousands _
                                   , NumberFormatInfo.CurrentInfo, value))



参考までにNumberStyles列挙体の一覧をまとめておきます。

フィールド 許容内容
AllowCurrencySymbol 通貨記号
AllowDecimalPoint 小数点
AllowExponent 指数
AllowHexSpecifier 16進数
AllowLeadingSign 先頭符号
AllowTrailingSign 後続符号
AllowLeadingWhite 先頭空白
AllowTrailingWhite 後続空白
AllowThousands 3桁区切りカンマ
Any 16進数(AllowHexSpecifier)以外全て
Currency 指数(AllowExponent)と16進数(AllowHexSpecifier)以外全て
Float 先頭空白(AllowLeadingWhite)、最後空白(AllowTrailingWhite)
指数(AllowExponent)、小数点(AllowDecimalPoint)
先頭符号(AllowLeadingSign)
HexNumber 先頭空白(AllowLeadingWhite)、最後空白(AllowTrailingWhite)
16進数(AllowHexSpecifier )
Integer 先頭空白(AllowLeadingWhite)、最後空白(AllowTrailingWhite)
先頭符号(AllowLeadingSign)
None なし
Number 先頭空白(AllowLeadingWhite)、最後空白(AllowTrailingWhite)
先頭符号(AllowLeadingSign)、後続符号(AllowTrailingSign)
小数点(AllowDecimalPoint)、3桁区切りカンマ(AllowThousands)