Toon posts:

[JS]Nummers met duizend separators laten sorteren.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een javascriptje die waardes uit een tabel kolom sorteert. Dit kan een nummer zijn een string of datum. Door hier cases van te maken wordt ervoor gezorgd dat de waardes altijd goed gesorteerd worden. Dit geef je als variable mee aan de kolom.
Nu krijg ik problemen met getallen die gebruik maken van duizend separators.

- 9984383714 werkt goed
- 9,984,383,714 werkt niet goed
- 9.984.383.714 werkt niet goed

Het probleem kan opgelost worden door een nieuwe case te maken die bijvoorbeeld LocalNumber heet. Deze zou bijvoorbeeld dan de comma's of punten kunnen verwijderen dan pas het getal wegschrijven in de variable sText.
Of een andere oplossing, mischien bestaat er een functie die dat vanzelf al doet. Is er iemand die me op weg kan helpen.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    switch (sType) {
        case "Number":
            return Number(sText);
        case "CaseInsensitiveString":
            return sText.toUpperCase();
        case "Date":
            var parts = sText.split("-");
            var d = new Date(0);
            d.setDate(parts[0]);
            d.setMonth(parts[1] - 1);
            d.setFullYear(parts[2]);
            return d.valueOf();
    }
    return sText;


De waardes in de kolommen worden trouwens aangepast aan de landinstellingen op je pc. Dus amerikanen zien komma's en nederlanders punten.

[ Voor 12% gewijzigd door Verwijderd op 27-11-2003 13:34 ]


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Even snel parseInt en parseFloat geprobeerd maar die helpen niet echt. Het enige wat ik kan verzinnen is:
JavaScript:
1
return new Number(string.replace(/[\.,]/g,''));


edit:

Deze regel laat niets over van 9.231,42 of 9,323.21 (!)

[ Voor 21% gewijzigd door Skaah op 27-11-2003 18:50 ]


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

Ik vermoed dat er niets anders op zit dan a.d.h.v. de locale van de user te bepalen of de '.' nou gebruikt wordt als thousand seperator of als afronding separator (uuh hoe scheld je dat uit? :P)

Misschien dat deze URL je daarbij helpt, icm de link die daar nog staat:
http://msdn.microsoft.com...operties/userlanguage.asp

Dan zou je zoiets krijgen als:

JavaScript:
1
2
3
4
5
6
7
8
// untested en pseudo

function myParseInt(in, thousands, roundings)
{
in = in.split(thousands).join(""); // who needs thousands seperators
in = in.split(roundings).join("."); // netjes een JS number maken
return Number(in);
}

[ Voor 14% gewijzigd door SchizoDuckie op 27-11-2003 20:13 ]

Stop uploading passwords to Github!


Verwijderd

Topicstarter
He Papa Eend dit is de code geworden.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch (sType) {
        case "Number":
            sText = sText.split(",").join(""); 
            return Number(sText);
        case "CaseInsensitiveString":
            return sText.toUpperCase();
        case "Date":
            var parts = sText.split("-");
            var d = new Date(0);
            d.setFullYear(parts[0]);
            d.setDate(parts[2]);
            d.setMonth(parts[1] - 1);
            return d.valueOf();
    }
    return sText;


Hij doet het perfect, nu ga ik een if lus proberen te maken die kijkt of er een"," of een "." wordt gebruikt. Anders gebruik ik 1 standaard gewoon. Decimaal heb ik geen last van want ik gebruik alleen hele getallen. Ik ga verder puzzelen.

Verwijderd

Topicstarter
Ik heb een if lus gemaakt maar hij doet het niet, iemand enig idee wat ik fout doe?
JavaScript:
1
2
3
4
5
6
7
8
9
10
case "Number":
            if(sText.split == ",")
            {
                sText = sText.split(",").join(""); 
                return Number(sText);
            }
            else
            {
                return Number(sText);
            }

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 22:47

crisp

Devver

Pixelated

split geeft een array terug en geen string. Ik vind de split/join constructie trouwens redelijk zinloos, dit werkt net zo goed en is sneller:
JavaScript:
1
sText = sText.replace(/,/g, '');


Voor datums kan het ook sneller:

code:
1
2
var parts = sText.split('-');
return new Date(parts[2],parts[1]-1,parts[0]).valueOf();


;)

[ Voor 28% gewijzigd door crisp op 02-12-2003 11:52 ]

Intentionally left blank


Verwijderd

Topicstarter
Oke ik heb het gewijzigd en het werkt perfect.
JavaScript:
1
2
3
case "Number":
    sText = sText.replace(/[\.,]/g,'');
    return Number(sText);


Nu wil ik zelf weten hoe deze replace exact werkt.
(/[\.,]/g,'') bestaat dus uit 3 stukken?
Stuk 1 /[\.,] de ., snap ik hier maar wat houdt die \ in?
Stuk 2 /g wil de letter g hier zeggen elke willekeurige string?
Stuk 3 ,'') dit houdt in dat een . of , vervangen wordt door niets.

Trouwens ik sta altijd versteld van hoe snel jullie reageren met antwoorden, zit dit in jullie hoofd of maken jullie gebruik van bepaalde references of guides waar je snel op de juiste termen zoekt. Ik vind dit echt knap van jullie.

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Verwijderd schreef op 02 december 2003 @ 12:16:
Nu wil ik zelf weten hoe deze replace exact werkt.
(/[\.,]/g,'') bestaat dus uit 3 stukken?
Stuk 1 /[\.,] de ., snap ik hier maar wat houdt die \ in?
Stuk 2 /g wil de letter g hier zeggen elke willekeurige string?
Stuk 3 ,'') dit houdt in dat een . of , vervangen wordt door niets.

Trouwens ik sta altijd versteld van hoe snel jullie reageren met antwoorden, zit dit in jullie hoofd of maken jullie gebruik van bepaalde references of guides waar je snel op de juiste termen zoekt. Ik vind dit echt knap van jullie.
Check voor rexExp eens in de FAQ van de buren :)
P&W FAQ - Regular expressions

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 22:47

crisp

Devver

Pixelated

Verwijderd schreef op 02 december 2003 @ 12:16:
Oke ik heb het gewijzigd en het werkt perfect.
JavaScript:
1
2
3
case "Number":
    sText = sText.replace(/[\.,]/g,'');
    return Number(sText);


Nu wil ik zelf weten hoe deze replace exact werkt.
(/[\.,]/g,'') bestaat dus uit 3 stukken?
Stuk 1 /[\.,] de ., snap ik hier maar wat houdt die \ in?
met [ ] geef je een characterclass aan; een verzameling karakters waarop gematched moet worden; in dit geval dus een punt of een komma.
Die \ is een escape karakter; omdat een punt normaal gesproken een speciale betekenis heeft in een regexp escape je die om aan te geven dat je letterlijk een punt bedoelt.
Stuk 2 /g wil de letter g hier zeggen elke willekeurige string?
alles na de constructor noemen we modifiers (/ / is dus een zogenaamde RegExp constructor). De g-modifier staat voor 'global match' oftewel dat hij alle matches moet vinden in plaats van alleen de 1e.
Stuk 3 ,'') dit houdt in dat een . of , vervangen wordt door niets.
bingo! :)
Trouwens ik sta altijd versteld van hoe snel jullie reageren met antwoorden, zit dit in jullie hoofd of maken jullie gebruik van bepaalde references of guides waar je snel op de juiste termen zoekt. Ik vind dit echt knap van jullie.
inderdaad puur ervaring :)

Intentionally left blank


Verwijderd

Remove , . etc van de string
daarna doe int.toFixed();
krijg je ook separator
Pagina: 1