C#
パターン2: DateTime.TryParseExact + InvariantCulture — ロケール事故をゼロに
出典: C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり — 3パターンのコード比較 (動作確認つき) / パターン2: DateTime.TryParseExact + InvariantCulture — ロケール事故をゼロに
using System.Globalization;
string[] inputs = { "2026/05/19", "2026-05-19", "2026/5/19", "05/19/2026" };
// NG パターン: DateTime.TryParse — ロケール依存
var jp = new CultureInfo("ja-JP");
var us = new CultureInfo("en-US");
Console.WriteLine("--- DateTime.TryParse (ロケール依存) ---");
foreach (var s in inputs) {
var okJp = DateTime.TryParse(s, jp, DateTimeStyles.None, out var dtJp);
var okUs = DateTime.TryParse(s, us, DateTimeStyles.None, out var dtUs);
Console.WriteLine($" '{s}' → ja-JP={okJp,-5} ({(okJp ? dtJp.ToString("yyyy-MM-dd") : "NG")}) en-US={okUs,-5} ({(okUs ? dtUs.ToString("yyyy-MM-dd") : "NG")})");
}
// OK パターン: TryParseExact + InvariantCulture
Console.WriteLine("--- DateTime.TryParseExact + InvariantCulture (固定) ---");
string[] formats = { "yyyy/MM/dd", "yyyy/M/d", "yyyy-MM-dd" };
foreach (var s in inputs) {
var ok = DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt);
Console.WriteLine($" '{s}' → {(ok ? $"OK ({dt:yyyy-MM-dd})" : "NG (フォーマット不一致)")}");
}
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「3パターンのコード比較 (動作確認つき) / パターン2: DateTime.TryParseExact + InvariantCulture — ロケール事故をゼロに」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// これが本番で刺さるやつ foreach (var line in csvLines) { try { var amount = int.Parse(line[2]); // 空欄 / 全角数字 / カンマ入りで FormatException
▶ 実行可
なぜ Parse + try/catch が業務系で刺さるのか
#bbe08af2f511
// 正解 foreach (var line in csvLines) { if (int.TryParse(line[2], out var amount)) { // 業務処理
▶ 実行可
なぜ Parse + try/catch が業務系で刺さるのか
#2a821b7d5eed
string[] inputs = { "1234", "0", "-5", "", "abc", "123", "1,000", null! }; foreach (var s in inputs) { if (int.TryParse(s, out var value)) {
▶ 実行可
パターン1: int.TryParse — 数値変換は bool 戻り値 + out var
#acdf00b7b5e4
public enum Status { Active = 1, Inactive = 2, Pending = 3 } string[] inputs = { "Active", "active", "Pending", "Unknown", "0", "99", "" };
▶ 実行可
パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる
#b310074d2048
