Results 1 to 2 of 2
  1. #1
    Propinquity is offline Member
    Join Date
    Oct 2013
    Posts
    63
    Rep Power
    0

    Default Fraction Calculator - Parsing Mixed Number Input?

    I'm having a hard time trying to parse mixed numbers to use as an input for my fraction calculator.
    I am attempting to use an underscore "_" as the delimiter.
    Whenever I try to run the program with mixed numbers, I get the following exception:
    Exception in thread "main" java.lang.NumberFormatException: For input string: "5_1"
    at java.lang.NumberFormatException.forInputString(Unk nown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at FractionCalc.fractionCalc(FractionCalc.java:75)
    at FractionCalc.setDataInput(FractionCalc.java:63)

    Could someone please help me with this?
    I managed to parse the fractions correctly, but I'm having trouble getting the mixed numbers to work.
    What I am trying to do in my code to input mixed numbers is parse the whole numbers from the fraction, evaluate them separately, and add the result (wholenumberResult) to the whole number variable (wholeNumber)after the normal fraction is converted to mixed number form, near the end of the program, and evaluate and parse the remaining fraction like normal. However, my parsing isn't working and I have no real idea why.

    Could someone please help and point out what I'm doing wrong, or explain how to do this correctly?



    Java Code:
    import java.util.StringTokenizer;
    import java.text.DecimalFormat;
    
    public class FractionCalc {
        private FractionReducer reducer = new FractionReducer(); //since i had multiple classes,  i used private variables
        private StringTokenizer tokenizer1; //tokenizer for 1st fraction
        private StringTokenizer tokenizer2; //tokenizer for 2nd fraction
        private StringTokenizer tokenizer3; 
        private StringTokenizer tokenizer4; 
        private DecimalFormat formatter; //variable to reduce fraction to decimal form
        private String resultsString; //total printed result
        private String decimalResults; //printed decimal result
        private String strFrac1; //input
        private String strFrac2; //input
        private String operator; //operator (*,-,/,+)
        private String result; //unreduced fraction result
        private String reducedFrac; //reduced fraction result 
        private double resultDec; //decimal variable
        private int wholenumber1;
        private int wholenumber2;
        private int wholenumResult;
        private int num1;
        private int den1;
        private int num2;
        private int den2;
        private int resultDen;
        private int resultNum;
        private char opp;
    
        // Constructor // 
        public FractionCalc(){
            String resultsString = "";
            String decimalResults = "";
            String strFrac1 = "";
            String strFrac2 = "";
            String operator = "";
            String result = "";
            String reducedFrac = "";
            String resultFactor = "";
            double resultDec = 0.0000;
            int wholenumber1 = 0;
            int wholenumber2 = 0;
            int wholenumResult = 0;
            int num1 = 0;
            int den1 = 0;
            int num2 = 0;
            int den2 = 0;
            int resultDen = 0;
            int resultNum = 0;
            char opp;
        }
        // Getters //
        public String getResults(){ return resultsString; }
        public String getDecimalResults(){ return decimalResults; }
    
    
        // Setter //
        public void setDataInput(String frac1, String frac2, String oper){
            strFrac1 = frac1;
            strFrac2 = frac2;
            operator = oper;
            fractionCalc();
        }
        // private // 
        private void fractionCalc(){
            //this creates a tokenizer to split the user input and the delimiter is '/'
            tokenizer1 = new StringTokenizer(strFrac1,"/");
            tokenizer2 = new StringTokenizer(strFrac2,"/");
            tokenizer3 = new StringTokenizer(strFrac1,"_");
            tokenizer4 = new StringTokenizer(strFrac2,"_");
            
            // parse each input as integer then assign to variable
            //first fraction
            if ((strFrac1.contains("_"))) {
            	wholenumber1 = Integer.parseInt(tokenizer3.nextToken()); 
            } //parse mixed number input as integer
            if ((strFrac2.contains("_"))) {
            	wholenumber2 = Integer.parseInt(tokenizer4.nextToken());
            }
            num1 = Integer.parseInt(tokenizer1.nextToken());
            if (!(strFrac1.contains("/")) ) { //if statement accounts for integer input
            	den1 = 1;
            }else{
            den1 = Integer.parseInt(tokenizer1.nextToken());
            }
            //second fraction
            num2 = Integer.parseInt(tokenizer2.nextToken());
            if (!(strFrac2.contains("/")) ) { //if statement accounts for integer input
            	den2 = 1;
            }else{
            den2 = Integer.parseInt(tokenizer2.nextToken());
            }
            
            opp = operator.charAt(0); // string to char
            
            //divide by zero
            if (den1 == 0 || den2 == 0) {
                resultsString = "You cannot divide by zero.";
                decimalResults = "";
            }
            //if not dividing by zero
            else{
                //depending on char choose how to handle calculation 
                switch (opp) { //switch statement
                    case '+':
                        resultNum = (num1*den2) + (num2*den1);
                        resultDen = den1*den2;
                        if ((strFrac1.contains("_") || (strFrac2.contains("_")))) {
                        	wholenumResult = wholenumber1+wholenumber2;
                        }
                        break; //statements after the matching "case" label are executed until "break" statement 
                    case '-':
                        resultNum = (num1*den2) - (num2*den1);
                        resultDen = den1*den2;
                        if ((strFrac1.contains("_") || (strFrac2.contains("_")))){
                        	wholenumResult = wholenumber1-wholenumber2;
                        }
                        break;
                    case '/':
                        resultNum = num1*den2;
                        resultDen = den1*num2;
                        if ((strFrac2.contains("_") || (strFrac2.contains("_")))){
                        	wholenumResult = wholenumber1/wholenumber2;
                        }
                        break;
                    case '*':
                        resultNum = num1*num2;
                        resultDen = den1*den2;
                        if ((strFrac1.contains("_") || (strFrac2.contains("_")))){
                        	wholenumResult = wholenumber1*wholenumber2;
                        }
                        break;
                    default:
                        resultNum = 1;
                        resultDen = 1;
                        break;
                }//end-switch
    
                //build string with result
                int wholeNumber = ( resultNum / resultDen );
                if ((strFrac2.contains("_") || (strFrac2.contains("_")))){
                	wholeNumber = ( resultNum/ resultDen ) + wholenumResult; 
                }
                int partRemainder = ( resultNum % resultDen ); //converting result from improper to mixed fraction
                String mixednumResults = ("" + wholeNumber + "_" + partRemainder + "/" + resultDen );
                result = (resultNum + "/" + resultDen);
                //divide each number for decimal result
                resultDec = (double)resultNum/(double)resultDen;
                // reduces the fraction to 4 significant figures, ex: 4.99998569849 = 4.9999
                formatter = new DecimalFormat("0.0000");
                //set decimalResults
                decimalResults = formatter.format(resultDec); 
                //reduce fraction
                reducer.setFraction(resultNum, resultDen);
                //set reducedFrac
                reducedFrac = reducer.getResultsFrac();
    
                //build and set the result string
                resultsString = num1 + "/" + den1 + " " + opp + " " +
                                num2 + "/" + den2 + " = " + 
                                result + " " + reducedFrac + " (" + mixednumResults + ")";
            }//end-else 
        }//end-calcFraction
    }

  2. #2
    Norm's Avatar
    Norm is offline Moderator
    Join Date
    Jun 2008
    Location
    SW Missouri
    Posts
    17,331
    Rep Power
    25

    Default Re: Fraction Calculator - Parsing Mixed Number Input?

    How do you execute the code for testing? What is the input to the program?
    If you don't understand my response, don't ignore it, ask a question.

Similar Threads

  1. Replies: 3
    Last Post: 11-13-2013, 03:14 PM
  2. Fraction Calculator need help
    By askinne2 in forum New To Java
    Replies: 15
    Last Post: 07-10-2012, 02:33 AM
  3. Replies: 2
    Last Post: 08-21-2010, 10:53 AM
  4. Mixed Fraction
    By x3iancute in forum NetBeans
    Replies: 2
    Last Post: 01-19-2010, 03:15 PM
  5. Mixed Fraction JAVA
    By x3iancute in forum JCreator
    Replies: 0
    Last Post: 01-19-2010, 02:39 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •