Hey,
Op mijn site gebruik ik 3 betaalmiddelen:
Galjoenen (1 Galjoen = 1 euro),
Sikkels (1 Sikkel = 50 cent) en
Knoeten (1 Knoet = 10 cent).
als iets 1 Galjoen, 3 Sikkels en 5 Knoeten kost,
en je hebt: 3 Galjoenen, 2 Sikkels en 5 Knoeten,
dan zou je dat product dus eigenlijk moeten kopen omdat je 2 Galjoenen teveel hebt.
Maar omdat je 1 Sikkel te weinig hebt kun je dit niet kopen!
Nu heb ik gehoord dat je dit probleem kunt oplossen met restdeling, maar ik kan hier nergens wat over vinden.. kan iemand me hier iets van uitleggen?
Ook in euro's heb je dat probleem.. je hebt bijv. 2 velden:
euro's
centen
stel je hebt: 2 euro en 50 cent
en iets kost: 1 euro en 60 cent
dan kijk je eerst of je genoeg euro's hebt: 2-1=1 euro over; je hebt dus genoeg euro's.
dan bereken je de centen:
je hebt 50 cent en het kost 60 cent: 50-60=-10; je hebt dus te weinig centen.
Je zal op mijn site nu de melding krijgen dat je te weinig geld hebt, die database die weet niet dat 2,50 meer is dan 1,60, die denkt dat je 10 cent te kort komt.
En dát is het probleem. en nu heb ik gehoord dat je dat met restdeling kunt oplossen. maar ik weet dus niet wat restdeling is :P
Ik denk dat het probleem in de database ligt. Waarom maak je niet gewoon 1 veld met het bedrag wat je totaal hebt. En dan kun je met de modulo operator wel gaan berekenen hoeveel je nu van elk muntstuk hebt.
Hoeveel je hebt van elk muntstuk, is alleen iets wat je zou moeten gebruiken voor het weergeven. Niet voor de berekeningen of je wel genoeg geld hebt.
Was me wat aan het vervelen, Het kan zijn dat het wat omslachtig is. Niet getest moet gaan voor een paar uurtjes. zijn meerdere functies. De $betalen en $beurs array's dienen als voorbeeld waarden.
<?php
#| Te betalen bedrag. // Galjoenen, Sikkels, Knoeten
$betalen = array(3, 2, 5);
#| Beurs. // Galjoenen, Sikkels, Knoeten
$beurs = array(5, 3, 4);
#| Functie voor het omzetten van een bedrag naar knoeten.
function bedrag_in_knoeten($bedrag){
return $bedrag[2] + ($bedrag[1] * 5) + ($bedrag[1] * 10);
}
#| Functie voor het terug converteren van een bedrag in knoeten.
function convert_back($bedrag){
#| Galjoenen.
$galjoenen = floor($bedrag / 10);
#| Sikkels.
$sikkels = floor(($bedrag - ($galjoenen * 10)) / 5);
#| Knoeten.
$knoeten = $bedrag - (($galjoenen * 10) + ($sikkels * 5));
#| Resultaat terug geven.
return array($galjoenen, $sikkels, $knoeten);
}
#| Functie voor het controleren of iemand genoeg geld heeft.
function geld_controle($beurs, $betalen){
return (bedrag_in_knoeten($beurs) >= bedrag_in_knoeten($betalen)) ? true : false ;
}
#| Functie voor het berekenen van de nieuwe inhoud van Uw beurs na de betaling.
/*---- LET OP! ---->
Eerst controleren of iemand genoeg geld heeft voordat deze functie wordt aangeroepen.
*/
function beurs_na_betaling($beurs, $betalen){
#| Resterend aantal knoeten berekenen.
$resterend = bedrag_in_knoeten($beurs) - bedrag_in_knoeten($betalen);
#| nieuwe beurs terug geven.
return convert_back($resterend);
}
?>
@Mark: inderdaad omslachtig. Veel eenvoudiger is het om, zoals Gerben al zegt, te werken met 1 waarde die het totale bedrag dat je bezit aangeeft. Op die manier is eenvoudig te controleren of je voldoende 'geld' hebt om een bepaald product te kopen. Voor de weergave kun je dat bedrag vervolgens vertalen naar Galjoenen, Sikkels en Knoeten...
@Blanche: Weet ik maar ik gok dat hij ze alle drie appart in de database heeft staan dus dan moet hij alles weer veranderen. Daarom voed ik de functies ook met array's. Met omslachtig bedoelde ik de manier waarop de functies in zijn werk gingen.