Cookbook icon indicating copy to clipboard operation
Cookbook copied to clipboard

文字が数字に変換できるか確かめたい

Open lempiji opened this issue 2 years ago • 2 comments

文字が数字に変換できるか確かめたいという話があり、参考になりそうだったのでIssue作っておきます。 try catchか、ifThrownなどが良さそうです。

https://twitter.com/noNsenseGroove/status/1659534868777426947?t=OVTEF5yOiQqVOTidKX-ILw&s=19

lempiji avatar May 19 '23 14:05 lempiji

いくつかの観点で最適な方法が変わりそうです。

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

kubo39 avatar May 19 '23 14:05 kubo39

私がつい昨日やったのは、

  • 単純に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);
}

shoo avatar May 20 '23 05:05 shoo