localeCompare und negative Zahlen
JürgenB
- javascript
0 pl0 JürgenB
0 Christian Kruse0 JürgenB
Hallo,
auf dieser Seite verwende ich zum Vergleichen die Methode localeCompare in der Form return a[sortiert].localeCompare(b[sortiert],doclang,{numeric:true});
, also mit dem Parameter numeric:true
.
Leider wird die Spalte mit den negativen Zahlen falsch sortiert. Verwende ich die Funktion falsch, oder kennt localeCompare keine negativen Zahlen?
Gruß
Jürgen
PS doclang hat den Wert "de";
Verwende ich die Funktion falsch, oder kennt localeCompare keine negativen Zahlen?
String.localeCompare() ist eine Stringfunktion. MFG
Hallo,
String.localeCompare() ist eine Stringfunktion.
Stimmt. -1.234 aus dem DOM gelesen ist ein String. Meine Hoffnung war, das es als Zahl interpretiert wird.
Gruß
Jürgen
Hallo JürgenB,
Leider wird die Spalte mit den negativen Zahlen falsch sortiert. Verwende ich die Funktion falsch, oder kennt localeCompare keine negativen Zahlen?
Kann ich nicht nachvollziehen. Bei mir geht das:
["1", "3", "-1", "0"].sort((a, b) => a.localeCompare(b, "de", {numeric: true}))
// ergibt: (4) ["-1", "0", "1", "3"]
Edit: ah, verstehe - du meinst innerhalb der negativen Zahlen. Ja, das ist bei mir auch falsch. Nein, es sieht nicht so aus als machst du etwas falsch. Ich würde das als Bug oder zumindest als irreführende Parametrisierung einstufen: {numeric: true}
legt nahe, dass ein Vergleich von Nummer stattfindet und nicht mehr von Strings. Ist aber offensichtlich nicht der Fall. Mal sehen, was der Standard dazu sagt…
LG,
CK
Hallo Christian,
danke. Ich werde dann wohl localeCompare nur für Nicht-Zahlen nehmen, und für Zahlen die alte Funktion behalten müssen. Schade.
Gruß
Jürgen
Hallo JürgenB,
danke. Ich werde dann wohl localeCompare nur für Nicht-Zahlen nehmen, und für Zahlen die alte Funktion behalten müssen. Schade.
Ich hab jetzt mal im Standard geblättert… auf den ersten Blick sieht das nach „unterspezifiziert“ aus. Der sagt zum eigentlichen Vergleich nämlich gar nichts aus. Der sagt nur das hier:
The two Strings are compared in an implementation-defined fashion.
Und:
The result is intended to order String values in the sort order specified by the effective locale and collation options computed during construction of collator, and will be negative, zero, or positive, depending on whether x comes before y in the sort order, the Strings are equal under the sort order, or x comes after y in the sort order, respectively.
Und:
[[Numeric]] is a Boolean value, specifying whether numeric sorting is used.
Kein Wort darüber, wie eigentlich genau verglichen werden soll. Ich könnte mir sogar vorstellen, dass das abhängig von OS und Umgebung/Locale ist…
LG,
CK
Hallo Christian,
noch mal danke fürs nachsehen.
[[Numeric]] is a Boolean value, specifying whether numeric sorting is used.
Kein Wort darüber, wie eigentlich genau verglichen werden soll. Ich könnte mir sogar vorstellen, dass das abhängig von OS und Umgebung/Locale ist…
Aber -3 sollte in allen Sprachen und Systemen kleiner als -2 sein.
Wäre schön gewesen, im Tutorial auf die Unterscheidung zwischen Text und Zahl verzichten zu können.
Gruß
Jürgen
Hallo JürgenB,
Aber -3 sollte in allen Sprachen und Systemen kleiner als -2 sein.
Ja. Wie gesagt: ich halte das für unterspezifiziert.
Ich vermute, dass das -
nicht als Teil einer Zahl erkannt wird und deshalb ein Fallback auf einen „normalen“ Vergleich gemacht wird. Da der Standard dazu aber nichts sagt, kann man auch nicht sagen, dass das falsch ist…
LG,
CK
Hallo,
Ich vermute, dass das
-
nicht als Teil einer Zahl erkannt wird und deshalb ein Fallback auf einen „normalen“ Vergleich gemacht wird. Da der Standard dazu aber nichts sagt, kann man auch nicht sagen, dass das falsch ist…
Würde dann nicht auf Jürgens Beispielseite die -1 zusammen mit -12 und -15 sortiert sein?
Gruß
Kalk
Hallo Tabellenkalk,
Ich vermute, dass das
-
nicht als Teil einer Zahl erkannt wird und deshalb ein Fallback auf einen „normalen“ Vergleich gemacht wird. Da der Standard dazu aber nichts sagt, kann man auch nicht sagen, dass das falsch ist…Würde dann nicht auf Jürgens Beispielseite die -1 zusammen mit -12 und -15 sortiert
Ja, das ist doch auch der Fall:
LG,
CK
Hallo,
Ja, das ist doch auch der Fall:
Es zeigt, dass als Zahl sortiert wird, und nicht zu Strings gefallbackt wird. An sonsten würde -1, -12, -15, -2… sortiert werden.
Gruß
Kalk
Hallo Tabellenkalk,
Ja, das ist doch auch der Fall:
Es zeigt, dass als Zahl sortiert wird, und nicht zu Strings gefallbackt wird. An sonsten würde -1, -12, -15, -2… sortiert werden.
Nein, wenn als Zahl sortiert würde, dann würde -15, -12, … sortiert werden. Es wird nach Text zurück gefallen.
Und da -15
, -12
, … alle ein - davor haben, sind die vor den reinen Zahlen. Innerhalb dieser Gruppe wird dann nach dem darauf folgenden Zeichen sortiert – und das ist wieder eine Zahl. Sorry, ich dachte, es wäre offensichtlich, was ich meinte.
LG,
CK
Hallo,
ich dachte, es wäre offensichtlich, was ich meinte.
Weil ich mit einem so ... abwechslungsreichen Algorithmus nicht gerechnet habe
Gruß
Kalk
Hallo Tabellenkalk,
ich dachte, es wäre offensichtlich, was ich meinte.
Weil ich mit einem so ... abwechslungsreichen Algorithmus nicht gerechnet habe
Naja, es entbehrt nicht einer gewissen Logik.
Aber wie gesagt – sorry. Nächstes mal bin ich ausführlicher. 😀
LG,
CK
Hallo,
... abwechslungsreichen Algorithmus ...
😀
Gruß
Jürgen
Hallo,
Würde dann nicht auf Jürgens Beispielseite die -1 zusammen mit -12 und -15 sortiert sein?
das sieht für mich so aus, als würden im Text Zahlen erkannt, -12 ist ein Minus mit einer Zwölf dahinter. Leider wurden negative Zahlen wohl vergessen bzw. nicht spezifiziert.
Gruß
Jürgen