Page 1 sur 2

traitement de chaine

Posté : 25 mars 2008, 11:48
par Invité
Bonjour,

J'utilise la fonction suivante pour mettre la première lettre d'un mot en majuscules:
function First2UpperCase(texte) {
var t = new Array();
	for(j=0 ; j < texte.length ;j++) {
		if(j == 0) t[j] = texte.substr(j,1).toUpperCase();
		else t[j] = texte.substr(j,1).toLowerCase();
	}
	return t.join('');
}
ça marche très bien
Mon pb: si le mot est composé de deux "sous-mots", comment faire pour appliquer First2UpperCase à chacun des sous-mots?

Par exemple, comment faire pour transformer "tire-bouchon" en "Tire-Bouchon"?

Posté : 25 mars 2008, 11:50
par agité
Peut être en reperant ou se trouve le trait d'union avec Javascript, et incrémenter d'un pour trouver la lettre suivante ?

EDIT : aide pour trouver un element dans une chaine : http://www.w3schools.com/jsref/jsref_search.asp

Posté : 25 mars 2008, 12:09
par Invité
merci pour l'info. Je comprends les fonctions que tu m'as montrées et je peux effectivement trouver mon "-" dans la chaine "titre-bouchon".
Par contre je ne vois pas dutout comment Appliquer ma fonction First2UpperCase() systématiquement à tout caractère qui vient just après "-".
Je ne vois pas comment faire une incrémentation pour appliquer ça.

(je précise que la fonction First2UpperCase n'est pas de moi, je suis une bille en javascript)

Posté : 25 mars 2008, 12:18
par agité
merci pour l'info. Je comprends les fonctions que tu m'as montrées et je peux effectivement trouver mon "-" dans la chaine "titre-bouchon".
Par contre je ne vois pas dutout comment Appliquer ma fonction First2UpperCase() systématiquement à tout caractère qui vient just après "-".
Je ne vois pas comment faire une incrémentation pour appliquer ça.

(je précise que la fonction First2UpperCase n'est pas de moi, je suis une bille en javascript)
En utilisant indexOf : http://www.commentcamarche.net/javascript/jsstring.php3

de trouver la position de l'element d'ajouter +1 et de mettre en uppercase.

Posté : 25 mars 2008, 12:32
par Invité
ok, merci.
je cherche donc la position de "-" dans 'tire-bouchon"
var txt = "tire-bouchon";
var pos = txt.indexOf("-", 0); // recherche à partir de la position 0
var lettreAtraiter = pos +1;
Donc pos = 5 et lettreAtraiter= 6 . C'est là que je bloque. Comment appliquer First2UpperCase() à lettreAtraiter?
C'est la syntaxe qui me pose pb, je ne sais pas quelle fonction utiliser pour pointer sur lettreAtraiter et appliquer ma fonction?

Posté : 25 mars 2008, 12:45
par Invité
pour tenter de faire plus simple, j'ai ajouté une ligne à ma fonction first2uppercase():
function First2UpperCase(texte) 
{
    var t = new Array();
    for(j=0 ; j < texte.length ;j++) 
    {
        if(j == 0) t[j] = texte.substr(j,1).toUpperCase();
        else t[j] = texte.substr(j,1).toLowerCase();
        if (texte[j] == "-") texte[j+1].toUpperCase(); //ligne ajoutée pour mettre lettre suivante en majuscules
    }
    return t.join('');
}
ça ne renvoie pas d'erreur, mais ça ne marche pas non plus...

Posté : 25 mars 2008, 13:18
par agité
La tu envois la chaine sous forme de tableau, qui est parcourue par javascript, pour le premier element il t'ajouter une majuscule, c'est très bien pour des elements n'ayant pas de sous chaine je te propose un truc un peu a l'arrache mais qui marche :p
<script language="javascript">
function AjouterMajuscule(string)
{
	if(string.search('-') != -1)
	{
	CouperChaine = string.split("-");
	alert(CouperChaine[0].substr(0,1).toUpperCase()+CouperChaine[0].substr(1)+"-"+CouperChaine[1].substr(0,1).toUpperCase()+CouperChaine[1].substr(1))
	}else{
	alert(string.substr(0,1).toUpperCase()+string.substr(1));
	}
}
</script>

Posté : 25 mars 2008, 13:22
par Invité
j'ai aussi essayé ceci qui ne marche pas mieux (pas d'erreur mais pas le résultat attendu)
function First2UpperCase(texte) {
var t = new Array();
	for(j=0 ; j < texte.length ;j++) {
		if(j == 0) t[j] = texte.substr(j,1).toUpperCase();
		else t[j] = texte.substr(j,1).toLowerCase();
		if (texte.substr(j,1) == "-") texte.substr(j+1,1).toUpperCase(); // ligne ajoutée pour passer la lettre suivante en majuscules
	}
	return t.join('');
}

Posté : 25 mars 2008, 13:28
par Invité
houlà, ça a pas l'air très optimisé ton truc...je suis pas sûr d'avoir tout compris, je vais regarder. Merci.
Je précisque quand même que je ne cherche seulement quelquechose qui marche, j'essaye aussi d'apprendre à coder propre ;p

Posté : 25 mars 2008, 13:32
par Invité
je suis sûr que ça peut se faire en 1 ligne comme je l'ai tenté dans les 2 posts précédents...je manque d'expérience en javascript mais y aurait pas un moyen d'intégrer ce traitement dans la première fonction first2uppercase?

Posté : 25 mars 2008, 13:36
par Invité
houlà, ça a pas l'air très optimisé ton truc...je suis pas sûr d'avoir tout compris, je vais regarder. Merci.
Je précisque quand même que je ne cherche seulement quelquechose qui marche, j'essaye aussi d'apprendre à coder propre ;p
Agité, je ne cherche pas à critiquer ton code hein? merci pour ton aide. je voulais juste dire que ça serait pas très optimisé de faire 2 boucles, une avec ma fonction et une autre avec la tienne.
Je cherche juste un moyen de faire une seule boule en modifiant un peu first2uppercase.

Posté : 25 mars 2008, 13:57
par agité
houlà, ça a pas l'air très optimisé ton truc...je suis pas sûr d'avoir tout compris, je vais regarder. Merci.
Je précisque quand même que je ne cherche seulement quelquechose qui marche, j'essaye aussi d'apprendre à coder propre ;p
Agité, je ne cherche pas à critiquer ton code hein? merci pour ton aide. je voulais juste dire que ça serait pas très optimisé de faire 2 boucles, une avec ma fonction et une autre avec la tienne.
Je cherche juste un moyen de faire une seule boule en modifiant un peu first2uppercase.
Pas de soucis, ce que tu as recuperer est un code qui traine sur le net et qui permet de parcourir sous forme de tableau une chaine de caractere pour mettre en upperCase le premier élément.

Maintenant tu as un problème qui se pose pour avoir une chaine possedant un tiret, la fonction que tu utilise se fait élément par élément et join l'ensemble du tableau ensuite.

La fonction que je te propose est peut être pas très propre mais fonctionne pour tout ce qui pourrait posséder un tiret ou non, bien sur cela peut être optimiser.

En tout cas si tu trouve pour le first2uppercase (litteralement la premiere lettre en majuscule) avec d'autres lettres je serais intéresse.

Posté : 25 mars 2008, 14:05
par Invité
Maintenant tu as un problème qui se pose pour avoir une chaine possedant un tiret, la fonction que tu utilise se fait élément par élément et join l'ensemble du tableau ensuite.
Justement, si la fonction effectue un traitement élément par élément, il ne devrait-il pas être possible dans la boucle, de modifier j+1 dans le cas ou j == "-" ?

Posté : 25 mars 2008, 14:11
par Invité
dans la boucle, j'arrive à afficher le caractère après "-" en faisant
if (texte.substr(j,1) == "-") alert(texte.substr(j+1,1));
Donc si texte ="tire-bouchon", la ligne ci dessus m'affiche "b".
Sur cette base, je ne comprends pas pourquoi ceci ne marche pas
function First2UpperCase(texte) { 
var t = new Array(); 
    for(j=0 ; j < texte.length ;j++) { 
        if(j == 0) t[j] = texte.substr(j,1).toUpperCase(); 
        else t[j] = texte.substr(j,1).toLowerCase(); 
        if (texte.substr(j,1) == "-") texte.substr(j+1,1).toUpperCase(); // ligne ajoutée pour passer la lettre suivante en majuscules 
    } 
    return t.join(''); 
}

Posté : 25 mars 2008, 14:14
par agité
parcequ'il utilise un tableau avec les t[j]