Как преобразовать строку в float и избежать использования try/catch в java?

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

8
02 дек. '11 в 23:10
источник поделиться
3 ответов

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

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

}

Затем вы можете написать шаблон регулярного выражения, который вы используете для проверки String (сложный сбой слишком больших значений), а затем вызовите 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
02 дек. '11 в 23:31
источник

К сожалению, такого метода в 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;
    }
}
4
02 дек. '11 в 23:17
источник

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;
    }
0
02 дек. '11 в 23:24
источник

Посмотрите другие вопросы по меткам или Задайте вопрос