Java - VALIDAR NUMEROS DECIMALES

 
Vista:
sin imagen de perfil

VALIDAR NUMEROS DECIMALES

Publicado por antonio peris (10 intervenciones) el 02/05/2018 23:54:31
Hola

Tengo un JDialog con un JTextField para ingresar números. Cuando pierde el foco del JtextField se acciona el public boolean esDecimal(String cad), para verificar si es un número decimal.

El problema que tengo es que la primera vez que valida, lo hace correcto ( por ejemplo con 3.14, dicen las variables, esDecimal o hayPunto que es true (correcto). Pero, sin cerrar el JDialog, marco 3 (no es decimal por carecer del punto y la parte decimal), las variables dicen lo mismo que es true, al igual que todas las siguientes. Es como si no regenerada las variables y tomara el dato del primer caso.

Aclaro que public boolean esDecimal(String cad), después llama a public void RellenaDigitos(int cuantosEntera, int cuantosDecimal), para accionar los JOption y mostrar las variables.

Paro el programa es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
String va10s = "";
String cad = "";
boolean hayPunto=false;
int NDigitos = 0;
int cuantosEntera = 0;
int cuantosDecimal = 0;
String enteros;
String decimal;
int posicionDelPunto=0;
StringBuffer parteEntera;
StringBuffer parteDecimal;
String parteEnteras;
 
 
 
public Prueba6(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
    setLocationRelativeTo(null);
}
 
 
//Devuelve true si la cadena que llega tiene la sintaxis de un decimal
public boolean esDecimal(String cad){
    NDigitos = 0;
    NDigitos = cad.length();
    //boolean hayPunto=false;
    StringBuffer parteEntera = new StringBuffer();
    StringBuffer parteDecimal = new StringBuffer();
    int i=0;
 
    for( i=0;i<cad.length(); i++ )                	      // length.- Devuelve el nº de caracteres del String, expresado en int.
        if ( cad.charAt(i) == '.'){                          //Detectar si hay un punto decimal en la cadena
            hayPunto=true;
        }
        if(hayPunto){                                       //Si hay punto guardar la posición donde se encuentra el carácter punto
            posicionDelPunto=cad.indexOf('.');                 //(si la cadena tiene varios puntos, detecta donde esta el primero).
        }
        else{
            return false;                                      //Si no hay punto; no es decimal
        }
        if( posicionDelPunto == cad.length()-1 || posicionDelPunto== 0){    //Si el punto esta al final o al principio no es un decimal
            return false;
        }
    for( i=0;i<posicionDelPunto; i++ ){
        parteEntera.append(cad.charAt(i)) ;                 //Guardar la parte entera en una variable
 
    }
 
 
    for(i = 0; i<parteEntera.length(); i++)
        if( ! Character.isDigit(parteEntera.charAt(i)) ){    //Si alguno de los caracteres de la parte entera no son digitos no es decimal
            return false;
        }
    for( i=posicionDelPunto+1;i<cad.length(); i++ )
        parteDecimal.append(cad.charAt(i));                 //Guardar la parte decimal en una variable
 
 
    for(i = 0; i<parteDecimal.length(); i++)
        if( ! Character.isDigit(parteDecimal.charAt(i))){   //Si alguno de los caracteres de la parte decimal no es un digito no es decimal
            return false;                                       //Incluye el caso en el que la cadena tenga dos o mas puntos
        }
    cuantosEntera = parteEntera.length();
    cuantosDecimal = parteDecimal.length();
 
    return true;                                        //Si paso todas las pruebas anteriores, la cadena es un Numero decimal
 
}
 
 
 
public void RellenaDigitos(int cuantosEntera, int cuantosDecimal){
    //Aqui se muestran los datos de las variables
    JOptionPane.showMessageDialog(null, "Es decimal: "+esDecimal(cad));
    JOptionPane.showMessageDialog(null, "El dato de hay punto es: "+hayPunto);
    JOptionPane.showMessageDialog(null, "La cantidad de dígitos de cad es: "+NDigitos);
     JOptionPane.showMessageDialog(null, "La cantidad de dígitos de la parte entera es: "+cuantosEntera);
    JOptionPane.showMessageDialog(null, "La cantidad de digitos de la parte decimal es: "+cuantosDecimal);
    JOptionPane.showMessageDialog(null, "El dato de la posición del punto es: "+posicionDelPunto);
    JOptionPane.showMessageDialog(null, "El dato de va10s es :"+va10s);
 
 
    //Si marcamos 3.14 y sin cerrar la pantalla marcamos 3. En el primer caso asigna true (es decimal) y en el segundo (deberia de marcar false, por faltar
    // el punto de separación y la parte decimal) y sucesivos tambien los marca, true. Es como si no analizara el nuevo dato.
 
}


Y en el evento de la perdida del foco:

1
2
3
4
5
6
// Devuelve true en case de ser un numero decimal
va10s = txtNDecimal.getText();
cad = va10s;
esDecimal(cad);
RellenaDigitos(cuantosEntera, cuantosDecimal);
cad = "";
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kingk
Val: 247
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

VALIDAR NUMEROS DECIMALES

Publicado por kingk (108 intervenciones) el 03/05/2018 17:30:53
Hola, dentro del codigo podrias hacer las siguientes modificaciones:

1
2
3
4
for(i=0;i< cad.length();i++)
    if(cad.charAt(i)=='.'){
        hayPunto=true;
    }
Puedes reemplazar el codigo anterior por este:

1
hayPunto=cad.contains(".");
Y para el valor a retornar seria mejor que usaras una variable de tipo boolean:

1
boolean res=true; //Defines por defecto la variable con el valor true
Y en lass condiciones asignas lo que corresponde retornar a la variable booleana

1
2
3
4
5
6
if(hayPunto){ //Si hay punto guardar la posiciósn donde se encuentra el carácter punto 
    posicionDelPunto=cad.indexOf('.'); //(si la cadena tiene varios puntos, detecta donde esta el primero). 
} else{
    //posicionDelPunto=NDigitos;
    res= false; //Si no hay punto; no es decimal 
}
El problema al especificar: return false; como esta en tu codigo es que cuando haces un return el metodo termina su funcion ahi. Por lo tanto no se ejecutaran las siguientes lineas de codigo que corresponden, como por ejemplo:

1
2
cuantosEntera = parteEntera.length();
cuantosDecimal = parteDecimal.length();
Por eso se mantienen los valores del primero, ya que no retornara false, en ningun momento

Simplemente coloca al final el return, segun el ejemplo que te puse, seria asi:

1
return res;
Nota, en la condicion para verificar la posicion del punto, le asigne por falso, la longitud de la cadena, para que saliera la parte decimal y la entera con los datos correctos.

Espero te haya sido de ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

VALIDAR NUMEROS DECIMALES

Publicado por Juan (58 intervenciones) el 04/05/2018 20:24:13
Hola otra opcion que tienes es hacerlo con una expresion regular

mira la clase Pattern y Matcher
1
2
3
4
5
6
7
8
9
10
11
^[0-9]+([.][0-9]+)?$ expreison regular para decimales con punto
 
String patron ="^[0-9]+([.][0-9]+)?$";
 
Pattern pat = Pattern.compile(patron);
Matcher mat = pat.matcher(cadena);
     if (mat.matches()) {
         System.out.println("SI");
     } else {
         System.out.println("NO");
     }

Si cumple el patron esta bien si no esta mal formateado y la expersion dice que empiece por numero y y oblidado un punto seguido de numero y tiene que acabar en numero ...mas o menos ..hay mas opciones y la experion puedes modificarla..para que tambien acepte si no lleva numero..

un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

VALIDAR NUMEROS DECIMALES

Publicado por Juan Francisco (58 intervenciones) el 04/05/2018 20:31:23
Bueno creo que la expresion no te obliga a que lleve punto y numero ..la cosa es mirar el tema de expresiones dar con la buena y utilizarla para formatos..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

VALIDAR NUMEROS DECIMALES

Publicado por antonio peris (10 intervenciones) el 05/05/2018 19:19:12
Muchas gracias a todos y voy hacer las modificaciones que me indicais.

QUE GRANDES SOIS.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

VALIDAR NUMEROS DECIMALES

Publicado por Jorge Pérez (George Cracker) (1 intervención) el 07/07/2021 10:19:27
Una forma de realizarlo siguiendo la misma lógica podría ser:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package org.jorgeperez.util;
 
import javax.swing.JOptionPane;
 
/**
 *
 * @author George Cracker
 */
public class ValidarNumeroReal {
 
    boolean existePunto;
    int cantidadDigitos;
    int cantidadDigitosEnteros;
    int cantidadDigitosDecimales;
    int posicionDelPunto;
    String parteEntera;
    String parteDecimal;
 
    //Devuelve true si la cadena que llega tiene la sintaxis de un decimal
    public boolean esDecimal(String strNumero) {
 
        existePunto = false;
        cantidadDigitos = strNumero.length();
        cantidadDigitosEnteros = 0;
        cantidadDigitosDecimales = 0;
        posicionDelPunto = 0;
        parteEntera = "";
        parteDecimal = "";
        boolean respuesta = true;
 
        existePunto = strNumero.contains(".");
 
        if (existePunto) {
            posicionDelPunto = strNumero.indexOf('.');
        } else {
            respuesta = false; //Si no hay punto; no es decimal
        }
 
        if (posicionDelPunto == strNumero.length() - 1 || posicionDelPunto == 0) {
            //Si el punto esta al final o al principio no es un decimal
            respuesta = false;
        }
 
        //Guardar la parte entera en una variable
        parteEntera = strNumero.substring(0, posicionDelPunto);
 
        for (int i = 0; i < parteEntera.length(); i++) {
            //Si alguno de los caracteres de la parte entera no son digitos no es decimal
            if (!Character.isDigit(parteEntera.charAt(i))) {
                respuesta = false;
            }
        }
 
        parteDecimal = strNumero.substring(posicionDelPunto+1, strNumero.length());
 
        for (int i = 0; i < parteDecimal.length(); i++) {
            //Si alguno de los caracteres de la parte decimal no es un digito no es decimal
            //Incluye el caso en el que la cadena tenga dos o mas puntos
            if (!Character.isDigit(parteDecimal.charAt(i))) {
                respuesta = false;
            }
        }
 
        cantidadDigitosEnteros = parteEntera.length();
        cantidadDigitosDecimales = parteDecimal.length();
 
        return respuesta;
    }
 
    public void run() {
        //Aqui se muestran los datos de las variables
        String dato = JOptionPane.showInputDialog(null, "Ingrese un número real");
        JOptionPane.showMessageDialog(null,
                "El dato es: " + dato + "\n\n"
                + "Es decimal: " + esDecimal(dato) + "\n\n"
                + "Hay punto es: " + existePunto + "\n"
                + "La cantidad de caracteres es: " + cantidadDigitos + "\n"
                + "La cantidad de dígitos de la parte entera es: " + cantidadDigitosEnteros + "\n"
                + "La parte entera es: " + parteEntera + "\n"
                + "La posición del punto es: " + posicionDelPunto + "\n"
                + "La cantidad de digitos de la parte decimal es: " + cantidadDigitosDecimales + "\n"
                + "La parte decimal es: " + parteDecimal + "\n"
        );
    }
 
    public static void main(String[] args) {
        ValidarNumeroReal instancia = new ValidarNumeroReal();
        instancia.run();
    }
 
}


Y la otra forma sería utilizando expresiones regulares, así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package org.jorgeperez.util;
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
 
/**
 *
 * @author Jorge Luis Pérez Canto
 */
public class ValidarNumeroDecimal {
 
    public static void main(String[] args) {
        String dato = JOptionPane.showInputDialog(null, "Ingrese un número real");
        String patron = "^[0-9]+(.[0-9]+)*$";
        Pattern pattern = Pattern.compile(patron);
        Matcher matcher = pattern.matcher(dato);
 
        JOptionPane.showMessageDialog(null, "Es decimal: " + matcher.matches());
    }
}

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar