Cookbook
Cookbook copied to clipboard
文字が数字に変換できるか確かめたい
文字が数字に変換できるか確かめたいという話があり、参考になりそうだったのでIssue作っておきます。 try catchか、ifThrownなどが良さそうです。
https://twitter.com/noNsenseGroove/status/1659534868777426947?t=OVTEF5yOiQqVOTidKX-ILw&s=19
いくつかの観点で最適な方法が変わりそうです。
- D言語の数値リテラルとして判定したいか (std.string.isNumeric)
- ASCII範囲の数値のみ通したいのか (std.ascii.isDigit, 正規表現
[0-9]+) - unicode numerical characterを扱いたいのか (std.uni.isNumber, 正規表現
\d+) - 単純にparseしてみて失敗したらデフォルトの値にする (std.exception.ifThrown)
- 単純にparseしてみてD言語の数値リテラルでなければ例外扱いでよい (std.conv.parse)
私がつい昨日やったのは、
- 単純にparseしてみて失敗した場合に別処理したい(std.exception.collectException / try-catch書くのが面倒だった)
例) ファイル名の一部から日時を取得する
foreach (de; dirEntries(".", "test.*.log", SpanMode.shallow))
{
int year, month, day, hour, minute, second;
if (de.name.baseName[5..9].to!int().collectException(year)
|| de.name.baseName[9..11].to!int().collectException(month)
|| de.name.baseName[11..13].to!int().collectException(day)
|| de.name.baseName[14..16].to!int().collectException(hour)
|| de.name.baseName[16..18].to!int().collectException(minute)
|| de.name.baseName[18..20].to!int().collectException(second))
continue;
auto tim = SysTime(DateTime(year, month, day, hour, minute, second));
writeln(tim);
}