Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

String.localeCompare()

16 réponses
Avatar
Pascal
Bonjour,

Il m'aura fallu quand m=EAme juste quelques ann=E9es pour d=E9couvrir=20
l'existence de cette m=E9thode !
Oui, je sais, je viens de v=E9rifier et, effectivement, elle est bien=20
d=E9crite page 101 (para. 15.5.4.9) du standard ECMA 262-3.
Mais quand m=EAme, comme je pense ne pas =EAtre le seul =E0 m'=E9tonner (=
et =E0 ne=20
pas avoir comme livre de chevet pr=E9f=E9r=E9 l'ouvrage pr=E9cit=E9), je =
me=20
permets d'en faire profiter tout le monde.

La m=E9thode compare la cha=EEne courante avec celle pass=E9e en argument=
,=20
tenant compte des param=E8tres linguistiques de la machine locale.
Ainsi, en fran=E7ais, le "=E9" sera bien consid=E9r=E9 comme =E9tant plac=
=E9 avant=20
le "f", par exemple.

L'exemple ci-dessous utilise la m=E9thode dans une fonction permettant=20
finalement le tri localis=E9 d'un tableau, =E0 comparer avec les r=E9sult=
ats=20
pr=E9c=E9dents.

<script>
var t1 =3D ["fee", "echo"];
t1.sort();
alert(t1); // "echo,fee"
var t2 =3D ["f=E9e", "=E9cho"];
t2.sort();
alert(t2); // "f=E9e,=E9cho"
t2.sort(function(a,b) { return a.localeCompare(b) });
alert(t2); // "=E9cho,f=E9e"
</script>

Ah, JavaScript, quand tu nous tiens...

Cordialement,
Pascal

10 réponses

1 2
Avatar
Pierre Goiffon
On 10/05/2010 18:08, Pascal wrote:
Oui, je sais, je viens de vérifier et, effectivement, elle est bien
décrite page 101 (para. 15.5.4.9) du standard ECMA 262-3.
Mais quand même, comme je pense ne pas être le seul à m'étonner (et à ne
pas avoir comme livre de chevet préféré l'ouvrage précité), je me
permets d'en faire profiter tout le monde.

La méthode compare la chaîne courante avec celle passée en argument,
tenant compte des paramètres linguistiques de la machine locale.
Ainsi, en français, le "é" sera bien considéré comme étant placé avant
le "f", par exemple.

L'exemple ci-dessous utilise la méthode dans une fonction permettant
finalement le tri localisé d'un tableau, à comparer avec les résultats
précédents.

<script>
var t1 = ["fee", "echo"];
t1.sort();
alert(t1); // "echo,fee"
var t2 = ["fée", "écho"];
t2.sort();
alert(t2); // "fée,écho"
t2.sort(function(a,b) { return a.localeCompare(b) });
alert(t2); // "écho,fée"
</script>



Euh mais où sont récupérés les fameux paramètres ? S'agit-il, comme dans
une collation en BD de la comparaison (ç == c) et le tri ?
Quel est le support effectif de cette méthode dans les navigateurs ?
Avatar
SAM
Le 5/11/10 2:22 PM, Pierre Goiffon a écrit :
On 10/05/2010 18:08, Pascal wrote:
Oui, je sais, je viens de vérifier et, effectivement, elle est bien
décrite page 101 (para. 15.5.4.9) du standard ECMA 262-3.
Mais quand même, comme je pense ne pas être le seul à m'étonner (et à ne
pas avoir comme livre de chevet préféré l'ouvrage précité), je me
permets d'en faire profiter tout le monde.

La méthode compare la chaîne courante avec celle passée en argument,
tenant compte des paramètres linguistiques de la machine locale.
Ainsi, en français, le "é" sera bien considéré comme étant placé avant
le "f", par exemple.

L'exemple ci-dessous utilise la méthode dans une fonction permettant
finalement le tri localisé d'un tableau, à comparer avec les résultats
précédents.

<script>
var t1 = ["fee", "echo"];
t1.sort();
alert(t1); // "echo,fee"
var t2 = ["fée", "écho"];
t2.sort();
alert(t2); // "fée,écho"
t2.sort(function(a,b) { return a.localeCompare(b) });
alert(t2); // "écho,fée"
</script>





Il me semblait qu'on en avait déjà parlé cette année (ou précédente ?)
Olivier Miakinen ?
(ça semble bien être du genre de ses centres d'intérêt c't'affaire)


Euh mais où sont récupérés les fameux paramètres ?



Pas compris le sens de la question.
Les paramètres sont les valeurs des éléments du tableau (de l'array).
non ?

S'agit-il, comme dans
une collation en BD de la comparaison (ç == c) et le tri ?
Quel est le support effectif de cette méthode dans les navigateurs ?




Question JS et fonction sort() :
« The localeCompare performs a locale-sensitive string comparison of the
stringVar and the stringExp and returns -1, 0, or +1, depending on the
sort order of the system default locale. »
nous dit M$ ici :
<http://msdn.microsoft.com/en-us/library/62b7ahzy(VS.85).aspx>

Du côté gecko (Mozilla et dérivés) c'est ici :
<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/localeCompare>
JS 1.5 minima (à ce que j'ai compris)

Le sort se fait donc un peu comme un tri d'un tableau à 2 dimensions,
la 2ième dimension étant celle de l'ordre (alphabétique) local,
dirait-on ?

--
sm
Avatar
Olivier Miakinen
Le 11/05/2010 15:52, SAM répondait à Pascal et à Pierre Goiffon :

On 10/05/2010 18:08, Pascal wrote:

alert(t2); // "fée,écho"
t2.sort(function(a,b) { return a.localeCompare(b) });
alert(t2); // "écho,fée"





Il me semblait qu'on en avait déjà parlé cette année (ou précédente ?)
Olivier Miakinen ?



Je ne me rappelle pas, mais c'est possible. Cela dit, à chaque fois que
j'ai discuté de fonctions dont le comportement dépend de la locale de la
machine, c'était pour m'en méfier comme de la peste : cf. ma réponse
datant de moins de 24 h dans fr.comp.lang.php !

(ça semble bien être du genre de ses centres d'intérêt c't'affaire)



;-)

Euh mais où sont récupérés les fameux paramètres ?



Pas compris le sens de la question.
Les paramètres sont les valeurs des éléments du tableau (de l'array).
non ?



À mon avis, Pierre se demande quelle locale est utilisée (réponse :
celle du système si j'ai bien tout compris).

S'agit-il, comme dans
une collation en BD de la comparaison (ç == c) et le tri ?





À ce que je crois, c'est bien de cet ordre là.

Quel est le support effectif de cette méthode dans les navigateurs ?





Je passe.

Question JS et fonction sort() :
« The localeCompare performs a locale-sensitive string comparison of the
stringVar and the stringExp and returns -1, 0, or +1, depending on the
sort order of the system default locale. »
nous dit M$ ici :
<http://msdn.microsoft.com/en-us/library/62b7ahzy(VS.85).aspx>



Merci.

Du côté gecko (Mozilla et dérivés) c'est ici :
<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/localeCompare>
JS 1.5 minima (à ce que j'ai compris)



C'est rigolo, ici ils ne parlent pas de la locale du système. Est-ce que
Mozilla & Co utilise une locale spécifique au lieu de celle de la machine ?

Le sort se fait donc un peu comme un tri d'un tableau à 2 dimensions,
la 2ième dimension étant celle de l'ordre (alphabétique) local,
dirait-on ?



Beuh... non, pourquoi deux dimensions ? C'est simplement un tri dont la
fonction de comparaison est basée sur l'ordre des caractères dans une
langue donnée, et non sur un simple numéro d'ordre dans le répertoire
Unicode.
Avatar
SAM
Le 5/11/10 4:13 PM, Olivier Miakinen a écrit :
Le 11/05/2010 15:52, SAM répondait à Pascal et à Pierre Goiffon :
On 10/05/2010 18:08, Pascal wrote:
alert(t2); // "fée,écho"
t2.sort(function(a,b) { return a.localeCompare(b) });
alert(t2); // "écho,fée"


Euh mais où sont récupérés les fameux paramètres ?


Pas compris le sens de la question.
Les paramètres sont les valeurs des éléments du tableau (de l'array).
non ?



À mon avis, Pierre se demande quelle locale est utilisée (réponse :
celle du système si j'ai bien tout compris).



ça semblerait
sinon il faudrait une variable pour indiquer quelle localité, non ?

Du côté gecko (Mozilla et dérivés) c'est ici :
<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/localeCompare>
JS 1.5 minima (à ce que j'ai compris)



C'est rigolo, ici ils ne parlent pas de la locale du système. Est-ce que
Mozilla & Co utilise une locale spécifique au lieu de celle de la machine ?



Une autre page alors :
<https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Date/ToLocaleString>

--
sm
Avatar
Olivier Miakinen
Le 11/05/2010 16:27, SAM a écrit :

À mon avis, Pierre se demande quelle locale est utilisée (réponse :
celle du système si j'ai bien tout compris).



ça semblerait
sinon il faudrait une variable pour indiquer quelle localité, non ?



Je parierais que c'est ce qui était prévu, selon la NOTE 4 :

<cit. (traduction libre)>
NOTE 4
Le second paramètre de cette fonction a des chances d'être utilisé dans
une version future de cette norme ; il est recommandé que les
implémentations n'utilisent pas ce paramètre pour quoi que ce soit d'autre.
</cit.>

Du côté gecko (Mozilla et dérivés) c'est ici :
<https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/localeCompare>
JS 1.5 minima (à ce que j'ai compris)



C'est rigolo, ici ils ne parlent pas de la locale du système. Est-ce que
Mozilla & Co utilise une locale spécifique au lieu de celle de la machine ?



Une autre page alors :
<https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Date/ToLocaleString>



Ceci est la preuve que Mozilla sait accéder à la locale de la machine
pour le formatage des dates. On pourrait alors se laisser aller à penser
qu'il peut le faire aussi pour les tris de chaînes (quoique ce ne soient
probablement pas les mêmes fonctions système qui soient appelées).
Avatar
Pascal
Bonjour à tous,

Merci pour vos commentaires et votre intérêt pour la chose.
Continuant sur ma lancée, je propose modestement ce code à la communa uté
(libre de droits, bien entendu).

L'idée est donc d'ajouter une nouvelle méthode à l'objet Array.
Celle-ci permet de trier un tableau, si les éléments sont des chaîn es,
en tenant compte des paramètres linguistiques de localisation.
Un argument optionnel permet de choisir un ordre de tri ascendant
(valeur "asc", par défaut) ou descendant (valeur "desc").
Une exception est levée si un argument non légitime est passé.

<script>
if (! Array.prototype.localeSort) {
/**
* Sort an array of strings into localized ordering.
* @param order (string) Optional, order into which sort must be don e.
* Legal values are "asc" or "desc". Default value is "asc".
* @return void
*/
Array.prototype.localeSort = function(/* order */) {
// Argument is optional, default value is "asc".
var order = String(arguments[0] || "asc");
// Whatever the order is, perform a localized sort.
this.sort(function(a,b) { return a.localeCompare(b) });
switch (order) {
case "asc": break;
case "desc": // Simply reverse the array for this case.
this.reverse();
break;
default: // Throw an exception if not a valid argument.
var msg = "Single optional argument must be one of
['asc'|'desc']."
throw new Error(msg);
}
}
}
</script>

Testé FF 3.6 et IE 8.

Je reste complètement ouvert à vos apports pour améliorer le code.
Vous avez même le droit de me dire que je perds mon temps. ;-)

Cordialement,
Pascal
Avatar
SAM
Le 5/12/10 8:59 PM, Pascal a écrit :
Bonjour à tous,

Merci pour vos commentaires et votre intérêt pour la chose.
Continuant sur ma lancée, je propose modestement ce code à la communauté
(libre de droits, bien entendu).

L'idée est donc d'ajouter une nouvelle méthode à l'objet Array.
Celle-ci permet de trier un tableau, si les éléments sont des chaînes,
en tenant compte des paramètres linguistiques de localisation.
Un argument optionnel permet de choisir un ordre de tri ascendant
(valeur "asc", par défaut) ou descendant (valeur "desc").
Une exception est levée si un argument non légitime est passé.

<script>
if (! Array.prototype.localeSort) {
/**
* Sort an array of strings into localized ordering.
* @param order (string) Optional, order into which sort must be done.
* Legal values are "asc" or "desc". Default value is "asc".
* @return void
*/
Array.prototype.localeSort = function(/* order */) {
// Argument is optional, default value is "asc".
var order = String(arguments[0] || "asc");
// Whatever the order is, perform a localized sort.
this.sort(function(a,b) { return a.localeCompare(b) });
switch (order) {
case "asc": break;
case "desc": // Simply reverse the array for this case.
this.reverse();
break;
default: // Throw an exception if not a valid argument.
var msg = "Single optional argument must be one of
['asc'|'desc']."
throw new Error(msg);
}
}
}
</script>

Testé FF 3.6 et IE 8.

Je reste complètement ouvert à vos apports pour améliorer le code.
Vous avez même le droit de me dire que je perds mon temps. ;-)

Cordialement,
Pascal



Pourquoi trier dans un sens pour le renverser ensuite ?


Array.prototype.localeSort = function(/* order */) {
// Argument is optional, default feature is asc sort
(arguments.length>0)?
this.sort(function(a,b) { return b.localeCompare(a) }) :
this.sort(function(a,b) { return a.localeCompare(b) });
}

var t = ['fée','add','ferrer','perte','faire','pépite',
'fête','faite','ferraille','ajout','ferré'];

<p><button onclick="t.localeSort();alert(t.join('n'));">
tri asc</button>
<p><button onclick="t.localeSort(0);alert(t.join('n'));">
tri desc</button>

--
sm
Avatar
Pascal
SAM a écrit :
Pourquoi trier dans un sens pour le renverser ensuite ?



Bah, je me disais que ce n'était pas très coûteux pour le client we b.
Mais ta proposition me plait aussi, donc pourquoi pas.

Array.prototype.localeSort = function(/* order */) {
// Argument is optional, default feature is asc sort
(arguments.length>0)?
this.sort(function(a,b) { return b.localeCompare(a) }) :
this.sort(function(a,b) { return a.localeCompare(b) });
}



Par contre, la gestion quasi booléenne de l'argument, ça vient de que lle
idée ? C'est seulement pour simplifier le code ?

Cordialement,
Pascal
Avatar
SAM
Le 5/13/10 10:01 AM, Pascal a écrit :
SAM a écrit :
Pourquoi trier dans un sens pour le renverser ensuite ?



Bah, je me disais que ce n'était pas très coûteux pour le client web.
Mais ta proposition me plait aussi, donc pourquoi pas.

Array.prototype.localeSort = function(/* order */) {
// Argument is optional, default feature is asc sort
(arguments.length>0)?
this.sort(function(a,b) { return b.localeCompare(a) }) :
this.sort(function(a,b) { return a.localeCompare(b) });
}



Par contre, la gestion quasi booléenne de l'argument, ça vient de quelle
idée ? C'est seulement pour simplifier le code ?



Je pars faire le pont
à ++
Stéphane


Cordialement,
Pascal

Avatar
SAM
Le 5/13/10 10:01 AM, Pascal a écrit :
SAM a écrit :
Pourquoi trier dans un sens pour le renverser ensuite ?



Bah, je me disais que ce n'était pas très coûteux pour le client web.



Oui, sans doute pas pour un array de qqes éléments,
mais pour un classement des mots d'un fichier texte de 500 ko
ça doit commencer à compter, j'imagine.


Mais ta proposition me plait aussi, donc pourquoi pas.

Array.prototype.localeSort = function(/* order */) {
// Argument is optional, default feature is asc sort
(arguments.length>0)?
this.sort(function(a,b) { return b.localeCompare(a) }) :
this.sort(function(a,b) { return a.localeCompare(b) });
}



Par contre, la gestion quasi booléenne de l'argument, ça vient de quelle
idée ? C'est seulement pour simplifier le code ?



Heu ... c'est plus pour simplifier l'emploi de la fonction
- s'il n'y a pas d'argument : tri ascendant (normal)
- si n'importe quel(s) argument(s) : tri descendant (inverse)

Si tu préfères :

Array.prototype.localeSort = function(/* order */) {
// 'order' is optional, default feature is local order,
// any value (number or string) will sort in reverse
(arguments[0]=='')?
this.sort(function(a,b) { return b.localeCompare(a) }) :
this.sort(function(a,b) { return a.localeCompare(b) });
}

Il me semble que c'est plus sûr si on fait :
(arguments.length>0)?

Autre idée moins simple d'utilisation
mais peut-être plus "parlant" ?

Array.prototype.localeSort = function(order) {
// if 'order' is true or any value <> 0, sort in local order,
// else sort in reverse ('order': false, 0 or omitted)
(!arguments[0])?
this.sort(function(a,b) { return b.localeCompare(a) }) :
this.sort(function(a,b) { return a.localeCompare(b) });
}



Ha! l'array suivant qui contient des nombres
va donner une erreur dans la fonction :

var t = ['fée','add','ferrer','perte','faire','pépite',
'fête','faite','ferraille','ajout','ferré',
'0',100,-358,1.25,1.15];

ne reste donc qu'à trouver une astuce pour déterminer la "légitimité" de
- l'array
- ou de chacun de ses éléments

--
sm
1 2