Oct 8th, 2001, 02:08 AM
#1
Thread Starter
Fanatic Member
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 :/
Oct 8th, 2001, 04:48 AM
#2
The file attached should help you with what your after.
Attached Files
Oct 8th, 2001, 05:57 AM
#3
Conquistador
Here is some code i wrote (translated)
VB Code:
Private Sub Form_Load()
MsgBox RomanToDecimal("CCCLXIX")
End Sub
Function RomanToDecimal(Roman As String) As String
Dim conv(7) As Variant
Dim arabic As Integer, state As Integer, length As Integer, i As Integer, sidx As Integer
conv(0) = "I,1"
conv(1) = "V,5"
conv(2) = "X,10"
conv(3) = "L,50"
conv(4) = "C,100"
conv(5) = "D,500"
conv(6) = "M,1000"
conv(7) = "0,0"
length = Len(Roman)
state = 0
Do While length >= 0
i = 0
sidx = length
romnumber = CInt(Mid(conv(i), InStr(1, conv(i), ",") + 1, Len(conv(i)) - InStr(1, conv(i), ",")))
Do While romnumber > 0
comp1 = (Right(Left(Roman, sidx), 1))
comp2 = Left(conv(i), 1)
If (LCase(comp1)) = CStr(LCase(comp2)) Then
If state > romnumber Then
arabic = arabic - romnumber
Else
arabic = arabic + romnumber
state = romnumber
End If
End If
i = i + 1
If i = 8 Then GoTo ending:
romnumber = CInt(Mid(conv(i), InStr(1, conv(i), ",") + 1, Len(conv(i)) - InStr(1, conv(i), ",")))
Loop
length = length - 1
Loop
ending:
RomanToDecimal = arabic
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 .
Oct 8th, 2001, 06:03 AM
#4
Retired VBF Adm1nistrator
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]
Oct 8th, 2001, 06:11 AM
#5
Conquistador
Lol at least I converted it to VB
j/k
Oct 8th, 2001, 06:13 AM
#6
Retired VBF Adm1nistrator
Not just that but at least yours converted the right way around
Microsoft MVP : Visual Developer - Visual Basic [2004-2005]
Oct 8th, 2001, 06:15 AM
#7
Conquistador
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 .
Oct 8th, 2001, 08:11 AM
#8
Oct 8th, 2001, 08:13 AM
#9
Retired VBF Adm1nistrator
Microsoft MVP : Visual Developer - Visual Basic [2004-2005]
Oct 8th, 2001, 08:25 AM
#10
PowerPoster
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
Oct 8th, 2001, 08:28 AM
#11
Retired VBF Adm1nistrator
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]
Oct 8th, 2001, 09:32 AM
#12
Addicted Member
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
Oct 9th, 2001, 04:49 AM
#13
Conquistador
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
Oct 9th, 2001, 05:14 AM
#14
Retired VBF Adm1nistrator
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]
Oct 9th, 2001, 05:33 AM
#15
Conquistador
AHHH...
I didn't know to scroll across...
That brings new light to your site
Oct 9th, 2001, 05:35 AM
#16
Retired VBF Adm1nistrator
duh
Microsoft MVP : Visual Developer - Visual Basic [2004-2005]
Oct 9th, 2001, 05:51 AM
#17
Conquistador
Posting Permissions
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
Forum Rules
Click Here to Expand Forum to Full Width