Как преобразовать строку в float и избежать использования try / catch в Java? - PullRequest
9 голосов
/ 03 декабря 2011

В некоторых ситуациях мне нужно преобразовать строку в число с плавающей точкой или какой-либо другой числовой тип данных, но есть вероятность получения некоторых неконвертируемых значений, таких как "-" или "/", и я не могу проверить все значениязаранее удалить их.и я хочу избежать использования try / catch для этого, есть ли другой способ сделать правильное преобразование в Java?что-то похожее на C # TryParse?

Ответы [ 4 ]

5 голосов
/ 03 декабря 2011

Самое простое, о чем я могу подумать, это java.util.Scanner.Однако для этого подхода требуется новый экземпляр Scanner для каждой строки.

String data = ...;
Scanner n = new Scanner(data);
if(n.hasNextInt()){//check if the next chars are integer
  int i = n.nextInt();   
}else{

}

Затем вы можете написать шаблон регулярного выражения, который вы используете для проверки строки (сложный для сбоя слишком больших значений), а затем вызвать Integer.parseInt () после проверки строки на это.

Pattern p = Pattern.compile("insert regex to test string here");
String data = ...;
Matcher m = p.matcher(data);
//warning depending on regex used this may 
//only check part of the string
if(m.matches()){
  int i = Integer.parseInt(data);
}

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

5 голосов
/ 03 декабря 2011

К сожалению, в Java такого метода нет.В Java нет параметра out, поэтому для написания такого метода потребуется возвратить нулевое значение Float для сигнализации об ошибке или передать объект FloatHolder, который можно изменить методом:

public class FloatHolder {
    private float value;

    public void setValue(float value) {
        this.value = value;
    }

    public float getValue() {
        return this.value;
    }
}

public static boolean tryParseFloat(String s, FloatHolder holder) {
    try {
        float value = Float.parseFloat(s);
        holder.setValue(value);
    }
    catch (NumberFormatException e) {
        return false;
    }
}
0 голосов
/ 18 февраля 2019

Это старый вопрос, но поскольку во всех ответах об этом не упоминается (и я сам не знал об этом, пока не увидел его в запросе на слияние, написанном коллегой), я хочу указать потенциальным читателям на гуава Floats и Ints классы:

С помощью этих классов вы можете написать такой код:

    Integer i = Ints.tryParse("10");
    Integer j = Ints.tryParse("invalid");
    Float f = Floats.tryParse("10.1");
    Float g = Floats.tryParse("invalid.value");

Результатом будет null, если значение является недопустимым int или float, и вы можете обрабатывать его любым удобным для вас способом. (Будьте осторожны, чтобы не просто привести его к int / float, поскольку это вызовет NullPointerException, если значение является недопустимым целочисленным значением / значением с плавающей запятой.)

Обратите внимание, что эти методы помечены как "бета", но в любом случае они весьма полезны, и мы используем их в производстве.

Для справки, вот Javadocs для этих классов:

0 голосов
/ 03 декабря 2011

Java не предоставляет некоторые встроенные методы типа tryParse. Одним из решений, которое вы можете попробовать, является создание собственного метода tryParse и использование кода try / catch в этом методе, а затем вы можете легко использовать этот метод в своем приложении. легко и без использования try / catch во всех местах, где вы используете метод.

Одна из примеров функций может иметь следующий код

public static Long parseLong(String value) {

        if(isNullOrEmpty(value)) {
            return null;
        }

        try {
            return Long.valueOf(value);
        }
        catch (NumberFormatException e) {
        }

        return null;
    }
...