Ammar S
Ammar S

Reputation: 71

parsing for integers from user input in java?

I want to get a rational number from the user in the form 188/4 for example and end up with int 188 and int 4. what is an efficient way to do this in java? is stringTokenizer the best way?? or is there something like scanf in c??

private int NUM;
private int DEN;
static Scanner s;
public Rational(){
    s = new Scanner(System.in).useDelimiter("/");
    System.out.println("Enter Rational number in the form of a/b:");
    NUM = s.nextInt();
    int d = s.nextInt();
    if(d == 0){
        throw new IllegalArgumentException();
    }
    else{
        DEN = d;
    }
}

when I run this my program freezes after I input a number

Upvotes: 0

Views: 2282

Answers (3)

shirrine
shirrine

Reputation: 403

Small tweaks...

private int NUM;
private int DEN;
static Scanner s;
public Rational(){
    System.out.println("Enter Rational number in the form of a/b:");
    s = new Scanner(System.in);
    String[] values = s.next().split("/");

    NUM = Integer.parseInt(values[0]);
    int d = Integer.parseInt(values[1]);
    if(d == 0){
        throw new IllegalArgumentException();
    } else{
        DEN = d;
    }
}

Upvotes: 1

dHoja
dHoja

Reputation: 206

The only way i could think about is to treat is as a string, remove the unnecessary "/" and then turn it back into a int with Integer.parseInt();

  int NUM;
        int DEN;
        Scanner s;
            s = new Scanner(System.in).useDelimiter("/");
            System.out.println("Enter Rational number in the form of a/b:");
            String enteredString = s.nextLine();

            String firstString = "", secondString = "";
            StringBuilder sb = new StringBuilder(enteredString);

            boolean foundWeirdChar = false;
            boolean firstChar = true;
            char tempChar = '/';

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

                if(sb.charAt(i) == tempChar) {
                    foundWeirdChar = true;
                }

                if(!foundWeirdChar) {
                    firstString += sb.charAt(i);
                }else {
                    if(firstChar) { // Because the first char will be "/"
                        firstChar = false;
                    }else{
                     secondString += sb.charAt(i);
                    }
                }
            }
            int a = 0;
            int b = 0;
            try {
                a = Integer.parseInt(firstString);
                b = Integer.parseInt(secondString);

                System.out.println("First int: " + a + "\nSecond int: " + b);

            }catch(NumberFormatException ex) {
                ex.printStackTrace();
            }

Upvotes: 0

Nick Vasic
Nick Vasic

Reputation: 1896

Try something like this (assuming each fraction can be input on a separate line):

        s = new Scanner(System.in).useDelimiter("\n");
        System.out.println("Enter Rational number in the form of a/b:");
        String in = s.nextLine();
        while (in.length() > 0) {
            if (in.contains("/")) {
                try {
                     NUM = Integer.parseInt(in.split("/")[0]);
                     DEN = Integer.parseInt(in.split("/")[1]);
                } catch (Exception e){
                    throw new IllegalArgumentException("Fraction must contain numeric values only");
                }
            } else {
                throw new IllegalArgumentException("Fraction must contain a '/' character");
            }
            System.out.println("NUM = " + NUM + " DEN = " + DEN);
            in = s.nextLine();
        }

Upvotes: 1

Related Questions