Netbeans - VALIDAR Nº DECIMALES

 
Vista:
sin imagen de perfil

VALIDAR Nº DECIMALES

Publicado por antonio peris (9 intervenciones) el 01/05/2018 19:57:16
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.

Por cierto las variables que guardan la parte entera y la parte decimal, no funcionan.

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 parte entera es: "+parteEntera);
JOptionPane.showMessageDialog(null, "La cantidad de dígitos de la parte entera es: "+cuantosEntera);
JOptionPane.showMessageDialog(null, "La parte decimal es: "+parteDecimal);
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.

//No muestra la parte entera.

//No muestra la parte decimal.

}


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 = "";
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