import java.io.BufferedReader ;
import java.io.InputStreamReader ;
import java.io.IOException ; 


/** Klasse zum Einlesen von Zahlen von einem BufferedReader 
 * @author Jan Johannsen
 *
 */
public class Zahlenleser 
{

    private final String INT_PROMPT = "Geben Sie eine Integer-Zahl ein: " ;
    private final String INT_FEHLER_PROMPT = "Das ist keine Integer-Zahl!\nGeben Sie eine neue Integer-Zahl ein: " ;
    private final String DOUBLE_PROMPT = "Geben Sie eine Double-Zahl ein: " ;
    private final String DOUBLE_FEHLER_PROMPT = "Das ist keine Double-Zahl!\nGeben Sie eine neue Double-Zahl ein: " ;

    private BufferedReader eingabe ;
    private boolean zahlGelesen ;

    /** erzeugt einen Zahlenleser
     * @param eingabe der BufferedReader aus dem gelesen wird 
     */
    public Zahlenleser() 
    {
	eingabe = new BufferedReader( new InputStreamReader( System.in ) ) ;
    }

    /** 
     * @return ob eine Zahl gelesen wurde  
     */
    public boolean zahlGelesen() 
    {
	return zahlGelesen ; 
    }


    /** liest einen Integer-Wert
     * @return der gelesene Wert  
     */
    public int liesInt() throws IOException 
    {
	zahlGelesen = true ; 
	return liesInt( INT_PROMPT ) ; 
    }

    private int liesInt( String prompt ) throws IOException 
    {
	String gelesen = lies( prompt ) ; 
	int geleseneZahl ;
	try 
	    {

		geleseneZahl = Integer.parseInt( gelesen ) ;
	    }
	catch ( NumberFormatException ausnahme )
	    {
	        if ( gelesen == null ) 
		    {
			System.out.print("\n") ;
			zahlGelesen = false ;
			geleseneZahl = 0 ;
		    }
		else if ( gelesen.equals( "" ) )
		    {
			zahlGelesen = false ;
			geleseneZahl = 0 ;
		    }
 		else
		    { 
			geleseneZahl = liesInt( INT_FEHLER_PROMPT ) ;
		    }
	    }
	return geleseneZahl ;
    }


    /** liest einen Double-Wert 
     * @return der gelesene Wert  
     */
    public double liesDouble() throws IOException 
    {
	zahlGelesen = true ; 
	return liesDouble( DOUBLE_PROMPT ) ;
    }

    private double liesDouble(String prompt) throws IOException 
    {    
	String gelesen = lies( prompt ) ;
	double geleseneZahl ;
        try 
	    {
	       geleseneZahl = Double.parseDouble( gelesen ) ;
	    }
	catch ( NumberFormatException ausnahme )
	    {
	        if ( gelesen.equals( "" ) )
		    {
			zahlGelesen = false ;
			geleseneZahl = 0 ;
		    }
		else
		    { 
			geleseneZahl = liesDouble( DOUBLE_FEHLER_PROMPT ) ;
		    }
	    }
	catch ( NullPointerException ausnahme )
	    {
		System.out.print("\n") ;
                zahlGelesen = false ;
		geleseneZahl = 0 ;
	    }
	return geleseneZahl ; 
    }


    private String lies(String prompt) throws IOException 
    {
	System.out.print(prompt) ;
	return eingabe.readLine() ; 
    }
					  
}
