简体   繁体   中英

Converting Integers to Roman Numerals in Java

The homework for my Java class instructs us to take an integer input from the user (up to 3999) and convert it into a Roman Numeral. The trouble I am having with the code is that when I input the integer while testing, it sets the integer to 0 and the Roman Numeral prints out as null. This could be a result of declaring the variables inside an object but im unsure at this point.

public class RomanNumerals
{

    // instance variables

    int input;
    String romanNum;

    /**
     * Object that records the input from a user.
     */
    public RomanNumerals()
    {
        int input=0;
        String romanNum="";

        //System.out.println("Input a number to get a Roman Numeral");
        //int input = integer.nextInt();
    }
    public int Scanner()
    {
        Scanner integer = new Scanner(System.in);
        System.out.println("Input a number to get a Roman Numeral: ");
        int input = integer.nextInt();
        return input;
    }
    /**
     * Object that takes the input from the user and determines what roman numerals are appropriate.
     */
    public String Int2Roman()
    {
        if (input < 1 || input > 3999)
        {
            System.out.println("Please input a number between 1 and 3999.");
        }
        while (input >= 1000)
        {
            romanNum = romanNum + "M";
            input = input - 1000;
        }
        while (input >= 900)
        {
            romanNum = romanNum + "CM";
            input = input - 900;
        }
        while (input >= 500)
        {
            romanNum = romanNum + "S";
            input = input - 500;
        }
        while (input >= 400)
        {
            romanNum = romanNum + "CS";
            input = input - 1000;
        }
        while (input >= 100)
        {
            romanNum = romanNum + "C";
            input = input - 100;
        }
        while (input >= 90)
        {
            romanNum = romanNum + "XC";
            input = input - 1000;
        }
        while (input >= 50)
        {
            romanNum = romanNum + "L";
            input = input - 1000;
        }
        while (input >= 40)
        {
            romanNum = romanNum + "XL";
            input = input - 40;
        }
        while (input >= 10)
        {
            romanNum = romanNum + "X";
            input = input - 10;
        }
        while (input >= 9)
        {
            romanNum = romanNum + "IX";
            input = input - 9;
        }
        while (input >= 5)
        {
            romanNum = romanNum + "V";
            input = input - 5;
        }
        while (input >= 4)
        {
            romanNum = romanNum + "IV";
            input = input - 4;
        }
        while (input >= 1)
        {
            romanNum = romanNum + "I";
            input = input - 5;
        }
        System.out.println("The Roman Numeral of " + input + " is " + romanNum);
        return romanNum;
    }
    public static void main(String[] args)
    {
        RomanNumerals a = new RomanNumerals();
        a.Scanner();
        a.Int2Roman();
    }
}

Your Scanner method does not store the keyboard input in the field (instance variable) input but in a local variable input .

Replace

int input = integer.nextInt(); //this declares a new local variable

with

input = integer.nextInt(); //uses the existing field 

try this to see if works , works for me, simple , basic , pretty straight forward

public static void main(String[] args) {



    //INPUNT INTEGER VALUE
    // OUTPUT STRING VALUE (SYSTEM CONSOLE OUTPUT

    //**********************************************************************************//

    int _inValue = 117; //int parameter value


    //**********************************************************************************//

    //check if the number is between 1 and 3999
    if (_inValue < 1){
        System.out.println("integer can't be less than 1");
        return;
    }
    if (_inValue > 3999){
        System.out.println("integer can't be more than 3999");
        return;
    }

    //convert the value in array to work by separate numbers
    char[] arg = String.valueOf(_inValue).toCharArray();

    //count the number of characters to use a case condition or length of the integer in value
    int _count = Integer.toString(_inValue).length();

    // output variable
    String _output = "";

    //case condition base in the length of the integer value
    switch (_count){
        case 1: // case base in one figure (1)
            switch (_inValue){
                case 1:
                    _output = "I";
                    break;
                case 2:
                    _output = "II";
                    break;
                case 3:
                    _output = "III";
                    break;
                case 4:
                    _output = "IV";
                    break;
                case 5:
                    _output = "V";
                    break;
                case 6:
                    _output = "VI";
                    break;
                case 7:
                    _output = "VII";
                    break;
                case 8:
                    _output = "VIII";
                    break;
                case 9:
                    _output = "IX";
                    break;
            }
            break;
        case 2: //case base in two figures (10)
            switch (Character.getNumericValue(arg[0])){//base in the first character of the integer value lets use another case condition
                case 1:
                    _output = "X";
                    break;
                case 2:
                    _output = "XX";
                    break;
                case 3:
                    _output = "XXX";
                    break;
                case 4:
                    _output = "XL";
                    break;
                case 5:
                    _output = "L";
                    break;
                case 6:
                    _output = "LX";
                    break;
                case 7:
                    _output = "LXX";
                    break;
                case 8:
                    _output = "LXXX";
                    break;
                case 9:
                    _output = "XC";
                    break;
            }
            _output += _getValue10(Character.getNumericValue(arg[1])); //lets call this function to get the other two figures or number to complete the integer amount and build the roman value in string
            break;
        case 3: //case base in three figures (100)
            switch (Character.getNumericValue(arg[0])){ //base in the first character of the integer value lets use another case condition
                case 1:
                    _output = "C";
                    break;
                case 2:
                    _output = "CC";
                    break;
                case 3:
                    _output = "CCC";
                    break;
                case 4:
                    _output = "CD";
                    break;
                case 5:
                    _output = "D";
                    break;
                case 6:
                    _output = "DC";
                    break;
                case 7:
                    _output = "DCC";
                    break;
                case 8:
                    _output = "DCCC";
                    break;
                case 9:
                    _output = "CM";
                    break;
            }
            _output += _getValue100(Character.getNumericValue(arg[1]),Character.getNumericValue(arg[2])); //lets call this function to get the other two figures or number to complete the integer amount and build the roman value in string
            break;
        case 4: // case base in 4 figures (1000)

            if(_inValue != 1000){ // validate the value if its different of a 1000
                // use a cycle to concat the string base of the number of the integer in value
                for (int i = 0; i < Character.getNumericValue(arg[0]);i++ ){
                    _output += "M";
                }
            }else{
                // if its a 1000 use this one and that's it
                _output += "M";
            }
            _output += _getValue1000(Character.getNumericValue(arg[1]),Character.getNumericValue(arg[2]),Character.getNumericValue(arg[3])); //lets call this function to get the other three figures or number to complete the integer amount and build the roman value in string
            break;
    }
    System.out.println("the integer number is: " + _inValue);
    System.out.println("the roman number is: " + _output);

}

///method who return the other three values
private static String _getValue1000(int valueOne, int valueTwo, int valueThree){
    String _output = "";
    if(valueOne != 0){
        switch (valueOne){
            case 1:
                _output += "C";
                break;
            case 2:
                _output += "CC";
                break;
            case 3:
                _output += "CCC";
                break;
            case 4:
                _output += "CD";
                break;
            case 5:
                _output += "D";
                break;
            case 6:
                _output += "DC";
                break;
            case 7:
                _output += "DCC";
                break;
            case 8:
                _output += "DCCC";
                break;
            case 9:
                _output += "CM";
                break;
        }

    }
    if(valueTwo != 0){
        switch (valueTwo){
            case 1:
                _output += "X";
                break;
            case 2:
                _output += "XX";
                break;
            case 3:
                _output += "XXX";
                break;
            case 4:
                _output += "XL";
                break;
            case 5:
                _output += "L";
                break;
            case 6:
                _output += "LX";
                break;
            case 7:
                _output += "LXX";
                break;
            case 8:
                _output += "LXXX";
                break;
            case 9:
                _output += "XC";
                break;
        }
    }
    if(valueThree != 0){
        switch (valueThree){
            case 1:
                _output += "I";
                break;
            case 2:
                _output += "II";
                break;
            case 3:
                _output += "III";
                break;
            case 4:
                _output += "IV";
                break;
            case 5:
                _output += "V";
                break;
            case 6:
                _output += "VI";
                break;
            case 7:
                _output += "VII";
                break;
            case 8:
                _output += "VIII";
                break;
            case 9:
                _output += "IX";
                break;
        }

    }

    return _output;
}

/// method who return the other two values
private static String _getValue100(int valueOne, int valueTwo){
    String _output = "";

    if(valueOne != 0){
        switch (valueOne){
            case 1:
                _output += "X";
                break;
            case 2:
                _output += "XX";
                break;
            case 3:
                _output += "XXX";
                break;
            case 4:
                _output += "XL";
                break;
            case 5:
                _output += "L";
                break;
            case 6:
                _output += "LX";
                break;
            case 7:
                _output += "LXX";
                break;
            case 8:
                _output += "LXXX";
                break;
            case 9:
                _output += "XC";
                break;
        }

    }
    if(valueTwo != 0){
        switch (valueTwo){
            case 1:
                _output += "I";
                break;
            case 2:
                _output += "II";
                break;
            case 3:
                _output += "III";
                break;
            case 4:
                _output += "IV";
                break;
            case 5:
                _output += "V";
                break;
            case 6:
                _output += "VI";
                break;
            case 7:
                _output += "VII";
                break;
            case 8:
                _output += "VIII";
                break;
            case 9:
                _output += "IX";
                break;
        }

    }

    return _output;
}

/// method who return one other value
private static String _getValue10(int valueOne){
    String _output = "";

    if(valueOne != 0){
        switch (valueOne){
            case 1:
                _output += "I";
                break;
            case 2:
                _output += "II";
                break;
            case 3:
                _output += "III";
                break;
            case 4:
                _output += "IV";
                break;
            case 5:
                _output += "V";
                break;
            case 6:
                _output += "VI";
                break;
            case 7:
                _output += "VII";
                break;
            case 8:
                _output += "VIII";
                break;
            case 9:
                _output += "IX";
                break;
        }

    }

    return _output;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM