Controle bedrag
Een ingevuld formulier bevat ondermeer de waarde van een bedrag. De ingevulde waarde wil ik controleren, voordat er verdere actie wordt ondernomen. Het bedrag moet aan een aantal eisen voldoen:
- Het bedrag mag niet kleiner zijn dan 1 euro;
- Het bedrag mag niet groter zijn dan 10.000 euro;
- Er mogen zowel hele euro's als centen ingevuld worden. Maar natuurlijk niet meer dan twee getallen achter de komma.
Het bedrag moet uiteindelijk resulteren in een bedrag in centen. Dus:
- Wanneer er geen centen zijn ingevuld, moet het bedrag vermenigvuldigd worden met honderd.
- Wanneer er centen ingevuld zijn, moet het bedrag ook vermenigvuldigd worden met honderd.
Uiteindelijk wil ik als resultaat het bedrag in centen (vb: 995) en het bedrag in euro's, met de centen erbij (vb: 9,95).
Wie kan mij helpen?
Je kunt misschien beter die centen in een apart veld zetten, makkelijker met controleren.
Heb je al naar language.operators.comparison gekeken?
waarden met een onkeyup/onkeydown/onclick actie controleren met JavaScript is denk ik het handigst.
Ik zou het ook met 2 velden doen. 1 voor de hele euro's en 1 voor de centen.
Ik kan redelijk overweg met PHP, iets als language.operators.comparison is mij dan ook bekend. Hiermee kun je niet controleren of een ingevuld bedrag decimalen bevat?
Dat is eigenlijk de eerste stap die ik wil maken: bevat het bedrag decimalen? Vervolgens kan ik verder controleren. Juist deze stap is waar ik vast loop.
Werken met javascript onkeyup/onkeydown/onclick actie lijkt me niet interessant. De bedragen kunnen nogal variëren (tussen 1 en 10.000 euro). De bezoeker blijft dan klikken, of ik moet de werking ervan verkeerd begrijpen?
sander schreef op 04.05.2009 16:53:
Ik kan redelijk overweg met PHP, iets als language.operators.comparison is mij dan ook bekend. Hiermee kun je niet controleren of een ingevuld bedrag decimalen bevat?
Yeah, right. Als je effe had geklikt had je gezien dat het wat anders is...
sander schreef op 04.05.2009 16:53:
Dat is eigenlijk de eerste stap die ik wil maken: bevat het bedrag decimalen? Vervolgens kan ik verder controleren. Juist deze stap is waar ik vast loop.
Waarom wil je niet gewoon twee velden? Want nu heb je het probleem van, wat vind jij en wat vind de gebruiker dat een scheidteken is. Hoe maak je duidelijk aan de gebruiker dat je ook centen in mag voeren, gaat de gebruiker dan niet denken van dat getal moet ik in z'n geheel in centen invoeren?
sander schreef op 04.05.2009 16:53:
Werken met javascript onkeyup/onkeydown/onclick actie lijkt me niet interessant. De bedragen kunnen nogal variëren (tussen 1 en 10.000 euro). De bezoeker blijft dan klikken, of ik moet de werking ervan verkeerd begrijpen?
Ja, je hebt de werking verkeerd gesnapt. Verder vind ik persoonlijk javascript oplossingen ook niet alles, omdat je dus de controle aan de client-side doet, dus kan de client die zo omzeilen.
Dat gaat niet met language.operators.comparison. Misschien moet Karl de uitleg ervan nog maar eens lezen: "Comparison operators, as their name implies, allow you to compare two values." Ik heb geen twee waarden, dus er valt niks te vergelijken?
De andere oplossingen (twee velden en werken met javascript) zijn in mijn ogen niet gebruiksvriendelijk genoeg. Je maakt tenslotte een website voor de bezoeker? Dan moet het zo gebruiksvriendelijk mogelijk zijn!
Concreet is mijn vraag dan ook: hoe controleer je of een waarde decimalen bevat?
sander schreef op 04.05.2009 19:14:
Dat gaat niet met language.operators.comparison. Misschien moet Karl de uitleg ervan nog maar eens lezen: "Comparison operators, as their name implies, allow you to compare two values." Ik heb geen twee waarden, dus er valt niks te vergelijken?
sander schreef op 04.05.2009 16:36:
- Het bedrag mag niet kleiner zijn dan 1 euro;
- Het bedrag mag niet groter zijn dan 10.000 euro;
- Het bedrag mag niet groter zijn dan 10.000 euro;
De rest, tja, dan moet je denk ik maar gebruik maken van string functie's als strpos enzo.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if(!is_numeric($_POST['Bedrag']))
{
// foutmelding
}
else
{
$Bedrag = $_POST['Bedrag'];
// Bedrag zonder punten en komma's
$Bedrag_zonder_puntkomma = str_replace(array(',','.','-'),'',$Bedrag);
// Is het bedrag veranderd?
if($Bedrag_zonder_puntkomma == $Bedrag)
{
// Het bedrag is niet gewijzigd, er zaten geen punten en komma's in. Dus een bedrag in hele euro's.
$Bedrag_in_centen = $Bedrag * 100;
}
else
{
// Het bedrag is wel gewijzigd, er zaten punten en komma's in. Het bedrag is in centen.
$Bedrag_in_centen = $Bedrag_zonder_puntkomma;
}
}
{
// foutmelding
}
else
{
$Bedrag = $_POST['Bedrag'];
// Bedrag zonder punten en komma's
$Bedrag_zonder_puntkomma = str_replace(array(',','.','-'),'',$Bedrag);
// Is het bedrag veranderd?
if($Bedrag_zonder_puntkomma == $Bedrag)
{
// Het bedrag is niet gewijzigd, er zaten geen punten en komma's in. Dus een bedrag in hele euro's.
$Bedrag_in_centen = $Bedrag * 100;
}
else
{
// Het bedrag is wel gewijzigd, er zaten punten en komma's in. Het bedrag is in centen.
$Bedrag_in_centen = $Bedrag_zonder_puntkomma;
}
}
De waarde $Bedrag_in_centen wordt vervolgens verwerkt.
if(!is_numeric($_POST['Bedrag']))
Geeft een foutmelding wanneer er een bedrag met komma wordt ingevuld.
Ik heb deze vervangen door:
if (!preg_match('#\d+([,.]\d{2})?#', $_POST['Bedrag']))
Nu werkt het probleemloos.