後で Double.valueOf (または同様のもの) を使用して実際に解析する必要があると仮定すると、より高速かつ確実に実行するために Java に組み込まれているものはないと思います。
Double.valueOf の代わりに Double.parseDouble を使用して、不必要に Double を作成しないようにします。また、数字、e/E、- および . 予め。したがって、次のようなものです:
public boolean isDouble(String value)
{
boolean seenDot = false;
boolean seenExp = false;
boolean justSeenExp = false;
boolean seenDigit = false;
for (int i=0; i < value.length(); i++)
{
char c = value.charAt(i);
if (c >= '0' && c <= '9')
{
seenDigit = true;
continue;
}
if ((c == '-' || c=='+') && (i == 0 || justSeenExp))
{
continue;
}
if (c == '.' && !seenDot)
{
seenDot = true;
continue;
}
justSeenExp = false;
if ((c == 'e' || c == 'E') && !seenExp)
{
seenExp = true;
justSeenExp = true;
continue;
}
return false;
}
if (!seenDigit)
{
return false;
}
try
{
Double.parseDouble(value);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}
数回試行しても、これはまだ「NaN」または 16 進値をカバーしていないことに注意してください。それらを通過させるかどうかは、コンテキストによって異なります。
私の経験では、正規表現は上記のハードコーディングされたチェックよりも遅くなります。