Java Grade class, letter grade to number

java

I'm writing a program that takes a letter grade. You'd get 4.0 for A, 3.0 for B, and so forth. If you enter B+ or B-, it will take subtract .3 or add .3 respectively (so B+ would be 3.3).

In my code, when I test a letter like B+ it gives me .3 instead of actually returning the subtracted value of the actual grade. What am I doing wrong?

public class Grade {
    private String grade;
    private double gradeNum;

    // Constructor
    public Grade(String showGrade) {
        grade = showGrade;
        gradeNum = 0;
    }

    // getNumericGrade method to return grade number
    public double getNumericGrade() {
        String suffix;
        suffix = grade.substring(1);

        if(suffix.equals("+")) {
            gradeNum = gradeNum + .3;
        } else if(suffix.equals("-")) {
            gradeNum = gradeNum - .3;
        }

        String letterGrade = grade.substring(0);

        if(letterGrade.equalsIgnoreCase("A")) {
            gradeNum = 4.0;
        } else if(letterGrade.equalsIgnoreCase("B")) {
            gradeNum = 3.0;
        } else if(letterGrade.equalsIgnoreCase("C")) {
            gradeNum = 2.0;
        } else if(letterGrade.equalsIgnoreCase("D")) {
            gradeNum = 1.0;
        } else if(letterGrade.equalsIgnoreCase("F")) {
            gradeNum = 0.0;
        } else {
            System.out.println("Invalid letter grade");
        }

        return gradeNum;
    }
}

Best Solution

You should first process your letter grades so that it initializes gradeNum correctly. Also note that substring(int index) returns a subsequence that starts at the index passed till the end of the string. Hence, none of your letterGrade if blocks ever matched for inputs like A+, B- etc.

if (grade == null || !grade.matches("[A-F][+-]?")) // if grade wasn't specified, or
{// if grade is not between A to F *optionally* followed by a + or - sign
    System.out.println("Invalid letter grade");
    return gradeNum;
}

String letterGrade = grade.substring(0, 1); // pass 1 to exclude + or -

if (letterGrade.equalsIgnoreCase("A"))
{
    gradeNum = 4.0;
}
else if(letterGrade.equalsIgnoreCase("B"))
{
    gradeNum = 3.0;
}
else if(letterGrade.equalsIgnoreCase("C"))
{
  gradeNum = 2.0;
}
else if(letterGrade.equalsIgnoreCase("D"))
{
    gradeNum = 1.0;
}
else if(letterGrade.equalsIgnoreCase("F"))
{
    gradeNum = 0.0; // return from here if you want F = F- = F+
    return gradeNum; // if you want to invalidate F- and F+ look below
}
/* else // not required; already validated by using regex above
{
    System.out.println("Invalid letter grade");
    return gradeNum; // don't forget to RETURN from here
}*/

Then do your suffix processing which adds or subtracts from gradeNum which has been initialized properly now.

String suffix;
suffix = grade.substring(1);
if (suffix.isEmpty()) { // return early if there's no suffix
    return gradeNum;
} else if (gradeNum == 0.0) { // to invalidate F- and F+
    System.out.println("Invalid letter grade");
    return gradeNum;
}
if(suffix.equals("+") && gradeNum != 4.0) // don't increment if grade is A+ (= A = 4.0)
{
    gradeNum = gradeNum + .3;
}
else if (suffix.equals("-"))
{
    gradeNum = gradeNum - .3;
}
return gradeNum;