Как проверить, представляет ли строка число и какой тип?

Как я могу проверить, представляет ли строка длинную, двойную или обычную строку? Мне нужно это сделать, потому что это значение нужно проиндексировать в базе данных в соответствии с ее типом. В настоящее время я делаю это, пытаясь проанализировать строку и проверить исключения, но поскольку код вызывается очень часто, мне интересно, есть ли более эффективный способ сделать это. В настоящее время мой код выглядит так:

String value = ...;
// For example, could be "213678", "654.1236781", or "qwerty12345"

try {
    Long longValue = Long.parseLong(value);
    // Index 'longValue' in the database
} catch (NumberFormatException parseLongException) {
    try {
        Double doubleValue = Double.parseDouble(value);
        // Index 'doubleValue' in the database
    } catch (NumberFormatException parseDoubleException) {
        // Index 'value' in the database
    }
}

РЕДАКТИРОВАТЬ:

Я только что провел небольшое упражнение по тестированию производительности в соответствии с предложением @ user949300 использовать шаблоны регулярных выражений, и он работал немного лучше, чем приведенный выше код обработки исключений. Вот код на тот случай, если кто-то другой сочтет его полезным:

Pattern longPattern = Pattern.compile("^[-+]?[0-9]+$");
Pattern doublePattern = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");

// Check for long regex pattern before the double regex pattern
// since the former is a strict subset of the latter
if (longPattern.matcher(value).matches()) {
    // Perform indexing for long in the database
} else if (doublePattern.matcher(value).matches()) {
    // Perform indexing for double in the database
} else {
    // Perform indexing for string in the database
}

Вот результаты сравнительного анализа для проверки 50 000 записей, где приблизительная разбивка по типам составляет 50% длинных, 10% двойных, 40% строк (репрезентативная для рабочей нагрузки, которую обрабатывает мое приложение. ):

--- Exception handling code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 2561 ms

--- Regex pattern matching code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 1565 ms
7
задан Dawood 28 January 2012 в 05:28
поделиться