2016-10-08 5 views
1

meine Aufgabe ist es, ein Programm zu schreiben, um zu überprüfen, ob eine Eingabe-Zeichenfolge eine gültige Nummer ist. eine gültige Zahl ist eine Zahl mit oder ohne ein + oder - Vorzeichen und eine Dezimalzahl wie: (+1 -1 1.0 1.0000000000 -1.0 -1.000000000), aber wenn ich Dinge wie: (1.2.3) einsetze, funktioniert es. was mache ich falschWie mache ich meine zulässigen Eingaben strenger

import java.util.Scanner; 

public class parseNum { 

    public static void main(String[] args) { 
    System.out.println("Please enter a number:"); 
    Scanner input = new Scanner(System.in); 
    String inStr = input.nextLine(); 
    int i; 
    String state = "start"; 

    for (i=0; i<inStr.length(); i++) { 
     if (state.equals("start")) { 
     if (inStr.charAt(i) == '+' || inStr.charAt(i) == '-') { 
      state = "afterSign"; 
      continue; 
     } 
     } 
     // i assume this is where i messed up 
     if(inStr.charAt(i) == ('.')){ 
     if(inStr.charAt(i+1) >= '0' && inStr.charAt(i+1) <= '9'){ 
     state = "accept"; 
     continue; 
     } 
     else{ 
     state = "reject"; 
     break; 
     } 
     } 

     if (inStr.charAt(i) >= '0' && inStr.charAt(i) <= '9') { 
     state = "accept"; 
     continue; 
     } 
     else { 
     state = "reject"; 
     break; 
     } 
    } 

    if (state.equals("accept")) 
     System.out.println("Thank you"); 
    else 
     System.out.println("Invalid input"); 

    input.close(); 
    } 

} 

Antwort

0

Above Ihre for-Schleife einen int erklären die Anzahl der Punkte zu zählen,

int dotCount = 0; 

nächstes wird

gefunden jedes Mal ein Punkt zählen
if(inStr.charAt(i) == ('.')){ 
      dotCount++; //THIS LINE 
      if(inStr.charAt(i+1) >= '0' && inStr.charAt(i+1) <= '9'){ 
       state = "accept"; 
       continue; 
      } 
      else{ 
       state = "reject"; 
       break; 
      } 
     } 

Schließlich , füge eine if-Anweisung hinzu, die ablehnt, wenn sie mehr als 1 findet.

if(dotCount > 1) { 
      state = "reject"; 
      break; 
     } 
+0

JA !!! das hat viel geholfen –

+1

Siehe http://stackoverflow.com/help/someone-answers – c0der

0

Siehe Anmerkungen:

import java.util.Scanner; 

public class ParseNum {//use java naming conventions 

    public static void main(String[] args) { 

     System.out.println("Please enter a number:"); 
     Scanner input = new Scanner(System.in); 
     String inStr = input.nextLine(); 
     int i =0; 
     String state = "start"; 
     int dotCount = 0; 

     //check for +/- outside the loop. It should only be 
     //at the beginning. This will cause number with multiple 
     //+/- signs to fail 
     if (inStr.charAt(0) == '+' || inStr.charAt(0) == '-') { 
      state = "afterSign"; 
      i=1; 
     } 

     for (i=0; i<inStr.length(); i++) { 

      if(inStr.charAt(i) == ('.')){ 
       if(dotCount == 0){ 
        state = "accept"; 
        dotCount++; 
        continue; 
       } 
       else{//multiple dots fond 
        state = "reject"; 
        break; 
       } 
      } 

      if (inStr.charAt(i) >= '0' && inStr.charAt(i) <= '9') { 
       state = "accept"; 
       continue; 
      } 
      else { 
       state = "reject"; 
       break; 
      } 
     } 

     if (state.equals("accept")) 
      System.out.println("Thank you"); 
     else 
      System.out.println("Invalid input"); 

     input.close(); 
    } 
} 

Beachten Sie, dass eine Zahl mit mehreren 0s wie 000.009,8 gültig betrachtet wird.
Eine einfachere und bessere Umsetzung wäre:

public static void main(String[] args) { 

     System.out.println("Please enter a number:"); 
     Scanner input = new Scanner(System.in); 
     String inStr = input.nextLine(); 
     String state = "start"; 

     try { 

      Double d = Double.valueOf(inStr); 
      state = "accept"; 
     } catch (NumberFormatException ex) { 

      state = "reject"; 
     } 

     if (state.equals("accept")) { 
      System.out.println("Thank you"); 
     } else { 
      System.out.println("Invalid input"); 
     } 

     input.close(); 
    } 
Verwandte Themen