Как распарсить строку в <T extends Number>?

159
05 февраля 2018, 04:48

Есть метод:

private Executable numValidate(int num, By by, Comparator<Integer> comp) {
    return () -> {
        WebElement elem = chrome.findElement(by);
        if (isNull(elem)) {
            return false;
        }
        Integer value = Ints.tryParse(elem.getText());
        return !isNull(value) && comp.compare(num, value) > 0;
    };
}

Нужно сделать более универсальным для любых числовых типов:

private <N extends Number> Executable numValidate(N num, By by, Comparator<N> comp) {
    return () -> {
        WebElement elem = chrome.findElement(by);
        if (isNull(elem)) {
            return false;
        }
        ????Integer value = Ints.tryParse(elem.getText());????
        return !isNull(value) && comp.compare(num, value) > 0;
    };
}

Но как мне распарсить неизестный тип без instanceof?

Answer 1

Здесь вам поможет класс NumberFormat:

Number number = NumberFormat.getInstance().parse("123.45");

Также можно указать локаль для форматов чисел:

Number number1 = NumberFormat.getInstance(Locale.ENGLISH).parse("123.45");
Number number2 = NumberFormat.getInstance(Locale.forLanguageTag("ru")).parse("123,45");
Answer 2

Как вариант, можно просто перебрать все возможные типы:

....
Number value;
try {
    value = Integer.parseInt(string);
} catch (NumberFormatException e) {
    try {
        value = Double.parseDouble(string);
    } catch (NumberFormatException e) {
        try {
            value = Long.parseLong(string);
        } catch (NumberFormatException e) {
            try {
                ...
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("....");
            }
        }
    }
}
....

Либо регуляркой узнать тип и парсить:

....
if (string.matches("-?\\d+")) {//тут при необходимости стоит предусмотреть количество знаков, чтобы распарсить Char/Integer/Long
    value = Integer.parseInt(string);
} else if (string.matches("-?\\d+\\.\\d+")) {
    value = Double.parseDouble(string);
} else......

Либо, если надо только сравнить строки, можно привести их к строкам и сравнить строковым компаратором.

P.S. Также в вашем примере дженерики не нужны.

private Executable numValidate(Number num, By by, Comparator<Number> comp) {
    return () -> {
        WebElement elem = chrome.findElement(by);
        if (isNull(elem)) {
            return false;
        }
        .....
        return !isNull(value) && comp.compare(num, value) > 0;
    };
}
READ ALSO
Ошибка инициализации в конструкторе

Ошибка инициализации в конструкторе

Добрый деньЕсть класс Boy

178
обработка нажатий клавиш java [требует правки]

обработка нажатий клавиш java [требует правки]

как обработать нажатия клавиш в java?

133
Взаимодействие if и for

Взаимодействие if и for

Добрый деньПроблема состоит в том, что программа должна получить 0

163
Сохранение скачанного файла Android

Сохранение скачанного файла Android

Цель: скачать файл и сохранить в папке Downloads При попытке открыть файл для записи таким способом

184