Подтверждать float через String

Я intendando, не используя try-catch (он не позволяется мне в этом случае), знать, - ли String subceptible в parsearse в double, но он не принимает мне стоимость, как например 1.80. Это метод:

private boolean alturaCorrecta() {
    boolean check = true;
    Character c;
    int control = 0;
    String cadena = TFAltura.getText();
    for (int i = 1; i < (TFAltura.getText().length()+1); i++) {
        c = cadena.charAt(i);
        if (!Character.isDigit(c)) {
            if (c.equals('.') && control == 0) {
                control++;
            } else if (control == 1) {
                check = false;
                break;
            }
            check = false;
            break;
        }
    }
    if(check){
        double valor=parseDouble(cadena);
        if (valor>1.50 && valor < 2.50){
           check=true; 
        }else{
            check = false;
            TAmensajes.setText("La altura debe estar comprendida entre 1.50 y 2.50");
        }
    }
    return check;
}
0
задан 28.11.2016, 13:56
4 ответа

Твоя деталь находится в цикле for, чтобы проверять цепь, тестирует таким образом

for (int i = 0; i < (TFAltura.getText().length()); i++) {
    c = cadena.charAt(i);
    if (!Character.isDigit(c)) {
       if (c.equals('.') && control == 0) {
           control++;
       } else {
           check = false;
           break;
       }
    }
}
1
ответ дан 24.11.2019, 12:21

Ответ @juandej18 функционирует хорошо, и исправляет твою немедленную проблему определения правильно, что цепь "1.80" могут parsear в один double.

Но, трудность несмотря на то, что она пишет нашу собственную логику для этого типа проблемы, состоит в том, что он крайне трудный для того, чтобы это сделать правильно для всех случаев. Например: ты предвосхитил, как манипулировать отрицательными числами?

Так что, концентрируясь на самом общем и интересном вопросе твоего титула: как возможно проверять, если цепь String могут parsear в один double?

Очевидно, все знаем, что возможно делать с одним try-catch таким образом:

public static void main(String args[])
{
    System.out.println(isValidDouble("1.80"));     // true
    System.out.println(isValidDouble("-1.80"));    // true
    System.out.println(isValidDouble("Infinity")); // true
    System.out.println(isValidDouble("NaN"));      // true
    System.out.println(isValidDouble("abc"));      // false
    System.out.println(isValidDouble("23.45.67")); // false
}

private static boolean isValidDouble(String s) {
    boolean isValid = true;

    try {
        Double.parseDouble(s);
    } catch(NumberFormatException nfe) {
        isValid = false;
    }

    return isValid;
}

Демонстрация.

Но ты говоришь, что ты не можешь использовать один try-catch. И, действительно, того, чтобы быть возможным, всегда лучше избегать использовать исключения для нормальных ситуаций. А следовательно я не могу думать, что Java еще не включает официальный метод, что было возможно бы призывать делать эту проверку без того, чтобы ты lanze исключение. C#, например, включи метод TryParse чтобы манипулировать этой ситуацией.

Но interesantemente, если ты смотришь в документации для Double.valueOf(s), ты заметишь секцию, которую он говорит (переведенный):

Чтобы избегать называть этот метод с недействительной цепью, и которая ты lanze один NumberFormatException, возможно использовать регулярное следующее выражение, чтобы проверять цепь заранее:

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

Так что, так как рекомендация находится в официальной документации: почему не использовать ее? Страховки оно будет функционировать лучше, что писать логику из-за нашего счета.

Здесь у тебя есть пример, как использования ее:

public static void main(String args[])
{
    System.out.println(isValidDouble("1.80"));     // true
    System.out.println(isValidDouble("-1.80"));    // true
    System.out.println(isValidDouble("Infinity")); // true
    System.out.println(isValidDouble("NaN"));      // true
    System.out.println(isValidDouble("abc"));      // false
    System.out.println(isValidDouble("23.45.67")); // false
}

private static boolean isValidDouble(String s) {
  final String Digits     = "(\\p{Digit}+)";
  final String HexDigits  = "(\\p{XDigit}+)";
  // an exponent is 'e' or 'E' followed by an optionally
  // signed decimal integer.
  final String Exp        = "[eE][+-]?"+Digits;
  final String fpRegex    =
      ("[\\x00-\\x20]*"+  // Optional leading "whitespace"
       "[+-]?(" + // Optional sign character
       "NaN|" +           // "NaN" string
       "Infinity|" +      // "Infinity" string

       // A decimal floating-point string representing a finite positive
       // number without a leading sign has at most five basic pieces:
       // Digits . Digits ExponentPart FloatTypeSuffix
       //
       // Since this method allows integer-only strings as input
       // in addition to strings of floating-point literals, the
       // two sub-patterns below are simplifications of the grammar
       // productions from section 3.10.2 of
       // The Java Language Specification.

       // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
       "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+

       // . Digits ExponentPart_opt FloatTypeSuffix_opt
       "(\\.("+Digits+")("+Exp+")?)|"+

       // Hexadecimal strings
       "((" +
        // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "(\\.)?)|" +

        // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +

        ")[pP][+-]?" + Digits + "))" +
       "[fFdD]?))" +
       "[\\x00-\\x20]*");// Optional trailing "whitespace"

  return Pattern.matches(fpRegex, s);
}

Демонстрация.

1
ответ дан 24.11.2019, 12:21

Хорошей, estarГ - в добро, которое ты определял немного более каков, - ошибка, которая дает тебе, прикрепляя например сообщение исключения в случае, если это будет.

С другой стороны, for (int i = 1; i < (TFAltura.getText().length()+1); i++) { очень вероятный, что ты lanze один IndexOutOfBoundsException, так как ты всегда будешь пробовать искать еще одно положение tamaГ±o максимум, который у него был бы.

Пытается помещать for (int i = 0; i < TFAltura.getText().length(); i++) {

Из всех форм, как я сказал тебе, пробует определять pco ams ошибку, которая дает тебе.

Приветствие!

0
ответ дан 24.11.2019, 12:21

Твоя логика хорошо. Ошибка, которая тебе должна быть давая, как они говорят, что наверху принадлежит Аррайоутбоунд Индекс

  String cadena = TFAltura.getText();
    for (int i = 1; i < (TFAltura.getText().length()+1); i++) {
        c = cadena.charAt(i);
        if (!Character.isDigit(c)) {
            if (c.equals('.') && control == 0) {
                control++;
            } else if (control == 1) {
                check = false;
                break;
            }
            check = false;
            break;
        }
    }

Vamos из-за шагов одна, наш array тебе кажется определенным, поместив

for (int i = 1; i < (TFAltura.getText () .length () +1); i ++)

мы говорим, что пошло еще одно место, и я очень уверен, что он должен бросать ошибку, мы это оставим этой формы

for (int i = 1; i < (TFAltura.getText () .length ()); i ++)

Так мы получаем весь String без того, чтобы нас производила эта ошибка. Мы идем во второй шаг. Если он состоит в том, что мы находимся в последней цифре и не находим запятую или точку в твоем случае, тогда мы знаем, что он не является десятичным

int last = 0;   

    for (int i = 1; i < (TFAltura.getText().length()); i++) {
            last = i + 1; 
            if(last == TFAltura.getText().length()+1)
            {
                    check = false;
                    break;
            }        
        }

, Уже у нас есть утверждение. Сейчас в следующее утверждение, которое происходит, если тебя перемещают число с

123.123.123

Тогда, это означает, что только может быть точка, а уже он не был бы действительным номером

for (int i = 1; i < (TFAltura.getText().length()); i++) {
        last = i + 1; 
        if(last == TFAltura.getText().length()+1)
        {
                check = false;
                break;
        }
    if (!Character.isDigit(c)) {
        if (c.equals('.')) {
            control++;
        }
        else{ // Si no es un punto entonces es una Letra y ya no es un numero
              check = false;
                break;
        } 


    }        
    }

очень довольно сейчас мы знаем, что, если

контроль> 1 тогда у числа есть более двух запятых или точек

, мы В конце концов возвращаем наши переменные, если он фальшивый

    for (int i = 1; i < (TFAltura.getText().length()); i++) {
            last = i + 1; 
            if(last == TFAltura.getText().length()+1)
            {
                    check = false;
                    break;
            }
        if (!Character.isDigit(c)) {
            if (c.equals('.')) {
                control++;
            }
            else{ // Si no es un punto entonces es una Letra y ya no es un numero
                  check = false;
                    break;
            } 


        }        
        }

  if (check == false){
return check;
}
else if (control > 1){
 return check;
}
else if(control == 1 && check == true)
{ 
        double valor=parseDouble(cadena);
        if (valor>1.50 && valor < 2.50){
           check=true; 
        }else{
            check = false;
            TAmensajes.setText("La altura debe estar comprendida entre 1.50 y 2.50");
        }
}
   return check;

Надеялся смочь вести тебя тебе в небольшом количестве привета.

0
ответ дан 24.11.2019, 12:21