Results 1 to 17 of 17

Thread: Roman Numerals --> Integers

  1. #1

    Thread Starter
    Fanatic Member tim_l_012's Avatar
    Join Date
    Mar 2001
    Location
    Next to a Coffee Cup.
    Posts
    641

    Roman Numerals --> Integers

    HI, I need someone to give me code for this in VB, and in c++..

    I need a program the will convert a roman numeral into an integer...

    Thanks,

    ps: remember, vb and c++, cheers.
    /: Tim :\____________________
    \: VB, HTML, ASP, VBScript, QBASIC, JavaScript :/

  2. #2
    Matthew Gates
    Guest
    The file attached should help you with what your after.
    Attached Files Attached Files

  3. #3
    Conquistador
    Join Date
    Dec 1999
    Location
    Australia
    Posts
    4,527
    Here is some code i wrote (translated)

    VB Code:
    1. Private Sub Form_Load()
    2. MsgBox RomanToDecimal("CCCLXIX")
    3. End Sub
    4. Function RomanToDecimal(Roman As String) As String
    5. Dim conv(7) As Variant
    6. Dim arabic As Integer, state As Integer, length As Integer, i As Integer, sidx As Integer
    7. conv(0) = "I,1"
    8. conv(1) = "V,5"
    9. conv(2) = "X,10"
    10. conv(3) = "L,50"
    11. conv(4) = "C,100"
    12. conv(5) = "D,500"
    13. conv(6) = "M,1000"
    14. conv(7) = "0,0"
    15. length = Len(Roman)
    16. state = 0
    17. Do While length >= 0
    18.           i = 0
    19.             sidx = length
    20.             romnumber = CInt(Mid(conv(i), InStr(1, conv(i), ",") + 1, Len(conv(i)) - InStr(1, conv(i), ",")))
    21.             Do While romnumber > 0
    22.             comp1 = (Right(Left(Roman, sidx), 1))
    23.                 comp2 = Left(conv(i), 1)
    24.                 If (LCase(comp1)) = CStr(LCase(comp2)) Then
    25.                     If state > romnumber Then
    26.                         arabic = arabic - romnumber
    27.                     Else
    28.                         arabic = arabic + romnumber
    29.                         state = romnumber
    30.                     End If
    31.                     End If
    32.                         i = i + 1
    33.            
    34.             If i = 8 Then GoTo ending:
    35.                         romnumber = CInt(Mid(conv(i), InStr(1, conv(i), ",") + 1, Len(conv(i)) - InStr(1, conv(i), ",")))
    36.             Loop
    37.             length = length - 1
    38. Loop
    39. ending:
    40. RomanToDecimal = arabic
    41.            
    42.            
    43. End Function

    Also - I can't do this in C++
    Here was the base code, for anyone who doesn't understand mine:

    PHP Code:
        function toNumber($roman)
        {
            
    $conv = array(
                array(
    "letter" => 'I'"number" => 1),
                array(
    "letter" => 'V'"number" => 5),
                array(
    "letter" => 'X'"number" => 10),
                array(
    "letter" => 'L'"number" => 50),
                array(
    "letter" => 'C'"number" => 100),
                array(
    "letter" => 'D'"number" => 500),
                array(
    "letter" => 'M'"number" => 1000),
                array(
    "letter" => 0,   "number" => 0)
            );
            
    $arabic 0;
            
    $state  0;
            
    $sidx   0;
            
    $len    strlen($roman);
        
            while (
    $len >= 0) {
                
    $i 0;
                
    $sidx $len;
                
                while (
    $conv[$i]['number'] > 0) {
                    if (
    strtoupper($roman[$sidx]) == $conv[$i]['letter']) {
                        if (
    $state $conv[$i]['number']) {
                            
    $arabic -= $conv[$i]['number'];
                        } else {
                            
    $arabic += $conv[$i]['number'];
                            
    $state   $conv[$i]['number'];
                        }
                    }
                    
    $i++;
                }

                
    $len--;
            }
        
            return(
    $arabic);
        }

        
    // }}}
        // {{{ toRoman()
        
        /**
         * Converts a number to its roman numeral representation
         *
         * @param  integer $num   An integer between 0 and 3999 inclusive
         *                        that should be converted to a roman numeral
         *
         * @return string  $roman The corresponding roman numeral
         *
         * @access public
         * @author Sterling Hughes <[email protected]>
         * @since  PHP 4.0.5
         */
        
    function toRoman($num) {
            
    $conv = array(10 => array('X''C''M'),
                          
    5  => array('V''L''D'),
                          
    1  => array('I''X''C'));
            
    $roman '';
            
            
    $num = (int) $num;

            
    $digit  = (int) $num 1000;
            
    $num   -= $digit 1000;
            while (
    $digit 0) {
                
    $roman .= 'M';
                
    $digit--;
            }

            for (
    $i 2$i >= 0$i--) {
                
    $power pow(10$i);
                
    $digit = (int) $num $power;
                
    $num -= $digit $power;

                if ((
    $digit == 9) || ($digit == 4)) {
                    
    $roman .= $conv[1][$i] . $conv[$digit+1][$i];
                } else {
                    if (
    $digit >= 5) {
                        
    $roman .= $conv[5][$i];
                        
    $digit -= 5;
                    }

                    while (
    $digit 0) {
                        
    $roman .= $conv[1][$i];
                        
    $digit--;
                    }
            }

            if (
    $num 0) {
                return(
    '');
            }

            return(
    $roman);
        }
        
        
    // }}}

    Last edited by da_silvy; Oct 8th, 2001 at 06:04 AM.

  4. #4
    Retired VBF Adm1nistrator plenderj's Avatar
    Join Date
    Jan 2001
    Location
    Dublin, Ireland
    Posts
    10,359
    As we're all throwing in examples in different languages, heres the src to a converter I had to do in college last year :

    ... pity its the wrong way around though

    Code:
    public class convert
    {
    	public static void main (String[] args)
    	{		
    
    		int userInput;
    		System.out.print("Please enter a number to convert : ");
                    userInput = TextIO.getInt();
    		if ((userInput > 3999) || (userInput < 0))
    		{
    			System.out.println("Can only convert numbers between 0 and 3999");
    		}
    		if ((Integer.toString(userInput).length() > 0) && (Integer.toString(userInput).length() < 5))
    		{
    			System.out.println(converter(userInput));
    		}
    
    	}
    	
    	public static String converter(int int_number) {
    		String to_return = "";
    		if (Integer.toString(int_number).length() == 1)
    		{
    			to_return = onesToRomanNumerals(int_number);
    		}
    		else if (Integer.toString(int_number).length() == 2) 
    		{
    			to_return = tensToRomanNumerals(int_number);
    		}
    		else if (Integer.toString(int_number).length() == 3)
    		{	
    			to_return = hunsToRomanNumerals(int_number);
    		}
    		else if (Integer.toString(int_number).length() == 4)
    		{
    			to_return = thousandsToRomanNumerals(int_number);
    		}
    
    		return to_return;
    	}
    	
    	public static String thousandsToRomanNumerals(int int_number) {
    		String var_temp = Integer.toString(int_number);
    		String var_huns = var_temp.substring(var_temp.length() - 3);
    		String var_thou = var_temp.substring(var_temp.length() - 4, var_temp.length() - 3);
    		String to_return = "";
    
    		switch (Integer.parseInt(var_thou)) {
    			case 0:   to_return = hunsToRomanNumerals(Integer.parseInt(var_huns));
    				  break;
    			case 1:   to_return = "M" + hunsToRomanNumerals(Integer.parseInt(var_huns));
    				  break;
    			case 2:   to_return = "MM" + hunsToRomanNumerals(Integer.parseInt(var_huns));
    				  break;
    			case 3:   to_return = "MMM" + hunsToRomanNumerals(Integer.parseInt(var_huns));
    				  break;
    		}
    		return to_return;
    	}
    	public static String hunsToRomanNumerals(int int_number) {
    		String var_temp = Integer.toString(int_number);
    		String var_tens = "", var_huns = "";
    		if (Integer.toString(int_number).length() == 3)
    		{	
    			var_tens = var_temp.substring(var_temp.length() - 2);
    			var_huns = var_temp.substring(var_temp.length() - 3, var_temp.length() - 2);
    		}
    		else if (Integer.toString(int_number).length() == 2)
    		{	
    			var_tens = var_temp.substring(var_temp.length() - 2);
    			var_huns = "0";
    		}
    		else if (Integer.toString(int_number).length() == 1)
    		{	
    			var_tens = "0";
    			var_huns = "0";
    		}
    		String to_return = "";
    
    		switch (Integer.parseInt(var_huns)) {
    			case 0:   to_return = tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 1:   to_return = "C"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 2:   to_return = "CC"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 3:   to_return = "CCC"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 4:   to_return = "CD"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 5:   to_return = "D"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 6:   to_return = "DC"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 7:   to_return = "DCC"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 8:   to_return = "DCCC"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    			case 9:   to_return = "CM"  + tensToRomanNumerals(Integer.parseInt(var_tens));
    				  break;
    		}
    		return to_return;
    	}
    
    	public static String tensToRomanNumerals(int int_number) {
    		
    		String var_temp = Integer.toString(int_number);
    		String var_ones = "", var_tens = "";
    		if (Integer.toString(int_number).length() == 1)
    		{
    			var_ones = Integer.toString(int_number);
    			var_tens = "0";
    		}
    		else if (Integer.toString(int_number).length() == 2)
    		{
    			var_ones = var_temp.substring(var_temp.length() - 1);
    			var_tens = var_temp.substring(var_temp.length() - 2, var_temp.length() - 1);
    		}
    
    		String to_return = "";
    
    		switch (Integer.parseInt(var_tens)) {
    			case 0:   to_return = onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 1:   to_return = "X"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 2:   to_return = "XX"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 3:   to_return = "XXX"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 4:   to_return = "XL"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 5:   to_return = "L"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 6:   to_return = "LX"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 7:   to_return = "LXX"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 8:   to_return = "LXXX"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    			case 9:   to_return = "XC"  + onesToRomanNumerals(Integer.parseInt(var_ones));
    				  break;
    		}
    		
    		
    		return to_return;
    
    	}
    
    	public static String onesToRomanNumerals(int int_number) {
    		String var_ones = Integer.toString(int_number);
    		var_ones = var_ones.substring(var_ones.length() - 1 );
    		String to_return = "";
    
    		switch (Integer.parseInt(var_ones)) {
    			case 0: to_return = "";
    				break;
    			case 1: to_return = "I";
    				break;
    			case 2: to_return = "II";
    				break;
    			case 3: to_return = "III";
    				break;
    			case 4: to_return = "IV";
    				break;
    			case 5: to_return = "V";
    				break;
    			case 6: to_return = "VI";
    				break;
    			case 7: to_return = "VII";
    				break;
    			case 8: to_return = "VIII";
    				break;
    			case 9: to_return = "IX";
    				break;
    		}
    
    		return to_return;
    	}
    
    
    }
    Microsoft MVP : Visual Developer - Visual Basic [2004-2005]

  5. #5
    Conquistador
    Join Date
    Dec 1999
    Location
    Australia
    Posts
    4,527
    Lol at least I converted it to VB

    j/k

  6. #6
    Retired VBF Adm1nistrator plenderj's Avatar
    Join Date
    Jan 2001
    Location
    Dublin, Ireland
    Posts
    10,359
    Not just that but at least yours converted the right way around
    Microsoft MVP : Visual Developer - Visual Basic [2004-2005]

  7. #7
    Conquistador
    Join Date
    Dec 1999
    Location
    Australia
    Posts
    4,527


    thanks man

    i just hope someone else (Parksie maybe? ) can convert my example into C++
    Last edited by da_silvy; Oct 8th, 2001 at 07:22 AM.

  8. #8
    PowerPoster beachbum's Avatar
    Join Date
    Jul 2001
    Location
    Wollongong, NSW, Australia
    Posts
    2,274
    How do you handle the bar above M etc?
    Stuart Laidlaw
    Brightspark Financial Software
    http://www.gstsmartbook.com

  9. #9
    Retired VBF Adm1nistrator plenderj's Avatar
    Join Date
    Jan 2001
    Location
    Dublin, Ireland
    Posts
    10,359
    The bar above M ?
    What ?
    Microsoft MVP : Visual Developer - Visual Basic [2004-2005]

  10. #10
    PowerPoster beachbum's Avatar
    Join Date
    Jul 2001
    Location
    Wollongong, NSW, Australia
    Posts
    2,274
    A bar on top multiplies by one thousand. eg M with bar on top is 1 million. I am not sure of all letters that allow bar on top.
    Regards
    Stuart
    Stuart Laidlaw
    Brightspark Financial Software
    http://www.gstsmartbook.com

  11. #11
    Retired VBF Adm1nistrator plenderj's Avatar
    Join Date
    Jan 2001
    Location
    Dublin, Ireland
    Posts
    10,359
    Eh I only thought the bar was a graphical thing.
    Like you can draw I, II, III, IV, VI, VII, VIII and what not with a bar across the top to make it look nice
    Microsoft MVP : Visual Developer - Visual Basic [2004-2005]

  12. #12
    Addicted Member c@lle's Avatar
    Join Date
    Oct 1999
    Location
    Belgium
    Posts
    179
    a very easy way is to use the function from excel

    create a document with in cell b1 the function '=roman(a1)'
    save this doc in 'c:\temp' with the name 'roman.xls'

    then use this code

    Code:
     Dim objExcel As Excel.Application
     Dim objWorksheet As Excel.Worksheet
     
     Set objExcel = New Application
     objExcel.Visible = False
     objExcel.Workbooks.Open "c:\temp\roman.xls"
     
     Set objWorksheet = objExcel.ActiveSheet
     
     objWorksheet.Range("a1").Value = Text1.Text
     
     Text2.Text = objWorksheet.Range("b1").Value
     
     objExcel.Workbooks(1).Close (False)
     Set objWorksheet = Nothing
     objExcel.Quit
     Set objExcel = Nothing

  13. #13
    Conquistador
    Join Date
    Dec 1999
    Location
    Australia
    Posts
    4,527
    Yes, yes.

    plenderj, we have made more posts on this thread than the owner

    I went to your website, yes it is short, but i like the picture


  14. #14
    Retired VBF Adm1nistrator plenderj's Avatar
    Join Date
    Jan 2001
    Location
    Dublin, Ireland
    Posts
    10,359
    Its short, but its fat !
    You scroll across you see. I though there was lots of interesting info there.
    Microsoft MVP : Visual Developer - Visual Basic [2004-2005]

  15. #15
    Conquistador
    Join Date
    Dec 1999
    Location
    Australia
    Posts
    4,527
    AHHH...

    I didn't know to scroll across...

    That brings new light to your site

  16. #16
    Retired VBF Adm1nistrator plenderj's Avatar
    Join Date
    Jan 2001
    Location
    Dublin, Ireland
    Posts
    10,359
    duh
    Microsoft MVP : Visual Developer - Visual Basic [2004-2005]

  17. #17
    Conquistador
    Join Date
    Dec 1999
    Location
    Australia
    Posts
    4,527

Posting Permissions

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



Click Here to Expand Forum to Full Width