Author Topic: VALIDAR NÚMEROS DECIMALES  (Read 150 times)

TONO2

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
    • View Profile
VALIDAR NÚMEROS DECIMALES
« on: Mayo 03, 2018, 05:51:10 am »
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:

    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:

        // Devuelve true en case de ser un numero decimal
        va10s = txtNDecimal.getText();
        cad = va10s;
        esDecimal(cad);
        RellenaDigitos(cuantosEntera, cuantosDecimal);
        cad = "";



chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5443
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: VALIDAR NÚMEROS DECIMALES
« Reply #1 on: Mayo 03, 2018, 07:14:42 pm »
Hola:

Una vez pones la variable "hayPunto" a true ... nunca más la vuelves a poner a false, por lo que las siguientes llamadas siempre darán que hayPunto.

Saludos.

 

ey