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 :

Remplacer 3X ou 4X par 001 ou 0001 dans une String


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2013
    Messages : 31
    Points : 26
    Points
    26
    Par défaut Remplacer 3X ou 4X par 001 ou 0001 dans une String
    Bonjour à tous,


    Voici le titre plus parlant que je voulais mettre mais que je ne pouvais pas


    Remplacer XXX ou XXXX par 001 ou 0001 dans une String



    Je sais utiliser 'replace' pour remplacer une occurrence (un seul caractère) dans une String.


    J'aimerais remplacer dans une String du style M####K par M0012A (4 caractères) mais remplacer dans une String M###A par M012A (3 caractères).


    Comment s'y prendre de façon simple... ou pas, du moment que cela fonctionne


    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Bonjour,

    La méthode "replace" permet aussi de remplacer des chaines de caractères.
    https://msdn.microsoft.com/query/dev...-.NETFramework

    Je pense que tes XXX ou ### sont des caractères réservés ?
    XXX ou ### ou des longueurs maximal, fixe ? 3 ou 4 caractères ou ils peuvent être variable ?
    Si il y a "XXX" et que tu souhaite mettre 123456 qu'est ce qui doit se passer ?

    Après tu peut forcer la longueur minimum lors de la conversion d'un int vers string

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                int i = 12;
                string str = i.ToString("0000");
    "str" vaudra "0012"

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2013
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Je pense que tes XXX ou ### sont des caractères réservés ?
    En effet.

    XXX ou ### ou des longueurs maximal, fixe ? 3 ou 4 caractères ou ils peuvent être variable ?
    Justement c'est là nœud du soucis, il peut y avoir 3/4/5 caractères.
    Si c'était toujours XXX j'aurais fait un Replace(String, String) en faisant Replace("XXX", "001").

    Mais ceci est variable est peut être donc XX, XXX, XXXX, XXXXX.

    Si il y a "XXX" et que tu souhaite mettre 123456 qu'est ce qui doit se passer ?
    C'est bien ce que tu as pensé, c'est limiter le nombre de caractères par le nombre de XXX

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Donc :
    Si il y a "XXX" et que tu souhaite mettre 123456 qu'est ce qui doit se passer ?
    123 ou 345 ou 456 ?

    Ok, donc ton nombre de caractère peut être variable, disons plutôt non connus.

    On allons devoir effectuer un traitement sur la chaine de caractère je pense.

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Est ce que quelque chose comme ceci pourrai faire l'affaire ?
    Si quelqu'un d'autre à une meilleur idée.

    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
            public string SpecialReplace(string input, char car, int replaceInt)
            {
                int debut;
                // Tant qu'un caractère de remplacement est trouvé dans la chaine d'entrée "input"
                while ((debut = input.IndexOf(car)) != -1)
                {
                    // Initialise la longueur de remplacement à 1
                    int longueur = 1;
     
                    // parcoure les caractères suivant de la string afin de trouver la longueur à remplacer
                    for (int i = debut + longueur; i < input.Length; i++)
                    {
                        // Si le caractère n'est pas "car" on s'arrète
                        if (input[i] != car)
                            break;
                        // Sinon on incrémente la longueur et on continue
                        else
                            longueur++;
                    }
                    // Nous avons le début des caractères à replacer "debut", et la longueur "longueur"
     
                    string replaceStr = "";
                    // Si la longueur plus petite que le chiffre, on tronque le chiffre 
                    if (longueur < replaceInt.ToString().Length)
                        replaceStr = replaceInt.ToString().Substring(replaceInt.ToString().Length - longueur);
                    // Sinon on complète avec des 0
                    else
                        replaceStr = replaceInt.ToString(new string('0', longueur));
     
                    input = input.Substring(0, debut) + replaceStr + input.Substring(debut + longueur);
                }
                return input;
            }
    // SpecialReplace(Chaine d'entrée, Suite de caractère à remplacer, Valeur de remplacement)

    string result= SpecialReplace("#### bonjour, ### je suis un test ###### de remplacement### #", '#', 1234);
    // result vaut "1234 bonjour, 234 je suis un test 001234 blabla 234 4"

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    J'en propose une deuxième plus lisible avec regex et linq

    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
           public string SpecialReplace2(string input, char car, int replaceInt)
            {
                Regex regex = new Regex(car + "+");
                List<string> trouvé = new List<string>();
                foreach (Match match in regex.Matches(input))
                    trouvé.Add(match.Value);
                trouvé = trouvé.Distinct().OrderByDescending(a => a.Length).ToList();
     
                foreach (string item in trouvé)
                {
                    string replaceStr;
                    if (item.Length < replaceInt.ToString().Length)
                        replaceStr = replaceInt.ToString().Substring(replaceInt.ToString().Length - item.Length);
                    else
                        replaceStr = replaceInt.ToString(new string('0', item.Length));
     
                    input = input.Replace(item, replaceStr);
                }
     
                return input;
            }

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Et la version compressée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            public string SpecialReplace3(string input, char car, int replaceInt)
            {
                foreach (string item in Regex.Matches(input, car + "+").Cast<Match>().Select(match => match.Value).ToList().Distinct().OrderByDescending(a => a.Length))
                    input = input.Replace(item, (item.Length < replaceInt.ToString().Length) ? replaceInt.ToString().Substring(replaceInt.ToString().Length - item.Length) : replaceInt.ToString(new string('0', item.Length)));
                return input;
            }

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2013
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Je te remercie ericlm128 pour ton aide précieuse et le temps que tu as consacré à mon problème.

    Je test tout ça demain

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Pas de problème il faut que je m'entraine et je n'ai pas de projet pour le moment donc je surveille le forum.

Discussions similaires

  1. [XL-2010] Remplacer nom de cellule par sa position absolue dans une formule par vba
    Par dar06 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/01/2014, 13h51
  2. Réponses: 2
    Dernier message: 08/01/2014, 11h47
  3. Réponses: 1
    Dernier message: 11/01/2008, 17h54
  4. Remplacer des balises par des valeurs dans une String
    Par RadicalBob dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 15h22
  5. Remplacer \ par \\ dans une string?
    Par g0ldenrno dans le forum Langage
    Réponses: 9
    Dernier message: 05/06/2006, 19h22

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