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

C# Discussion :

Incrémenter string c#


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 99
    Par défaut Incrémenter string c#
    Bonjour,

    Je ne vois pas comment faire un algo pour pouvoir faire un compteur type kilométrique avec de l'ascii ???

    ex :
    00000
    00001
    00002
    ...
    00010
    00011
    00012
    ...
    98342
    98343

    Et ainsi de suite.

    Quelqu'un aurait une idée comment faire ?

    Cdt,

    Ju

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Pour ma part, je transformerais ma string en int avec un int.Parse,
    un increment du int , puis un toString formaté de cet int


    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     int a = 0;
                string cpt  = a.ToString("000000");
     
                int b = int.Parse(cpt);
                b++;
                cpt = b.ToString("000000");
    cordialement

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Tu utilises une variable "int" et tu fais ToString().LPad('0', 8)...quelque chose dans le genre (je n'ai pas vérifier l'exactitude de mon bout de code )

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 99
    Par défaut
    Jusque là pour le int je suis d'accord mais je souhaiterais passer aussi des lettres.

    Par exemple :

    aaa + 1 = aab ...etc
    slc + 2 = sle ...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    bonjour

    voici une classe qui converti un string en base (2 to 36)

    donc meme chose qu'avant , sauf que tu convertit ton string de 36 a 10, puis le int.parse, increment du int puis int en string en conversion du 10 en 36

    cordialement

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     /// <summary>
            /// Class BaseConverter to pass from a data representation to another from base 2 to 36
            /// </summary>
            public class BaseConverter
            {
     
                /// <summary>
                /// Function Convert to Convert number in string representation from base:from to base:to
                /// </summary>
                /// <param name="from">source base of the number to convert (2 to 36)</param>
                /// <param name="to">Destination base for the number to convert (2 to 36)</param>
                /// <param name="s">Number to convert in a string format</param>
                /// <returns>A string of the converted number in base "to"</returns>
                public static String Convert(int from, int to, String s)
                {
                    //Return error if input is empty
                    if (String.IsNullOrEmpty(s))
                    {
                        return ("Error: Nothing in Input String");
                    }
                    //only allow uppercase input characters in string
                    s = s.ToUpper();
     
                    //only do base 2 to base 36 (digit represented by charecaters 0-Z)"
                    if (from < 2 || from > 36 || to < 2 || to > 36) { return ("Base requested outside range"); }
     
                    //convert string to an array of integer digits representing number in base:from
                    int il = s.Length;
                    int[] fs = new int[il];
                    int k = 0;
                    for (int i = s.Length - 1; i >= 0; i--)
                    {
                        if (s[i] >= '0' && s[i] <= '9') { fs[k++] = (int)(s[i] - '0'); }
                        else
                        {
                            if (s[i] >= 'A' && s[i] <= 'Z') { fs[k++] = 10 + (int)(s[i] - 'A'); }
                            else
                            { return ("Error: Input string must only contain any of 0-9 or A-Z"); } //only allow 0-9 A-Z characters
                        }
                    }
     
                    //check the input for digits that exceed the allowable for base:from
                    foreach (int i in fs)
                    {
                        if (i >= from) { return ("Error: Not a valid number for this input base"); }
                    }
     
                    //find how many digits the output needs
                    int ol = il * (from / to + 1);
                    int[] ts = new int[ol + 10]; //assign accumulation array
                    int[] cums = new int[ol + 10]; //assign the result array
                    ts[0] = 1; //initialise array with number 1 
     
                    //evaluate the output
                    for (int i = 0; i < il; i++) //for each input digit
                    {
                        for (int j = 0; j < ol; j++) //add the input digit times (base:to from^i) to the output cumulator
                        {
                            cums[j] += ts[j] * fs[i];
                            int temp = cums[j];
                            int rem = 0;
                            int ip = j;
                            do // fix up any remainders in base:to
                            {
                                rem = temp / to;
                                cums[ip] = temp - rem * to; ip++;
                                cums[ip] += rem;
                                temp = cums[ip];
                            }
                            while (temp >= to);
                        }
     
                        //calculate the next power from^i) in base:to format
                        for (int j = 0; j < ol; j++)
                        {
                            ts[j] = ts[j] * from;
                        }
                        for (int j = 0; j < ol; j++) //check for any remainders
                        {
                            int temp = ts[j];
                            int rem = 0;
                            int ip = j;
                            do  //fix up any remainders
                            {
                                rem = temp / to;
                                ts[ip] = temp - rem * to; ip++;
                                ts[ip] += rem;
                                temp = ts[ip];
                            }
                            while (temp >= to);
                        }
                    }
     
                    //convert the output to string format (digits 0,to-1 converted to 0-Z characters) 
                    String sout = String.Empty; //initialise output string
                    bool first = false; //leading zero flag
                    for (int i = ol; i >= 0; i--)
                    {
                        if (cums[i] != 0) { first = true; }
                        if (!first) { continue; }
                        if (cums[i] < 10) { sout += (char)(cums[i] + '0'); }
                        else { sout += (char)(cums[i] + 'A' - 10); }
                    }
                    if (String.IsNullOrEmpty(sout)) { return "0"; } //input was zero, return 0
                    //return the converted string          
                    return sout;
                }
            }

  6. #6
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Comme c'est compliqué ...

    Voici ma méthode

    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
     
    static void Main()
    {
        int test = 20;
        string str_test = IntToString("0123456789abcdef", test); // ici le résultat est "14", c'est de l'hexa
    }
     
    private static string IntToString(string strSymboles, int test)
    {
        if (strSymboles == null || strSymboles.Length == 0) return string.Empty;
        char[] symboles = strSymboles.ToCharArray();
        int rest = test;
        string result = string.Empty;
        while (rest > 0)
        {
            int index = rest % symboles.Length;
            result = symboles[index] + result;
            rest = rest / symboles.Length;
        }
        return result;
    }
    Il suffit simplement de respecter la décompositions des nombres.

    Avec cette méthode tu peux incrémenter n'importe quoi dès l'instant où tu définit toi même l'alphabet.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int test = 20;
    string str_test = IntToString("a5dà4é)[%;,c", test); // = "5%"
    Pourquoi ?
    L'alphabet utilisé fait 12 caractères, donc on est en base 12.
    La position des caractères utilisé (exprimé en indexe 0) est :
    '5' = position 1
    '%' = position 8
    Résultat :
    '5' * 12 + '%' * 1 = 1 * 12 + 8 = 20

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 99
    Par défaut
    oula ... je vois a quoi sert ton bout de code @ctxnop mais on va dire que ce n'est pas ça que je cherche a faire ...

    imaginons que je rentre une longueur de chaine ex : 3
    je souhaite faire défilé par exemple les 3 caractères 'a', 'b', 'c'
    donc je voudrais que ma méthode m'affiche :
    aaa
    aab
    aac
    aba
    abb
    abc
    aca
    acb
    acc
    baa
    bab
    bac
    bba
    bbb
    bbc
    bca
    bcb
    bcc
    ... et ainsi de suite jusqu'à ccc ... afin d'obtenir toutes les combinaisons possibles des lettres ....

  8. #8
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Et qu'est-ce qui t'empêche de le faire avec mon bout de code ?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int i = 0;
    string Result = string.Empty
    while((Result = IntToString("abc", i++)) != "ccc")
        Console.WriteLine(Result.PadLeft(3, 'a'));

    Je trouve au contraire avoir complètement répondu à ta question d'origine.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 99
    Par défaut
    pourrais tu m'expliquer ton bout de code (niveau des arguments ...)

    car en réalité je souhaiterais faire tourner une partie du code ascii ....

    Je ne comprend pas trop pk tu met dans le PadLeft(3,'a') ?

  10. #10
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Bon, je vais l'écrire en version plus espacée :

    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
     
    int i = 0; // Toi tu voulais pouvoir incrémenter à coup d'addition, donc c'est forcément un nombre.
     
    // Cependant, toi tu veux une représentation textuelle de ton nombre, donc
    // on passe par un string dans laquelle on formate ton nombre. Result
    // n'est donc qu'une variable de transition, ton vrai nombre, celui sur lequel
    // tu peux faire des calculs, reste 'i'
    // Ici on initialise Result avec la représentation textuelle de 'i', ce qui donne
    // 'a' compte tenu de l'alphabet passé.
    string Result = IntToString("abc", i);
     
    // Tu dis vouloir une représentation sous la forme 'aaa', 'aab', 'aac', ...
    // or la fonction retourne le nombre sans les '0' devant.
    // PadLeft permet de les placer, tu veux que ton nombre soit composé de 3 lettres
    // et le 0 de ton alphabet c'est 'a', donc :
    Result = Result.PadLeft(3, 'a'); // On comble le nombre en placant des 'a' à gauche jusqu'a atteindre 3 lettres
     
    // Tu veux toutes les combinaisons, dans l'ordre, jusqu'à "ccc"
    while(Result != "ccc") // ici on peut aussi utiliser (et c'est même mieux) string.Compare(Result, "ccc") != 0
    {
        // On affiche ce nombre
        Console.WriteLine(Result);
     
        // On incrémente ton nombre 'i'
        i++;
     
        // Et on recommence : on transforme i en sa représentation textuelle
        Result = IntToString("abc", i).PadLeft(3, 'a');
    }
    // Vu la condition, quand Result = "ccc", on sort de la boucle sans l'afficher, alors on le fait maintenant
    Console.WriteLine(Result);

    La version que j'avais écrite avant permettais d'éviter de dupliquer certaines instructions.
    Tu pourrais aussi, histoire d'accélérer le code, utiliser i en condition.
    "ccc" = 2 * 3 ^ 0 + 2 * 3 ^ 1 + 2 * 3 ^ 2 = 2 * 1 + 2 * 3 + 2 * 9 = 2 + 6 + 18 = 26.
    donc while (i < 27) par exemple.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 99
    Par défaut
    Merci j'ai trouver

    Il faut mettre dans PadLeft la longueur max que l'on souhaite.

    Merci encore !!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Incrémenter une variable de type string
    Par Jinkas dans le forum C#
    Réponses: 12
    Dernier message: 03/07/2013, 12h28
  2. Incrémentation d'une variable dans un string
    Par discus23 dans le forum SAS Base
    Réponses: 11
    Dernier message: 08/06/2012, 12h35
  3. Réponses: 1
    Dernier message: 12/10/2011, 02h11
  4. Incrémenter un string qui contient un entier
    Par itokia dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/06/2011, 11h56
  5. incrémenter un string
    Par mathher dans le forum C++
    Réponses: 1
    Dernier message: 01/04/2006, 14h46

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