• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 769
  • Last Modified:

Convert Roman Numbers to Decimal Numbers

Im new at using Java and I'm currently doing a project, part of which is to convert inputted  roman number to decimal numeral. Maybe someone can help me on this one. I badly needed it ASAP. Thanks in advance.
0
macjacinto
Asked:
macjacinto
  • 9
  • 9
  • 2
1 Solution
 
poluruCommented:
see the below program

/**
    * convert integer into Roman Numerals.
    * e.g. -12345 -> "minus MMMMMMMMMMMMCCCXLV"
    * Handles negative and positive integers
    * on range -Integer.MAX_VALUE .. Integer.MAX_VALUE;
    * It cannot handle Integer.MIN_VALUE;
    */
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class Roman
{

   public static String inWords( long num )
   {
      if ( num < 0 ) return "The Romans had no negative numbers.";
      if ( num == 0 ) return "The Romans had no zero.";
      if ( num > 100000 ) return "too unwieldy for Roman numerals";
      String s = "";
      // Work least significant digit to most, right to left.
      // until high order part is all 0s.
      for ( int i=0; num>0; i++ )
      {
         int remdr = (int)(num % divisor[i]);
         num = num / divisor[i];
         StringBuffer t;
         if ( i == 3 )
         {
            /* M is as big as it gets, just repeat */
            t = new StringBuffer(remdr);

            for ( int j=0; j<remdr; j++ )
            {
               t.append(unitLetter[i]);
            }
         }
         else
         {
            t = new StringBuffer(3);

            switch ( remdr )
            {
               
               case 0: break;

               case 1:
                  t.append(unitLetter[i]);
                  break;

               case 2:
                  t.append(unitLetter[i]);
                  t.append(unitLetter[i]);
                  break;

               case 3:
                  t.append(unitLetter[i]);
                  t.append(unitLetter[i]);
                  t.append(unitLetter[i]);
                  break;

               case 4:
                  t.append(unitLetter[i]);
                  t.append(fiveLetter[i]);
                  break;

               case 5:
                  t.append(fiveLetter[i]);
                  break;

               case 6:
                  t.append(fiveLetter[i]);
                  t.append(unitLetter[i]);
                  break;

               case 7:
                  t.append(fiveLetter[i]);
                  t.append(unitLetter[i]);
                  t.append(unitLetter[i]);
                  break;

               case 8:
                  t.append(fiveLetter[i]);
                  t.append(unitLetter[i]);
                  t.append(unitLetter[i]);
                  t.append(unitLetter[i]);

                  break;

               case 9:
                  t.append(unitLetter[i]);
                  t.append(unitLetter[i+1]);
                  break;

            } // end switch
         } // end else
         s = t + s;
      } // end for
      return s;
   } // end inWords

   public String toWords (long num)
   {
      return Roman.inWords(num);
   }

   private static final char[] unitLetter =  {
      'I', 'X', 'C', 'M'};

   private static final char[] fiveLetter =  {
      'V', 'L', 'D'};

   private static final int[] divisor = {
      /* How many of this group is needed to form one of the
succeeding group. */
      /* 1 10 100 1000 */
      10, 10, 10, 1000000};

   /**
    * test harness
    */
   public static void main (String[] args)
   {
             try
             {
                System.out.print("Enter aa Integer :");
                System.out.println(new Roman().toWords(Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine())));
           }
           catch(Exception e)
           {
                System.out.println(e);
           }
   } // end main
} // end Roman

0
 
macjacintoAuthor Commented:
sorry but i edited the question. it should have been roman numerals to decimal. thanks!
0
 
poluruCommented:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class todecimal
{
     public static void main(String args[]) throws Exception
     {
               while(true)
               {
                    System.out.print("Enter Roman Value to convert to Decimal : ");
                    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                    System.out.println(getDecimal(br.readLine()));

               }
     }

     public static long getMultiplier(char c)
     {
          switch(c)
          {
               case 'I' :
                              return 1;
                              //break;

               case 'V' :
                              return 5;
                              //break;

               case 'X' :
                              return 10;
                              //break;

               case 'L' :
                              return 50;
                              //break;

               case 'C' :
                              return 100;
                              //break;

               case 'D' :
                              return 500;
                              //break;
               case 'M' :
                              return 1000;
                              //break;
          };
          return -999;
     }

     public static long getDecimal(String str)
     {
          char ch[]=str.toCharArray();
          int len=ch.length;
          long sum=0l;
          long temp=0;
          boolean first=true;
          for(int i=len-1;i>=0;i--)
          {
               if(i==0 && first )
               {
                    sum+=getMultiplier(ch[i]);
                    System.out.println(sum);
                    break;
               }
               else if(i==0 && !first)
               {
                    sum-=getMultiplier(ch[i]);
                    System.out.println(sum);
                    break;
               }
               if(first && getMultiplier(ch[i])<=getMultiplier(ch[i-1]))
               {
                    sum+=getMultiplier(ch[i]);
               }
               else if(first && getMultiplier(ch[i])>getMultiplier(ch[i-1]))
               {
                         sum+=getMultiplier(ch[i]);
                         temp=getMultiplier(ch[i]);
                         first=false;

               }
               else if(!first && temp>getMultiplier(ch[i]))
               {
                    sum-=getMultiplier(ch[i]);
               }
               else
               {
                    sum+=getMultiplier(ch[i]);
                    temp=0;
                    first=true;
               }
          }
          return sum;
     }

     
}
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
macjacintoAuthor Commented:
im not yet able to to compile the code bec. my pc is having a little problem...does it accept invalid inputs like space, empty strings, digits and other characters other than the 7 mentioned above?? and and also what is the maximum number of roman numeral to be inputted?? thanks again in advance.
0
 
macjacintoAuthor Commented:
anyone??
0
 
macjacintoAuthor Commented:
anyone??
0
 
poluruCommented:
No I Haven't checked all those things. U can just Validate them b4 passing it to the method.
0
 
macjacintoAuthor Commented:
anyone??
0
 
macjacintoAuthor Commented:
what's the function to check the number of characters in a string like the function len in vb? what should be added to the code so that it asks the user if he wants to exit, and exits if he presses y (yes).


i already compiled and run the code, it shows the answer twice, what should be done there??


pls reply ASAP! i really need this badly as soon as possible! thanks!
0
 
poluruCommented:
0
 
poluruCommented:
0
 
poluruCommented:
0
 
poluruCommented:
0
 
macjacintoAuthor Commented:
what do u mean no text??

anyone else who has an idea about this??

please, please, please!
0
 
poluruCommented:
0
 
poluruCommented:
iam not able to add my solution...every time i add my comment its showing no text and giving Error-2....
u can delete this qstn and add a new qstn so that i can add my comment....
0
 
macjacintoAuthor Commented:
what do u mean no text??

anyone else who has an idea about this??

please, please, please!
0
 
macjacintoAuthor Commented:
poloru suggested that i delete and repost it bec. he's having problems adding comments to it.
0
 
MoondancerCommented:
Rather than delete this, to maintain the information already provided, I have refunded your points so you can post new, and will move this to the PAQ to maintain an audit trail.

Thank you,
Moondancer
Community Support Moderator @ Experts Exchange
0
 
MoondancerCommented:
Incidentally, for the "no text" problem, this question may be helpful as an interim solution, it posts some workarounds, until Engineering can resolve this intermittent problem:

http://www.experts-exchange.com/jsp/qManageQuestion.jsp?ta=commspt&qid=20157348

Moondancer
Community Support Moderator @ Experts Exchange
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

  • 9
  • 9
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now