Précédent   Forum des professionnels en informatique > Dotnet > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, faq, sources pour .NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 07/11/2008, 17h00   #1
Rédacteur
 
Avatar de Philippe Vialatte
 
Date d'inscription: juillet 2004
Localisation: Le cannet
Âge: 31
Messages: 2 264
Par défaut [VB.Net/C#] Convertir un chiffre arabe en chiffre romain

Bonjour a tous,

bon, comme je me suis arrache deux-trois cheveux pour faire une conversion qui marche bien...

Code :
   private string ArabicToRoman(int arabicNumber, bool isUpperCase) {

            string result = string.Empty;

            if (arabicNumber == 0) return result;

            try {
                if (arabicNumber >= 889) {
                    result = ArabicToRomanHelper(arabicNumber - 1000, "M");
                } else if (arabicNumber >= 389) {
                    result = ArabicToRomanHelper(arabicNumber - 500, "D");
                } else if (arabicNumber >= 89) {
                    result = ArabicToRomanHelper(arabicNumber - 100, "C");
                } else if (arabicNumber >= 39) {
                    result = ArabicToRomanHelper(arabicNumber - 50, "L");
                } else if (arabicNumber >= 9) {
                    result = ArabicToRomanHelper(arabicNumber - 10, "X");
                } else if (arabicNumber >= 4) {
                    result = ArabicToRomanHelper(arabicNumber - 5, "V");
                } else if (arabicNumber >= 1) {
                    result = ArabicToRomanHelper(arabicNumber - 1, "I");
                } else if (arabicNumber <= -889) {
                    result = ArabicToRomanHelper(arabicNumber + 1000, "M");
                } else if (arabicNumber <= -389) {
                    result = ArabicToRomanHelper(arabicNumber + 500, "D");
                } else if (arabicNumber <= -89) {
                    result = ArabicToRomanHelper(arabicNumber + 100, "C");
                } else if (arabicNumber <= -39) {
                    result = ArabicToRomanHelper(arabicNumber + 50, "L");
                } else if (arabicNumber <= -9) {
                    result = ArabicToRomanHelper(arabicNumber + 10, "X");
                } else if (arabicNumber <= -4) {
                    result = ArabicToRomanHelper(arabicNumber + 5, "V");
                } else if (arabicNumber <= -1) {
                    result = ArabicToRomanHelper(arabicNumber + 1, "I");
                }
            } catch (Exception e) {
                result = "Error : " + e.Message;
            }

            return isUpperCase ? result.ToUpper() : result.ToLower();
        }

        private string ArabicToRomanHelper(int arabicNumber, string letter) {


            if (arabicNumber < 0) {
                return ArabicToRoman(arabicNumber, true) + letter;
            }

            return letter + ArabicToRoman(arabicNumber, true);
        }

et la meme en VB (tant qu'a faire...)

Code :
 Function ArabicToRoman(ByVal arabicNumber AS Integer, Optional ByVal isUpperCase As boolean = true) as string

            Dim result as string = string.Empty

            if arabicNumber = 0 Then return result

            try 
                if arabicNumber >= 889 then
                    result = ArabicToRomanHelper(arabicNumber - 1000, "M")
                 else if arabicNumber >= 389 then
                    result = ArabicToRomanHelper(arabicNumber - 500, "D")
                 else if arabicNumber >= 89 then
                    result = ArabicToRomanHelper(arabicNumber - 100, "C")
                 else if arabicNumber >= 39 then
                    result = ArabicToRomanHelper(arabicNumber - 50, "L")
                 else if arabicNumber >= 9 then
                    result = ArabicToRomanHelper(arabicNumber - 10, "X")
                 else if arabicNumber >= 4 then
                    result = ArabicToRomanHelper(arabicNumber - 5, "V")
                 else if arabicNumber >= 1 then
                    result = ArabicToRomanHelper(arabicNumber - 1, "I")
                 else if arabicNumber <= -889 then
                    result = ArabicToRomanHelper(arabicNumber + 1000, "M")
                 else if arabicNumber <= -389 then
                    result = ArabicToRomanHelper(arabicNumber + 500, "D")
                 else if arabicNumber <= -89 then
                    result = ArabicToRomanHelper(arabicNumber + 100, "C")
                 else if arabicNumber <= -39 then
                    result = ArabicToRomanHelper(arabicNumber + 50, "L")
                 else if arabicNumber <= -9 then
                    result = ArabicToRomanHelper(arabicNumber + 10, "X")
                 else if arabicNumber <= -4 then
                    result = ArabicToRomanHelper(arabicNumber + 5, "V")
                 else if arabicNumber <= -1 then
                    result = ArabicToRomanHelper(arabicNumber + 1, "I")
                end if
             catch e as Exception
                result = "Error : " & e.Message
             end try
			
  			if isUpperCase  then
              return result.ToUpper()
			else
				return result.ToLower()
			end if
			
        end function

        Function ArabicToRomanHelper(ByVal arabicNumber as Integer, Byval letter as String)  as string


            if arabicNumber < 0 then
                return ArabicToRoman(arabicNumber, true) + letter
            else
            	return letter + ArabicToRoman(arabicNumber, true)
			end if
        end function
En esperant que ca serve a qqun
__________________
Sauf erreur, je ne me trompe jamais.

Mon Blog

Injection de dépendances en .NET...ou comment résoudre vos problèmes de couples..euh, de couplage...


The Cake is a lie !!!

Dernière modification par Skalp ; 18/09/2009 à 07h38.
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 01h40   #2
Rédacteur/Modérateur
 
Avatar de smyley
 
Date d'inscription: juin 2003
Localisation: Loin
Messages: 6 370
Envoyer un message via MSN à smyley
Par défaut

Pour 47 avec ton code j'obtiens IIIL alors que c'est censé s'écrire XLVII non ?
__________________
De la vallée du vent ...
Distribution d'applications .NET avec DreamShield
DreamShield, Le site, forum, blog, wiki & Jeux
Mon blog, les blogs DotNet
je ne répondrais aux questions techniques ni par MP ni par email ni par MSN ... le forum est là pour ça
smyley est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 11h13   #3
Rédacteur
 
Avatar de Philippe Vialatte
 
Date d'inscription: juillet 2004
Localisation: Le cannet
Âge: 31
Messages: 2 264
Par défaut

ah ?...


euh....

désolé, alors


Je remballe , je reteste, je corrige et je reviens en semaine 2
__________________
Sauf erreur, je ne me trompe jamais.

Mon Blog

Injection de dépendances en .NET...ou comment résoudre vos problèmes de couples..euh, de couplage...


The Cake is a lie !!!
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 11h28   #4
Rédacteur/Modérateur

 
Avatar de The_badger_man
 
Date d'inscription: janvier 2005
Localisation: Yvelines
Âge: 26
Messages: 2 169
Par défaut

Sinon t'as une librairie déjà toute faite: http://www.codeproject.com/KB/cs/numberconvert.aspx
__________________
Les règles du forum
Le trio magique : FAQ + Cours + fonction rechercher
Mes articles
Pas de questions par messages privés svp

Software is never finished, only abandoned.
The_badger_man est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 20h02   #5
Rédacteur
 
Avatar de Philippe Vialatte
 
Date d'inscription: juillet 2004
Localisation: Le cannet
Âge: 31
Messages: 2 264
Par défaut

Citation:
Envoyé par The_badger_man Voir le message
Sinon t'as une librairie déjà toute faite: http://www.codeproject.com/KB/cs/numberconvert.aspx
Pinaise..

si seulement j'avais trouve ca vendredi matin


Merci bcp (n'as plus qu'a scratcher le bout de code que j'avais fait...quoique..Ca marche bien jusqu'a 39 )
__________________
Sauf erreur, je ne me trompe jamais.

Mon Blog

Injection de dépendances en .NET...ou comment résoudre vos problèmes de couples..euh, de couplage...


The Cake is a lie !!!
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 21h06   #6
Rédacteur/Modérateur
 
Avatar de smyley
 
Date d'inscription: juin 2003
Localisation: Loin
Messages: 6 370
Envoyer un message via MSN à smyley
Par défaut

Citation:
Envoyé par pvialatte Voir le message
Merci bcp (n'as plus qu'a scratcher le bout de code que j'avais fait...quoique..Ca marche bien jusqu'a 39 )
Code :
else if arabicNumber >= 39 then
                    result = ArabicToRomanHelper(arabicNumber - 50, "L")
D'ailleurs j'ai pas compris pourquoi c'était 39 et pas 50 ...
__________________
De la vallée du vent ...
Distribution d'applications .NET avec DreamShield
DreamShield, Le site, forum, blog, wiki & Jeux
Mon blog, les blogs DotNet
je ne répondrais aux questions techniques ni par MP ni par email ni par MSN ... le forum est là pour ça
smyley est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 22h15   #7
Rédacteur
 
Avatar de Philippe Vialatte
 
Date d'inscription: juillet 2004
Localisation: Le cannet
Âge: 31
Messages: 2 264
Par défaut

parce que 40 s'ecrit XL...et j'etais persuade (encore jusqu'a 5 minutes) que 39 -> XIL...

donc, 40 doit d'abord retourner L, puis X en negatif...
__________________
Sauf erreur, je ne me trompe jamais.

Mon Blog

Injection de dépendances en .NET...ou comment résoudre vos problèmes de couples..euh, de couplage...


The Cake is a lie !!!
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 22h37   #8
Rédacteur/Modérateur
 
Avatar de smyley
 
Date d'inscription: juin 2003
Localisation: Loin
Messages: 6 370
Envoyer un message via MSN à smyley
Par défaut

Citation:
Envoyé par pvialatte Voir le message
parce que 40 s'ecrit XL...et j'etais persuade (encore jusqu'a 5 minutes) que 39 -> XIL...

donc, 40 doit d'abord retourner L, puis X en negatif...
Ah ouais c'est vrai, l'histoire des soustractions ...
Ouai bon bref les chiffres romains c'était en primaire, et c'est bien loin
__________________
De la vallée du vent ...
Distribution d'applications .NET avec DreamShield
DreamShield, Le site, forum, blog, wiki & Jeux
Mon blog, les blogs DotNet
je ne répondrais aux questions techniques ni par MP ni par email ni par MSN ... le forum est là pour ça
smyley est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/11/2008, 23h08   #9
Rédacteur
 
Avatar de Philippe Vialatte
 
Date d'inscription: juillet 2004
Localisation: Le cannet
Âge: 31
Messages: 2 264
Par défaut

Citation:
c'est bien loin
hé, a qui tu le dis
__________________
Sauf erreur, je ne me trompe jamais.

Mon Blog

Injection de dépendances en .NET...ou comment résoudre vos problèmes de couples..euh, de couplage...


The Cake is a lie !!!
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/11/2008, 11h12   #10
Rédacteur
 
Avatar de Philippe Vialatte
 
Date d'inscription: juillet 2004
Localisation: Le cannet
Âge: 31
Messages: 2 264
Par défaut

Allez, pour pas laisser tomber l'affaire

Apres correction, ca marche jusqu'a 4000 (au-dela, faut utiliser des caracteres speciaux...)

Code C# :
private static string ArabicToRoman(int number, bool isUpperCase) {
 
            string result = string.Empty;
 
            if (number == 0) return result;
 
            try {	
			
                if (number > 999) {
                    result = ArabicToRomanHelper(number - 1000, "M");
                } else if (number > 899) {
                    result = ArabicToRomanHelper(number - 900, "CM");
                } else if (number > 499) {
                    result = ArabicToRomanHelper(number - 500, "D");
                } else if (number > 399) {
                    result = ArabicToRomanHelper(number - 400, "CD");
                } else if (number > 99) {
                    result = ArabicToRomanHelper(number - 100, "C");
                } else if (number > 89) {
                    result = ArabicToRomanHelper(number - 90, "XC");
                } else if (number > 49) {
                    result = ArabicToRomanHelper(number - 50, "L");
                } else if (number > 39) {
                    result = ArabicToRomanHelper(number - 40, "XL");
                } else if (number >= 9) {
                    result = ArabicToRomanHelper(number - 10, "X");
                } else if (number >= 4) {
                    result = ArabicToRomanHelper(number - 5, "V");
                } else if (number >= 1) {
                    result = ArabicToRomanHelper(number - 1, "I");
                } else if (number <= -889) {
                    result = ArabicToRomanHelper(number + 1000, "M");
                } else if (number <= -389) {
                    result = ArabicToRomanHelper(number + 500, "D");
                } else if (number <= -89) {
                    result = ArabicToRomanHelper(number + 100, "C");
                } else if (number <= -39) {
                    result = ArabicToRomanHelper(number + 50, "L");
                } else if (number <= -9) {
                    result = ArabicToRomanHelper(number + 10, "X");
                } else if (number <= -4) {
                    result = ArabicToRomanHelper(number + 5, "V");
                } else if (number <= -1) {
                    result = ArabicToRomanHelper(number + 1, "I");
                }
            } catch (Exception e) {
                result = "Error : " + e.Message;
            }
 
            return isUpperCase ? result.ToUpper() : result.ToLower();
        }
 
        private static string ArabicToRomanHelper(int number, string letter) {
 
            if (number < 0) {
                return ArabicToRoman(number, true) + letter;
            }
 
            return letter + ArabicToRoman(number, true);
        }

Et la, ca marche
__________________
Sauf erreur, je ne me trompe jamais.

Mon Blog

Injection de dépendances en .NET...ou comment résoudre vos problèmes de couples..euh, de couplage...


The Cake is a lie !!!

Dernière modification par tomlev ; 10/11/2008 à 13h35. Motif: QUOTE -> CODE
Philippe Vialatte est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/11/2008, 23h51   #11
Rédacteur/Modérateur
 
Avatar de smyley
 
Date d'inscription: juin 2003
Localisation: Loin
Messages: 6 370
Envoyer un message via MSN à smyley
Par défaut


En même temps les chiffres romains perdent leur intérêt dès que l'on passe les 50
__________________
De la vallée du vent ...
Distribution d'applications .NET avec DreamShield
DreamShield, Le site, forum, blog, wiki & Jeux
Mon blog, les blogs DotNet
je ne répondrais aux questions techniques ni par MP ni par email ni par MSN ... le forum est là pour ça
smyley est déconnecté   Envoyer un message privé Réponse avec citation
NEWS MICROSOFT DOTNETFAQs .NETTUTORIELS .NETSOURCES .NETLIVRES .NETOUTILS .NETBLOG .NETDOTNET TV

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Dotnet > Contribuez



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 17h59.


Vos questions techniques : forum d'entraide Microsoft DotNET - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.