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

JavaScript Discussion :

to UpperCase "partiel"


Sujet :

JavaScript

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 388
    Points : 209
    Points
    209
    Par défaut to UpperCase "partiel"
    Bonjour,

    Ce code permet de mettre en majuscule une chaine du style "Nom-Prénom" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var chaine="bouvier Jacques";
    alert(chaine.toUpperCase());
    cela donne "BOUVIER JACQUES".

    Je souhaiterais en fait ne mettre en majuscule que le 1er mot (en l'occurrence le Nom), le 2nd mot (le prénom) devant rester en minuscule :

    "BOUVIER Jacques"

    A priori il faudrait détecter l'espace séparant le nom du prénom. Mais je ne vois pas comment faire pour arriver au résultat escompté. Pouvez-vous m'aider? Merci.

  2. #2
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var chaine="bouvier Jacques";
    chaine = chaine.split(' ');
    chaine[0] = chaine[0].toUpperCase();
    chaine = chaine.join(' ');
    alert(chaine);

    edit: avec une regex (ce qui n'est pas du tout mon fort) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var chaine="bouvier Jacques";
    alert(chaine.replace(/^(\w*)\b/,function(a){return a.toUpperCase();}));

  3. #3
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Bonjour,

    Attention Willpower, il faut prendre le dernier espace, pas le premier.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 388
    Points : 209
    Points
    209
    Par défaut
    Merci à Willpower, le 1er code fonctionne (je n'ai pas essayé le 2nd)

  5. #5
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Bonjour,

    Je ne suis pas d'accord. Comme je le signalais, les noms de familles en plusieurs parties sont monnaies courantes. Essayer de faire cela avec le nom "Van Der Biest Jacques" et vous n'aurez que le "VAN" en majuscules.

    Si vous continuez sur le premier code, il faut boucler sur le nombre d'éléments dans le tableau du split et les mettre en majuscules à l'exception du dernier.

  6. #6
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Les versions adaptées à l'interprétation de Vermine (seul le dernier mot n'est pas mis en majuscule) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var chaine="bouvier henri Jacques";
    var array = chaine.split(' ');
    var nom = array.slice(0,array.length-1).join(' ').toUpperCase();
    chaine = nom+' '+array[array.length-1];
    alert(chaine);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var chaine="bouvier henri Jacques";
    alert(chaine.replace(/^(.*)\b(\w+)$/,function($,$1,$2){return $1.toUpperCase()+$2;}));
    (il existe peut-être mieux niveau regex, vu que ce n'est pas du tout mon fort)

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Le symbole \b est en effet intéressant à utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var chaine="bouvier henri Jacques";
    alert(chaine.replace(/\b\w/g, function( c ){ return c.toUpperCase() }));
    Cependant, il a une grosse limitation : il ne traite pas les caractères accentués.

    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> "botêt jérémie".replace(/\b\w/g, function( c ) { return c.toUpperCase() })
    "BotêT JéRéMie"

    Je ressors une conversation qui avait déjà soulevé le problème. Et je vais fouiller un peu, il doit y avoir moyen de traiter ces caractères de manière plus globale en utilisant des intervalles…

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 388
    Points : 209
    Points
    209
    Par défaut
    Merci à tous pour votre éclairage sur ma question

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Wat
    Même avec un fichier encodé en utf8 ?

  10. #10
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Ouaip, même. L'ancre \b correspond à ce qu'il y a entre \W et \w, ou inversement. Sachant que \w correspond à [a-zA-Z0-9_], les caractères accentués sont laissés sur la touche…

    C'est dit de manière un peu crûe sur un topic de Stackoverflow (je traduis) :
    Javascript est coincé dans l'idiote mentalité « ASCII seulement » des années 60.
    Sinon, j'ai testé avec des pages de différents encodages, la fonction charAt renvoie toujours les mêmes codes, et apparemment c'est de l'UTF-8. Quant aux intervalles… Je pense que c'est plus simple de passer d'abord la chaîne en lower case, puis de tester avec [a-zà-öø-ÿ]. Ça inclut toutes les variantes de lettres de l'ensemble Latin-1 (y compris les tildes, n'est-ce pas Bovino ) et je pense que c'est suffisant

    Je me suis fait une page de test :
    Code HTML : 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
    109
    110
    111
    <!DOCTYPE html>
    <html lang=fr>
    <head>
    	<meta charset=iso-8859-1>
    	<title>Lettre ou pas lettre&nbsp;?</title>
    	<style>
     
    body {
            font: 90% verdana, helvetica, sans-serif;
            margin: 1em 2em;
            max-width: 60em;
    }
    table { border-collapse: collapse; }
    th { background: silver; }
    th, td {
            border: solid thin black;
            text-align: center;
            vertical-align: baseline;
    }
    td {
            width: 1.6em;
            height: 1.6em;
    }
    a { opacity: 0.5; text-decoration: none; }
    a.letter { opacity: 1; }
    a:hover { text-decoration: underline; }
     
     
            </style>
    </head>
    <body>
     
    <label for=page>Page unicode&nbsp;:</label>
    <input id=page type=number min=0 max=65280 step=256 value=0 />
     
    <script>
     
    // moyen plus ou moins fiable de savoir si un caractère est une lettre
    String.prototype.mayBeLetter = function mayBeLetter() {
            return (1 == this.length) && (this.toUpperCase() != this.toLowerCase());
    }
     
    // structure constante de la table
    var $tab = document.createElement("table"),
            $thead = $tab.createTHead(-1),
            $headersRow = $thead.insertRow(-1);
    $headersRow.insertCell(-1);
    for (var i = 0; i < 16; i++) {
            var $colHead = document.createElement("th");
            $colHead.textContent = i.toString(16).toUpperCase();
            $headersRow.appendChild($colHead);
    }
     
    // interaction avec l'input
    var $page = document.getElementById("page");
    $page.onchange = function(){ showRange(this.value); };
     
    function showRange( page ){
            page = page * 1 || 0;
            
            // supprime l'ancien contenu
            var $oldTbody = document.querySelector("tbody");
            if ($oldTbody)
                    $oldTbody.parentNode.removeChild($oldTbody);
            
            
            var $tbody = document.createElement("tbody");
            $tab.appendChild($tbody);
            
            for (var i = 0; i < 16; i++) {
                    var $row = $tbody.insertRow(-1);
                    
                    // colonne d'en-tête
                    var $rowHead = document.createElement("th");
                    $rowHead.appendChild(document.createTextNode(
                            (page.toString(16) + i.toString(16)).toUpperCase() + "x"));
                    $row.appendChild($rowHead);
                    
                    for (var j = 0; j < 16; j++) {
                            var $cell = $row.insertCell(-1);
                            
                            // calcul du code
                            var hex = (page * 256 + 16 * i + j).toString(16),
                                    leadingZeros = 4 - hex.length,
                                    codePoint = hex,
                                    c;
                            
                            // ajout de zéros
                            for (var z = leadingZeros; z--;)
                                    codePoint = "0" + codePoint;
                            
                            // et voici le caractère
                            c = eval("'\\u" + codePoint + "'")
                            
                            // insertion dans la cellule
                            var $a = document.createElement("a");
                            $a.href = "http://www.fileformat.info/info/unicode/char/" + codePoint;
                            $a.appendChild(document.createTextNode(c));
                            $cell.appendChild($a);
                            if (c.mayBeLetter())
                                    $a.className = "letter";
                    }
            }
    }
     
    document.body.appendChild($tab);
    showRange($page.value);
     
    </script>
    </body>
    </html>

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

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