2016-01-18 18 views
9

Sto tentando di utilizzare la funzione localeCompare di JavaScript per l'ordinamento delle stringhe.Forza localeCon riferimento alla distinzione tra maiuscole e minuscole

Sono rimasto sorpreso dai risultati di esecuzione le seguenti righe nella console DevTools:

"a".localeCompare("b") // returns: -1 
"A".localeCompare("b") // returns: -1 

un altro test:

"b".localeCompare("a") // returns: 1 
"B".localeCompare("a") // returns: 1 

Anche quando sono più specifiche sul mio genere ottengo lo stesso risultato:

"a".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1 
"A".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1 
"b".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1 
"B".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1 

Desidero utilizzare localeCompare per confrontare le stringhe in un case-sensitive modo, quindi non "b" rispetto a "a" e "B" rispetto a "a" hanno risultati opposti?

+1

Stavo per suggerire di fornire un argomento 'locales', ma, almeno con' "en" 'che non ha fatto la differenza. Ho anche provato l'opzione '" caseFirst "', ma non ha fatto nessuna differenza, anche se dice * Le implementazioni non sono richieste per supportare questa proprietà. * –

+0

Scusa, non capisco la tua confusione, come sarebbe ' b' si verificano prima di 'A' nell'ordine alfabetico? – Teemu

+0

@Teemu Ho aggiunto un altro esempio nella mia domanda per mostrare il caso opposto ... non dovrebbe essere "B" prima di "a"? –

risposta

5

LocalCompare può essere case-sensitive, abilitato da { sensitivity: 'case'} o l'estensione unicode: u-kf-upper o u-kf-lower.

Il spec of LocalCompare dice che:

Il risultato ha lo scopo di ordinare i valori stringa nel tipo di ordinamento specificato dalle impostazioni internazionali di default del sistema

O il locale è possibile aggiungere come argomento.

Il predefinito per en-US per il caso ordine sensibili "inferiore" con:

aAbBcC ... 

Si potrebbe cambiare a "superiore", che è:

AaBbCc ... 

Questo test mostra che il passaggio daDaa lower ha effetto solo sulla stessa lettera e non ordina maiuscolo maiuscolo prima di lettere minuscole o viceversa.

var b = "A".localeCompare("a", 'en-US-u-kf-lower'); // 1 
var c = "A".localeCompare("a", 'en-US-u-kf-upper'); // -1 
var d = "A".localeCompare("b", 'en-US-u-kf-upper'); // -1 
var e = "A".localeCompare("b", 'en-US-u-kf-lower'); // -1 

  • Ci potrebbe essere un locale che ordina maiuscole/minuscole in modo diverso, ma non sono a conoscenza di alcun ...
  • l'ordinamento internazionale è case insensitive
  • ASCII sorta l'ordine sarebbe ACb
  • Alcune località hanno ordini diversi: il finlandese ad esempio calpesta come W: Va Wb Vc ...

La sensibilità al maiuscolo/minuscolo influisce in qualche modo sui valori numerici?

var b = "1".localeCompare("a", 'en-US-u-kf-lower'); // -1 
var c = "1".localeCompare("A", 'en-US-u-kf-upper'); // -1 
var d = "104".localeCompare("a", 'en-US-u-kf-upper'); // -1 

no, ma ...

v'è un'opzione, come i valori numerici possono essere confrontati: kn

con l'opzione o estensione Unicode kn si può abilitare confronto numerico (kn-true):

var b = "10".localeCompare("2", 'en-US-u-kn-true'); // 1 
var c = "10".localeCompare("2", 'en-US'); // -1 

Tuttavia, I numeri sono sempre prima delle lettere:

var d = "1".localeCompare("a", 'en-US-u-kn-true'); // -1 
var e = "1".localeCompare("a", 'en-US'); // -1 
+0

Qualche idea su come ordinare i numeri dopo le stringhe? come '" 109 ".localCompare ('a')' – Vadorequest

+0

@Vadorequest No, non penso sia possibile con localCompare. – jHilscher