Search code examples
javaif-statementwhile-loopuser-inputsentinel

Why when I execute my Java program does it not convert the first user input, but does every user input after?


I'm trying to write a java program for currency conversion as a class assignment. My code is working almost exactly the way I would like it to. When executed, it will ask for the user to input the Japanese Yen to US Dollar exchange rate. Enter any number and that works like it should.

However, it will prompt the user next to enter the amount of US dollars they want to convert to Yen. Again, the idea is to enter any number that is > 0 because if the user enters 0 the sentinel value will force a quit and build success message. When you enter a number and click 'Enter,' it just shows a blank line and does not make the conversion like I want it to.

But if you enter a number on that next blank line then it makes the conversion! You can even type in the numbers with spaces: 10 20 50 100... it will convert all of them on separate lines.

I'm just trying to figure out how to get rid of that first black line it gives and go straight into the conversions... or some other workaround.

Here is my code:

// Import scanner Object
import java.util.Scanner;
// Import text Object for formatting
import java.text.DecimalFormat;
/**
 *
 * @author dcraw
 */
public class CurrencyConversion {
    public static void main (String [] args) 
    {
        // Identify Scanner 
        Scanner input = new Scanner(System.in);
        
        // Declare variables
        double USDtoJPY; //JPY stands for Japanese Yen
        double USD;// USD stands for US Dollar
        int count = 0;
        
        // Formatting input
        DecimalFormat f = new DecimalFormat ("#,###.##");
        
        // Ask user to input exchange rate from JPY to USD
        System.out.println("What is today's price in JPY for 1 USD?"); // As of 6/6/2021, 1 USD = 109.55 JPY
        USDtoJPY = input.nextDouble();
        
        // Ask user to input how many USD dollars they want to convert
        System.out.println("Enter amount in USD to convert: (0 to Quit)"); 
        USD = input.nextDouble();
        
        // Process Data until sentinel is entered
        while (USD != 0)
        {
            USD = input.nextDouble();
                count++;
        
            if (count > 0)
            {
                double JPY = USDtoJPY * USD; // Perform calculation with exchange rate
                System.out.println("Your " + USD + " dollars is converted to " + f.format(JPY) + " yen");
            }
            else
            {
                System.out.println("Incorrect Data"); // If data is entered incorrectly print Incorrect data
            }
        }
    } 
}


// Why do I have to input something to get it to start the loop? 

Solution

  • You should move the USD = input.nextDouble(); inside of the while (USD != 0) loop to the end of the loop. Currently you are taking two inputs before the first output. If you move it to the end it works as expected.

    // Import scanner Object
    import java.util.Scanner;
    // Import text Object for formatting
    import java.text.DecimalFormat;
    /**
     *
     * @author dcraw
     */
    public class CurrencyConversion {
        public static void main (String [] args) 
        {
            // Identify Scanner 
            Scanner input = new Scanner(System.in);
            
            // Declare variables
            double USDtoJPY; //JPY stands for Japanese Yen
            double USD;// USD stands for US Dollar
            int count = 0;
            
            // Formatting input
            DecimalFormat f = new DecimalFormat ("#,###.##");
            
            // Ask user to input exchange rate from JPY to USD
            System.out.println("What is today's price in JPY for 1 USD?"); // As of 6/6/2021, 1 USD = 109.55 JPY
            USDtoJPY = input.nextDouble();
            
            // Ask user to input how many USD dollars they want to convert
            System.out.println("Enter amount in USD to convert: (0 to Quit)"); 
            USD = input.nextDouble();
            
            // Process Data until sentinel is entered
            while (USD != 0)
            {
                count++;
            
                if (count > 0)
                {
                    double JPY = USDtoJPY * USD; // Perform calculation with exchange rate
                    System.out.println("Your " + USD + " dollars is converted to " + f.format(JPY) + " yen");
                }
                else
                {
                    System.out.println("Incorrect Data"); // If data is entered incorrectly print Incorrect data
                }
                USD = input.nextDouble(); // move this here
            }
        } 
    }
    

    Or better yet, you can use a do while instead and have input only within the loop:

    import java.util.Scanner;
    import java.text.DecimalFormat;
    /**
     *
     * @author dcraw
     */
    public class DummyClass {
      public static void main (String [] args)
      {
        // Identify Scanner
        Scanner input = new Scanner(System.in);
    
        // Declare variables
        double USDtoJPY; //JPY stands for Japanese Yen
        double USD;// USD stands for US Dollar
    
        // Formatting input
        DecimalFormat f = new DecimalFormat ("#,###.##");
    
        // Ask user to input exchange rate from JPY to USD
        System.out.println("What is today's price in JPY for 1 USD?"); // As of 6/6/2021, 1 USD = 109.55 JPY
        USDtoJPY = input.nextDouble();
    
        // Ask user to input how many USD dollars they want to convert
        System.out.println("Enter amount in USD to convert: (0 to Quit)");
    
        // Process Data until sentinel is entered
        do {
          USD = input.nextDouble();
    
          if (USD > 0)
          {
            double JPY = USDtoJPY * USD; // Perform calculation with exchange rate
            System.out.println("Your " + USD + " dollars is converted to " + f.format(JPY) + " yen");
          }
          else
          {
            System.out.println("Incorrect Data"); // If data is entered incorrectly print Incorrect data
          }
        } while (USD != 0);
      }
    }