Code : Tout sélectionner
Procedure.w nr_valeurChiffreRomain(l.s)
l=UCase(l)
Select l
Case "I"
ProcedureReturn 1
Case "V"
ProcedureReturn 5
Case "X"
ProcedureReturn 10
Case "L"
ProcedureReturn 50
Case "C"
ProcedureReturn 100
Case "D"
ProcedureReturn 500
Case "M"
ProcedureReturn 1000
Default
ProcedureReturn 0
EndSelect
EndProcedure
Procedure.w nr_valeurNombreRomain(nr.s)
If nr = ""
ProcedureReturn 0
Else
res.w = 0
If Len(nr) = 1
ProcedureReturn nr_valeurChiffreRomain(nr)
Else
res = nr_valeurChiffreRomain(Left(nr, 1))
If res < nr_valeurChiffreRomain(Mid(nr, 2, 1))
res = -res
EndIf
ProcedureReturn res + nr_valeurNombreRomain(Right(nr,Len(nr)-1))
EndIf
EndIf
EndProcedure
Procedure.s nr_toNombreRomain(n.w)
res.s = ""
tmp.w = n
While tmp >= 1000
res + "M"
tmp - 1000
Wend
If tmp >= 900
res + "CM"
tmp - 900
EndIf
If tmp >= 800
res + "DCCC"
tmp - 800
EndIf
If tmp >= 700
res + "DCC"
tmp - 700
EndIf
If tmp >= 600
res + "DC"
tmp - 600
EndIf
If tmp >= 500
res + "D"
tmp - 500
EndIf
If tmp >= 400
res + "CD"
tmp - 400
EndIf
If tmp >= 300
res + "CCC"
tmp - 300
EndIf
If tmp >= 200
res + "CC"
tmp - 200
EndIf
If tmp >= 100
res + "C"
tmp - 100
EndIf
If tmp >= 90
res + "XC"
tmp - 90
EndIf
If tmp >= 80
res + "LXXX"
tmp - 80
EndIf
If tmp >= 70
res + "LXX"
tmp - 70
EndIf
If tmp >= 60
res + "LX"
tmp - 60
EndIf
If tmp >= 50
res + "L"
tmp - 50
EndIf
If tmp >= 40
res + "XL"
tmp - 40
EndIf
If tmp >= 30
res + "XXX"
tmp - 30
EndIf
If tmp >= 20
res + "XX"
tmp - 20
EndIf
If tmp >= 10
res + "X"
tmp - 10
EndIf
If tmp = 9
res + "IX"
ElseIf tmp = 8
res + "VIII"
ElseIf tmp = 7
res + "VII"
ElseIf tmp = 6
res + "VI"
ElseIf tmp = 5
res + "V"
ElseIf tmp = 4
res + "IV"
ElseIf tmp = 3
res + "III"
ElseIf tmp = 2
res + "II"
ElseIf tmp = 1
res + "I"
EndIf
ProcedureReturn res
EndProcedure
For i.w=1 To 4000
nr.s = nr_toNombreRomain(i)
Debug Str(i) + " -> " + nr + " -> " + Str(nr_valeurNombreRomain(nr))
Next i
Bonne soirée !