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

Java Discussion :

Passer en majuscule après "-"


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 13
    Par défaut Passer en majuscule après "-"
    Bonjour à tous,

    je dois afficher des prénoms, initialement tout en minuscule.

    Je me contentais jusque là de passer en majuscule les premières lettres de chaque mot avec WordUtils.capitalize() (exemple : jean -> Jean)
    Mais il faudrait aussi que les mots après "-" passent aussi en première lettre majuscule (exemple : jean-marie -> Jean-Marie).
    Je pense qu'une regex dans un replaceAll doit faire l'affaire mais j'ai un peu de mal à l'écrire

    Merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Un truc tout con tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String prénoms = "paul-émile-victor"     // prénoms avec un nombre variable de "-"
    String[] tableauPrénoms = prénoms.split("-");   // ça fabrique un petit tableau des prénoms
    String Prénoms = "";
    for (String p : tableauPrénoms) {
         Prénoms += "-" + WordUtils.capitalize(p);  // on recolle les prénoms avec une majuscule à chacun
    }
    Prénoms = Prénoms.substring(1);    // pour supprimer le 1er "-"
    system.out.println(Prénoms);  // pour admirer le résultat
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonsoir,

    Citation Envoyé par Népomucène Voir le message
    Un truc tout con tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String prénoms = "paul-émile-victor"     // prénoms avec un nombre variable de "-"
    String[] tableauPrénoms = prénoms.split("-");   // ça fabrique un petit tableau des prénoms
    String Prénoms = "";
    for (String p : tableauPrénoms) {
         Prénoms += "-" + WordUtils.capitalize(p);  // on recolle les prénoms avec une majuscule à chacun
    }
    Prénoms = Prénoms.substring(1);    // pour supprimer le 1er "-"
    system.out.println(Prénoms);
    Un truc tout con à ne pas faire:
    Utiliser des noms de variables avec des accents .

    A+.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    oui, oui, je sais mon lieutenant ;
    j'avoue mes turpitudes, je suis un grand vilain : non seulement il m’arrive d'utiliser des variables avec accent
    mais j'en mets aussi parfois dans les noms de mes classes, packages, etc.

    Cependant, James Gosling n'a encore jamais fait planter un de mes programmes
    à cause de cela. Je dois avoir un passe-droit inconnu.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Cependant, James Gosling n'a encore jamais fait planter un de mes programmes
    à cause de cela. Je dois avoir un passe-droit inconnu.
    Tu dois utiliser un environnement relativement uniforme. Les accents dans les identifiants c'est censé marcher en principe, mais c'est chercher les ennuis d'intégration.

    Et les gens dont le boulot passe par des environnements un peu hétéroclites ou des manips avancées, savent que c'est pas de la parano.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Tu dois utiliser un environnement relativement uniforme. Les accents dans les identifiants c'est censé marcher en principe, mais c'est chercher les ennuis d'intégration.

    Et les gens dont le boulot passe par des environnements un peu hétéroclites ou des manips avancées, savent que c'est pas de la parano.
    Oui, je sais que vous avez raison et dans les EJB je ne m'amuse pas à mettre des accents.

    pour les expressions régulières, il n'y a pas de miracle, il faut travailler d'abord sur des exemples simples
    puis voir des cas plus complexes. Les tirets variables dans les prénoms tombent dans la seconde catégorie.

    Hugo Etiévant a fait un bon tuto dont je me sert régulièrement
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 13
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Un truc tout con tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String prénoms = "paul-émile-victor"     // prénoms avec un nombre variable de "-"
    String[] tableauPrénoms = prénoms.split("-");   // ça fabrique un petit tableau des prénoms
    String Prénoms = "";
    for (String p : tableauPrénoms) {
         Prénoms += "-" + WordUtils.capitalize(p);  // on recolle les prénoms avec une majuscule à chacun
    }
    Prénoms = Prénoms.substring(1);    // pour supprimer le 1er "-"
    system.out.println(Prénoms);  // pour admirer le résultat
    Merci parfait je n'avais pas pensé à cette solution

    Par curiosité, et parce que j'ai un peu de mal avec les regex, quelqu'un aurait-il la solution avec un replace ?

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    @Népomucène : Outres les accents dans les noms de variable (et les variables locales commençant par une majuscule ), il faut faire attention au += sur les Strings qui peut être catastrophique avec de grande chaine. L'utilisation de StringBuilder serait plus approprié...



    Citation Envoyé par chalmou Voir le message
    Par curiosité, et parce que j'ai un peu de mal avec les regex, quelqu'un aurait-il la solution avec un replace ?
    Le premier soucis c'est de rechercher ce que tu veux remplacer. Sachant que \p{L} représente toutes les lettres, on peut utiliser \p{Lu} pour les lettres majuscules et donc \p{Ll} pour les lettres minuscules.
    Tu peux également utiliser \b qui représente un délimiteur de mot (un tiret, un début de chaine ou autre...)

    Ainsi \b\p{Ll} représente tous les caractères minuscules en début de mot, ce qui devient "\\b\\p{Ll}" en Java (puisque les \ doivent être protégé).


    Le problème c'est qu'on ne peut pas faire de replaceAll() car cela ne permet pas de mettre en majuscule. Il faut impérativement manipuler le matcher par soi même. Ce n'est toutefois pas bien compliqué (c'est toujours la même chose) :

    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
    	public static String capitalize(String text) {
    		// On crée notre pattern
    		// (Note : en cas d'appel multiple il peut être intérressant
    		// de stocker le Pattern pour le réutiliser)
    		Pattern pattern = Pattern.compile("\\b\\p{Ll}");
    		// On crée le matcher qui va parcourir notre texte :
    		Matcher matcher = pattern.matcher(text);
    		// Si on trouve au moins un élément :
    		if (matcher.find()) {
    			// On crée un StringBuffer qui va contenir la nouvelle chaine :
    			StringBuffer sb = new StringBuffer(text.length());
    			// Puis pour chaque élément trouvé :
    			do {
    				// On récupère l'élément courant :
    				String val = matcher.group();
    				// Et on effectue le remplacement :
    				matcher.appendReplacement(sb, val.toUpperCase());
    			} while (matcher.find());
    			// A la fin, on copie tel quel le texte restant :
    			matcher.appendTail(sb);
    			// Et on retourne la nouvelle chaine
    			return sb.toString();
    		}
    		// Sinon, cela signifie qu'il n'y a pas besoin de modif,
    		// Et on retourne directement la chaine :
    		return text;
    	}
    a++

  9. #9
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    @Aduguba,
    Bon d'accord, c'est vrai que cela ne coûte rien de donner un exemple de code qui respecte les conventions de nommage.

    L'utilisation de StringBuilder serait plus approprié
    Effectivement, je m'en sert pour préparer mes fichiers textes

    Cependant, concernant le petit problème de notre ami chalmou,
    dont la chaîne de caractères ne devrait pas excéder deux ou trois prénoms,
    j'ai préféré simplifier ma réponse au maximum (j'ai failli écrire : Prénoms = Prénoms + "-" + WordUtils.capitalize(p);)

    Je crois qu'il faut parfois donner une réponse simpliste afin de ne pas charger la barque
    et permettre à celui qui a posé la question d'aller directement à une solution opérationnelle.
    Le problème de chalmou était "comment mettre une majuscule à des prénoms composés"
    il n'était pas "optimisation du traitement d'un gros volume de texte"

    Mais je veux bien en discuter ...
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    @Népomucène : pour moi l'opérateur + sur les String ne doit jamais être utilisé dans une boucle, car cela génère des objets temporaires.

    Du coup dans une boucle le coût CPU peut vite devenir très important, et ce d'une manière exponentielle.


    Surtout que ce n'est pas très difficile ni moins lisible d'utiliser un Stringbuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	// Avec += qui va générer 2 nouvel objets à chaque itérations :
    	String result = "";
    	for (....) {
    		result += text;
    	}
     
    	// Avec StringBuilder qui va gérer un buffer proprement :
    	StringBuilder buffer = new StringBuilder();
    	for (....) {
    		buffer.append(text);
    	}
    	String result = buffer.toString();
    Et on peut même optimiser la taille initiale du StringBuilder si on connait sa taille finale (ou sa taille approximatif).



    a++

Discussions similaires

  1. Majuscule après apostrophe
    Par Didier77 dans le forum Access
    Réponses: 6
    Dernier message: 04/09/2006, 09h02
  2. Réponses: 2
    Dernier message: 24/08/2006, 11h35

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