2013-04-29 1 views
0

J'ai du mal à m'assurer que les doubles sont validés correctement dans mon programme. Un utilisateur peut entrer un montant à déposer dans le compte, ce qui devrait être un double (je sais, ce n'est pas ce que je devrais utiliser, mais cela fait partie des directives d'attribution). Théoriquement, l'utilisateur devrait être en mesure de déposer n'importe quel montant - pas seulement £ 30, mais dire, £ 15,23. Ceci est la validation que j'ai actuellement, qui permet les nombres, mais empêche l'entrée d'un arrêt complet, ce qui crée un certain nombre de problèmes.(devrait l'être) double validation simple

Voici le code que j'ai jusqu'à présent:

public static String getBalanceValidation() 
{ 
    //Allow user input capabilities 
    Scanner input = new Scanner (System.in); 
    //Declare variables needed for validation 
    double dblInput = 0; //dblInput is set as 0 
    String strNumber = ""; //strNumber is blank 
    boolean bolSuccessful, bolNumeric; 
    int intCount; 
    char charLetter; 


    do 
    { 
     //set bolSuccessful and bolNumeric as true 
     bolSuccessful = true; 
     bolNumeric = true; 

     try //try user input 
      { 
       System.out.println("Enter the balance to be deposited: "); //User prompt 
       strNumber = input.next(); //User input as string 
       dblInput = Double.parseDouble(strNumber) ; //String input converted to double 


      }// end of try 

     catch (NumberFormatException e) //NumberFormatException disallows letters or symbols in value 
      { 
       System.out.println("Deposit value cannot contain letters!"); //Error message 
       bolSuccessful = false; //set bolSuccessful as false 

       continue; //Return to try 
      }//end of number format catch 


      //create for loop which checks each character throughout the string 
      for (intCount = 0; intCount < strNumber.length(); intCount++) 
       { 
        charLetter = strNumber.charAt(intCount); //charLetter is the alphanumeric value of a character in the string at the point dictated by intCount 


        if (!(charLetter >= '0') && (charLetter <= '9') //if charLetter is not between 0 and 9 
          || (charLetter == '.')) //or charLetter is not a full stop 
         { 
          bolNumeric = false; //Set bolNumeric as false 
         }//end of if construct 
       }//end of for loop 

      if (!bolNumeric) //if bolNumeric is false 
       { 
        System.out.println("Incorrect input format! The balance must be numbers only!"); //Error message 
        bolSuccessful = false; //Set bolSuccessful as false 
       }//end of if construct 

    }while (!bolSuccessful); //While bolSuccessful is false, return to top 


    return strNumber; //return strNumber to be used in main method 
    //end of do method 
}//end of getBalanceValidation method 

Je ne suis pas sûr que ce soit parce que je l'ai utilisé NumberFormatException (est-il quelque chose d'autre pour le double?)

Un grand merci

+1

Définir 'un certain nombre de problèmes'. Vous ne savez pas si * quoi * est à cause de ...? Pas une vraie question. – EJP

+0

Je déteste vraiment les commentaires qui me disent qu'une variable est définie sur 'true':' // set bolSuccessful et bolNumeric comme vrai' – Henrik

+0

Je déteste les commentaires aussi - mais comme je l'ai dit, c'est pour une affectation. On m'a juste dit de commenter comme un fou. –

Répondre

0

Vous avez 2 erreurs dans votre expression booléenne:

if (!(charLetter >= '0') && (charLetter <= '9') || (charLetter == '.')) 

Cette condition est équivalente à:

if ((charLetter < '0') && (charLetter <= '9') || (charLetter == '.')) 

Ce qui peut être simplifié à:

if ((charLetter < '0') || (charLetter == '.')) 

Ainsi, le ! doit être appliqué aux deux premières parties de l'expression:

if (!((charLetter >= '0') && (charLetter <= '9')) || (charLetter == '.')) 

De plus, puisque . n'est pas un nombre, cette expression est équivalente t à:

if (!((charLetter >= '0') && (charLetter <= '9'))) 

Vous vouliez probablement dire && pas ||:

if (!((charLetter >= '0') && (charLetter <= '9')) && (charLetter != '.')) 

Ce qui signifie if(not_a_number AND not_a_full-stop)

+0

Fonctionne un traitement- Merci beaucoup. Si j'avais su que ce n'était pas ou dans ce cas, je travaillais principalement avec des noms de validation. Merci! –

0

Vous pouvez double number = input.nextDouble(); au lieu de strNumber = input.next();. Cela vous permet de saisir le number directement sous la forme double au lieu de String.

Vous devez gérer InputMismatchException dans votre bloc catch, et vous êtes prêt à partir. Vous n'avez pas besoin de valider pour vérifier l'inclusion de ..

0

Il serait beaucoup plus facile en utilisant une expression régulière:

bolNumeric = strNumber.matches("[1-9][0-9]*(\\.[0-9]{1,2})?"); 

Explication: Le premier numéro doit être dans 1-9. Ensuite, autant que vous voulez (y compris aucun) d'autres chiffres peuvent suivre. Ceci est éventuellement suivi d'un point, puis d'au moins un, deux chiffres maximum.