Komma niet laten meereken explode

  • Hallo,


    voor een klant ben ik bezig met een klein systeem. Nu werkt alles in principe, het enige probleem is dat er bij de user input paar kleine problemen voorkomen.


    Het betreft een order lijst: http://prntscr.com/9ubd49
    Aantal Beschrijving Prijs Totaal
    10 Fietsen, zonder zadel 2,50 25
    5 Autos 10 50


    Nu heb ik $aantal in een array staan, $beschrijving enz...
    Alles wordt ook goed in de database geplaatst, er komt alleen een probleem wanneer de user input een komma heeft.


    $prijs = array('2,50', '10'); en wanneer ik nu explode() gebruik om deze weer te splitsen zal hij 2,50 ook splitsen. Iets wat ik niet wil..
    Dit geldt nu dus ook voor beschrijving, de gebruiker is nu dus beperkt om geen komma's in zijn input te verwerken.


    Ik denk dat er een simpele oplossing is, echter kom ik er zo 1 2 3 niet uit.
    Onderstaande klein stukje code, indien meer nodig is hoor ik het wel ^^


    PHP
    $arrayTotal = explode(',', $postTotal); //Hier splits ik de array weer
    $newTotal = array_sum($arrayTotal); //Betreft bedragen die opgeteld worden bij elkaar


    Bij voorbaat dank

  • In welk formaat sla je deze data op? Waarschijnlijk heeft deze data verder geen betekenis? Het is gewoon een plak tekst?


    Heb je niet de beschikking over een database? Dat lijkt mij de beste oplossing. Of je gebruikt een ander formaat om je data gestructureerd op te slaan. Denk aan JSON, CSV, XML, noem het maar op?


    Ik denk dat het probleem voortkomt uit het feit dat je data verder geen betekenis heeft. Machines en hun programmatuur kunnen daar dan verder ook niet goed mee omgaan... zij kunnen simpelweg de verschillende betekenissen van een komma niet onderscheiden...

  • Data wordt opgeslagen in database. Vorm van verwerking is zo: HTML bestand met Formulier => AJAX => PHP welke deze opslaat.


    Het gaat om een facturatie script. Waar je in een tabel het aantal, soort werkzaamheid, prijs per eenheid en totaal bedrag in kan invoeren.
    Als een persoon nu bij prijs per eenheid bijvoorbeeld €5,75 wilt invoeren, kan dit niet omdat ik die waardes in een array heb, en die array later via explode weer in stukken hak.


    De waardes worden opgenomen in een array omdat er oneindig prijzen per eenheid kunnen zijn, dus €5,75 en €10,- en €12,-
    In een array staan deze, waar ik later explode(',', $prijs) doe om ze allemaal los te hebben. En deze vervolgens weer optel. Alleen gaat de explode stukje mis, omdat er een komma in €5,75 zit.


    Bedankt voor jouw bericht, ik hoop dat ik nu wat duidelijker ben

  • Euh, zowel in PHP en JavaScript is het decimaal scheidingsteken een punt, geen komma. Ik zou daarom dit getal ook niet in zijn geformatteerde formaat (met komma) opslaan, maar in zijn rauwe vorm (een punt) zodat je er out-of-the-box mee kunt rekenen. Volgens mij sla je dan twee vliegen in een klap.


    Vervolgens zul je iets moeten verzinnen om het bedrag weer te geven met euro-teken en komma, maar dat lijkt mij een stuk eenvoudiger.


    Je probleem blijft toch bestaan vrees ik, omdat in beschrijvingen iets soortgelijks kan gebeuren wanneer iemand hier een komma in zet. Het probleem is niet zozeer de komma, maar meer dat je data verder geen enkele betekenis heeft. Wat je ook zou kunnen doen is een ander scheidings teken kiezen zoals een staand streepje (een "pipe" | ) of iets dergelijks maar daar kleeft hetzelfde nadeel aan als iemand besluit dat karakter in zijn invoer te stoppen. Het eruitfilteren van dit karakter lijkt mij ook geen goede aanpak omdat dit "escape on input" is, oftewel, je stript iets op voorhand waarmee mogelijk een speciale betekenis van buiten dit systeem verloren gaat.


    Ik zou het eigenlijk gewoon anders aanpakken zodat je dit probleem nooit krijgt want wat je nu doet of gaat doen is toch min of meer het oorspronkelijke probleem in stand houden en hier omheen breien.


    Om te zien waar je precies "de mist ingaat" zal ik meer code moeten zien maar het klinkt toch een beetje alsof je jezelf klem hebt geprogrammeerd :).

  • Bedankt FangorN.


    Het probleem blijft inderdaad bestaan, echter zoek ik dan nog wel een manier om dit scheidingsteken te veranderen?
    Is er een manier om te zorgen dat het niet array('Beschrijving over de fiets', 'Autos') is maar array('Beschrijving over de fiets'- 'Autos'). Dat koppelteken kan dus net zo goed een ^ of dergelijke zijn.


    Het probleem is nu dat ik een heel groot stuk moet herschrijven, wil ik het laten werken.

  • Waarom slaag je je , niet op als een . ?


    Ik had het zelf daarnet ook geprobeerd, met de functie str_replace om de komma's eruit te halen.
    Het probleem is dan dat str_replace ook gelijk de komma's van de array mee pakt, ik moet een manier hebben om ze allemaal los te krijgen. Ik weet van te voren niet uit hoeveel 'chunks' een array bestaat btw.


    Als ik str_replace gebruik: string(10) "5.50.15.50" Terwijl het dit moet zijn: string(10) "5.50,15.50"

  • Maar als die data in een array zit is er toch geen probleem? Pas als je alles op één hoop gooit in een string heb je dit probleem pas?


    Als je een array implode met een komma als "lijm" dan kun je in die string uiteraard geen onderscheid meer maken tussen een komma die al in de invoer zat of die geintroduceerd werd door middel van de "lijm".


    Ik snap ook niet hoe je in eerste instantie dit punt bereikt? Laat eens wat code zien?


    NB: string > array doe je door middel van een explode(), array > string via implode(). In je oorspronkelijke bericht heb je het over $prijs (dat een array bevat?) die je vervolgens weer explode? Ik kan dit niet helemaal plaatsen eerlijk gezegd :/.

  • Sorry, ik zal proberen om duidelijk te zijn. Dit keer met wat meer code.


    maak_factuur.php: dit bestand heeft de form die ingevuld moet worden
    http://pastebin.com/rcwZ4M9r
    http://prntscr.com/9uoy6r : Print screen om het wat te verduidelijken. Druk je op de knop nieuwe rij, kopieert hij de laatste row van de tabel en leegt hij deze gelijk.


    invoice.handler.js: dit bestand krijgt de value van de form en stuurt deze door naar een PHP bestand
    http://pastebin.com/30vRKgkZ , hier gaat alles in feit goed.


    invoice.handler.php: Hier gaat het volgens mij dus de mist in.
    http://pastebin.com/pSUzgPst


    Bedankt voor het helpen Fangor. Ik hoop dat ik nu een stuk duidelijker ben ^^

  • Maar hoe weet je wat een komma moet zijn.
    Of ditr een element is van de array of van
    iik geef je '15,5,3' mee
    wat ios dit denk je?

    Precies :P Dat is nu volgens mij mijn probleem.


    Stel iemand voert als prijs in: 15 5 en 3. Dan is er helemaal geen probleem, de string/array wordt dan ('15','5','3').


    Maar stel dat iemand er 15,50 5 en 3 van. Dan blijft array hetzelfde: ('15,50','5','3') alleen omdat het dus gescheiden moet worden door een komma wordt 50 ook apart gepakt.

  • Ik had het zelf daarnet ook geprobeerd, met de functie str_replace om de komma's eruit te halen.
    Het probleem is dan dat str_replace ook gelijk de komma's van de array mee pakt, ik moet een manier hebben om ze allemaal los te krijgen. Ik weet van te voren niet uit hoeveel 'chunks' een array bestaat btw.


    Als ik str_replace gebruik: string(10) "5.50.15.50" Terwijl het dit moet zijn: string(10) "5.50,15.50"


    Hoezo gebruik je de waardes als een string als het een array is? Stuur de array door naar je PHP bestand en verwerk daar de array en niet een string.


    Waarom moeilijk doen met array naar string en weer andersom?

  • str_replace(); werkt ook op arrays.. ze worden floats en je kan er mee rekenen.

    PHP
    <?php
    $array = array('50,50', '5', '3');
    $postTotal = str_replace(',', '.', $array);
    var_dump($postTotal);

    Bedoel je dit?


    -------------------------------------------------------------------------------------------------------------------------------------------------------


    Je kan eventueel ook het veld totaal een read-only maken dat word opgeteld door js door aantal * prijs te doen. Zo kan je ook user input mistakes verkomen.


    Je kan dan met JS zorgen dat wanneer aantal/prijs word aangepast door de user door (or $('#id').on('change', function(){}); in jQuery te gebruiken) om het totaal opnieuw te berekenen wanneer een van de velden word bijgewerkt.

  • We redeneren een beetje in cirkels, of we zijn in ieder geval hetzelfde keer op keer aan het herhalen.


    Een ding wat je niet moet doen is voortborduren op een niet al te sterk ontwerp.


    Die invoice_handler.js lijkt mij nogal wollig. Kun je de data van het formulier niet in 1x serialize()n? Vervolgens zijn alle velden arrays (amountoff, job, priceoff, totaal - engels en nederlands door elkaar? meh). Ik weet niet wat het effect is van een trim op een array...


    Long story short: het enige wat je hoeft te doen is:
    - bij het weergeven van prijzen een komma te gebruiken
    - bij het rekenen een punt te gebruiken


    En dit moet op een transparante en nette manier gebeuren, voor de rest moet je nergens aankomen en niets wijzigen want alles zit al in de goede structuur. Als je daarmee gaat rommelen raak je ver van de plek af waar je wilt zijn.


    Wat ik zou doen is wellicht het volgende: wanneer iemand een getal intypt met een komma erin, zou ik deze direct omzetten naar een punt middels JavaScript.


    OF NOG SIMPELER: splits de euro's en de centen en maak dit duidelijk in je formulier, dan hoef je hier helemaal niet meer over na te denken.
    <inputveld voor euro's> , <inputveld voor centen>


    KLAAR!

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!