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) |