Я не верю, что в Java есть что-то встроенное, чтобы делать это быстрее и надежнее, предполагая, что позже вам захочется фактически проанализировать это с Double.valueOf (или подобным).
Я бы использовал Double.parseDouble вместо Double.valueOf, чтобы избежать ненужного создания Double, и вы также можете избавиться от явно глупых чисел быстрее, чем исключение, проверив цифры, 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" или шестнадцатеричные значения. То, хотите ли вы, чтобы они прошли или нет, зависит от контекста.
По моему опыту регулярные выражения работают медленнее, чем чек, указанный выше.