IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez .NET Discussion :

[VB.Net/C#] Convertir un chiffre arabe en chiffre romain


Sujet :

Contribuez .NET

  1. #1
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
       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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
     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

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Pour 47 avec ton code j'obtiens IIIL alors que c'est censé s'écrire XLVII non ?

  3. #3
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    ah ?...


    euh....

    désolé, alors


    Je remballe , je reteste, je corrige et je reviens en semaine 2

  4. #4
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Sinon t'as une librairie déjà toute faite: http://www.codeproject.com/KB/cs/numberconvert.aspx

  5. #5
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    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 )

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else if arabicNumber >= 39 then
                        result = ArabicToRomanHelper(arabicNumber - 50, "L")
    D'ailleurs j'ai pas compris pourquoi c'était 39 et pas 50 ...

  7. #7
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    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...

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    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

  9. #9
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    c'est bien loin
    hé, a qui tu le dis

  10. #10
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    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# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    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

  11. #11
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut

    En même temps les chiffres romains perdent leur intérêt dès que l'on passe les 50

Discussions similaires

  1. [JavaScript] Conversion de chiffres arabes en chiffres romains et inversement
    Par danielhagnoul dans le forum Contribuez
    Réponses: 1
    Dernier message: 05/11/2012, 08h48
  2. Réponses: 3
    Dernier message: 08/10/2012, 15h23
  3. Chiffres arabes en chiffres romains
    Par khayyam90 dans le forum Contribuez
    Réponses: 0
    Dernier message: 09/02/2011, 23h26
  4. convertir de l'arabe en unicode?
    Par l'indien dans le forum Langage
    Réponses: 5
    Dernier message: 18/03/2006, 14h37
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 04h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo