理解しにくい正規表現や、低速になる可能性のあるLinqと配列操作を使用せずに、拡張メソッドの単純なループを使用できます。
とチェックを適応させながら、long
またはint
またはulong
またはまたはその他に使用できます。uint
+
-
解析するように適合させることもfloat
できdouble
ますdecimal
。
このメソッドは、Parse
例外を持つように記述することもできます。
実装
static public class StringHelper
{
static public bool TryParseEndAsLong(this string str, out long result)
{
result = 0;
if ( string.IsNullOrEmpty(str) )
return false;
int index = str.Length - 1;
for ( ; index >= 0; index-- )
{
char c = str[index];
bool stop = c == '+' || c == '-';
if ( !stop && !char.IsDigit(c) )
{
index++;
break;
}
if ( stop )
break;
}
return index <= 0 ? long.TryParse(str, out result)
: long.TryParse(str.Substring(index), out result);
}
}
テスト
test(null);
test("");
test("Test");
test("100");
test("-100");
test("100-200");
test("100 - 200");
test("Test 100");
test("Test100");
test("Test+100");
test("Test-100");
test("11111111111111111111");
Action<string> test = str =>
{
if ( str.TryParseEndAsLong(out var value) )
Console.WriteLine($"\"{str}\" => {value}");
else
Console.WriteLine($"\"{str}\" has not a long at the end");
};
出力
"" has not a long at the end
"" has not a long at the end
"Test" has not a long at the end
"100" => 100
"-100" => -100
"100-200" => -200
"100 - 200" => 200
"Test 100" => 100
"Test100" => 100
"Test+100" => 100
"Test-100" => -100
"11111111111111111111" has not a long at the end