Jak mogę sprawdzić, czy ciąg znaków reprezentuje długi, podwójny lub zwykły ciąg znaków? Muszę to zrobić, ponieważ ta wartość musi zostać zaindeksowana w bazie danych zgodnie z jej typem. Obecnie robię to, próbując parsować ciąg i sprawdzając wyjątki, ale ponieważ kod jest wywoływany bardzo często, zastanawiam się, czy jest na to skuteczniejszy sposób. Mój kod aktualnie wygląda tak:Jak sprawdzić, czy i jaki typ numeru reprezentuje ciąg?
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
}
}
EDIT:
Właśnie zrobiłem szybkie benchmarkingu zgodnie użytkownika @ user949300 sugestii korzystania regex wzorów i wykonywane nieco lepiej niż wyjątkiem kodu obsługi powyżej. Oto kod, w przypadku gdy ktoś inny znajdzie przydatne:
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
}
Oto wyniki testów porównawczych dla sprawdzenia 50.000 wpisów w którym przybliżona podział typów wynosi 50% tęskni, 10% dwuosobowych, 40% ciągi (przedstawiciela obciążenia że moje procesy aplikacyjne):
--- 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
Jeśli używasz 'Java 7' niż spojrzeć na [Multi-catch-bloków-for-wyjątkami] (http://extreme-java.blogspot.com/2011/05/jdk-7 -multi-catch-blocks-for-exceptions.html) – RanRag
@RanRag Nie widzę, w jaki sposób blokowanie wielu bloków jest pomocne w tej sytuacji. Drugi połów znajduje się wewnątrz - nie po - pierwszym bloku catch. – emory
Masz rację, nie widziałem tego. – RanRag