# Some more Refactoring

The code currently looks like this:

Public Function i2r(i As Integer) As String

Application.Volatile

i2r = ""

If i >= 50 Then

i2r = i2r + "L"

i = i - 50

End If

If i >= 40 Then

i2r = i2r + "XL"

i = i - 40

End If

While i >= 10

i2r = i2r + "X"

i = i - 10

Wend

If i = 9 Then

i2r = i2r + "IX"

i = i - 9

End If

If i >= 5 Then

i2r = i2r + "V"

i = i - 5

End If

If i = 4 Then

i2r = i2r + "IV"

i = i - 4

End If

While i >= 1

i2r = i2r + "I"

i = i - 1

Wend

End Function

I figure that I want to create a function where I feed in each *roman numeral* and if the current value of *i* > *the decimal equivalent* of the *roman numeral* then concatenate the *roman numeral* on the end of *i2r* and subtract the *decimal equivalent* from *i*.

The only thing that is stopping me is the mixture of whiles and if’s in the pattern above. The I’s and X’s are whiles, but the rest are if’s. Hmmm, I think. After a bit of contemplation I’m pretty sure that each of the if’s can simply be replaced with a while.

But, how can I be sure? The easiest way to be sure is to try it and see. I have the tests to save me if I make a mistake and I have undo to roll back if I need to. But, to be on the safe side I decide to try this from the bottom up. That is, I start with the I’s.

This is what I come up with, for the I’s (I couldn’t think of a good function name, so m it is):

…

i2r = i2r + m(i, "I", 1)

'While i >= 1

' i2r = i2r + "I"

' i = i - 1

'Wend

End Function

Public Function m(ByRef i As Integer, ByVal RomanCharacter As String, ByVal IntegerValue As Integer) As String

While i >= IntegerValue

m = m + RomanCharacter

i = i - IntegerValue

Wend

End Function

And it works.

So I try it on the 4 IF, replacing the if i = 4 with i2r = i2r + m(i, "IV", 4)

And it works.

So I try it on the 5. It works too.

So, I do all of the individual roman numerals. Recalculating the tests after each small change.

I end up with this.