Validering / kontrol af beløb

Tags:    php

Hejsa.

Jeg har rodet med det et stykke tid, og nu vil jeg lige hører om der er nogen der ligger inde med en god ide.

Jeg har nogen bruger indtastet beløb.
fx. 1000,00 eller 1.000,00

Jeg vil gerne have lave om i beløbet efter brugeren har indtastet det så det kan bruger til beregninger i php. Det er ikke så svært lige at fjerne . og ændre , til . men problemet opstår hvis brugeren taster det 1,000.00 som man gør med nogen valuta.

Er der nogen der har en ide til hvordan jeg skal håndtere det?

Der kan også være længere beløb som 1.000.000,00



8 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Jeg ved ikke om der er en smartere måde.
men jeg har fiflet lidt med det og jeg tror denne her er rimelig skudsikker.

Fold kodeboks ind/udPHP kode 


Dette kan dog godt give problemer hvis man bruger samme delimiter til tusind som man gør til decimaler en anden måde kunne være at sætte en bolsk værdi hvis substr($val,-3,1) er . eller , (der eksistere decimaler) og herefter så slette alle forekomster af , og . og herefter dividere med 100 hvis der var decimaler.



Indlæg senest redigeret d. 08.10.2010 22:59 af Bruger #13429
Erstat alle kommaer med punktum. Det naturlig faktum vil herefter hver at første decimalpunktum er det gældende og det ved PHP godt. Hvis du ikke stoler på PHP kan du bruge noget preg_match til at validere:
Fold kodeboks ind/udKode 

eller
Fold kodeboks ind/udKode 


Begge næsten lige gode metoder.



Indlæg senest redigeret d. 08.10.2010 22:59 af Bruger #10216
Erstat alle kommaer med punktum. Det naturlig faktum vil herefter hver at første decimalpunktum er det gældende og det ved PHP godt. Hvis du ikke stoler på PHP kan du bruge noget preg_match til at validere:
Fold kodeboks ind/udKode 

eller
Fold kodeboks ind/udKode 


Begge næsten lige gode metoder.


Mener du det først punktum bagfra, altså det sidste? Hvis jeg erstatter kommaet i 1,000.00 med et punktum, så vil der stå 1.000.00 og hvis php så bruger det første punktum som decimal så står der altså 1kr hvor der skulle have stået 1000kr?



Jeg ved ikke om der er en smartere måde.
men jeg har fiflet lidt med det og jeg tror denne her er rimelig skudsikker.

Fold kodeboks ind/udPHP kode 


Dette kan dog godt give problemer hvis man bruger samme delimiter til tusind som man gør til decimaler en anden måde kunne være at sætte en bolsk værdi hvis substr($val,-3,1) er . eller , (der eksistere decimaler) og herefter så slette alle forekomster af , og . og herefter dividere med 100 hvis der var decimaler.


Det var da egentlig interessant bare at fjerne begge dele og så dividere tallet med 100. Det gør det meget nemt og lige til. men man kunne vel egentlig godt forstille sig at nogen valutaer regner med 3 dicimaler, og så er jeg sku på den :)



Du kan også vælge at følge denne metode:
find det første ikke tal karakter i din streng startende fra højre og læser mod venstre.
Tjekke om dette tegn (hvis det findes) eksistere mere end en gang. Hvis det gør er det ikke en decimal delimiter. Hvis kan du fjerne alt andet og så indsætte tegnet på sin position igen.



Du kan også vælge at følge denne metode:
find det første ikke tal karakter i din streng startende fra højre og læser mod venstre.
Tjekke om dette tegn (hvis det findes) eksistere mere end en gang. Hvis det gør er det ikke en decimal delimiter. Hvis kan du fjerne alt andet og så indsætte tegnet på sin position igen.


Hvad så hvis brugeren skriver 1.000kr ?
eller 1.000,00 så er der kun 1 af hver.

Den er tricky, det er derfor jeg har lagt den ud til folket ;)



Jamen du er nød til at antage noget.
Hvis en bruger skriver 1.000kr ved du ikke om han taler om 1 kr eller 1000 kr da det kunne være han skriver sine penge med 3 decimaler?

Hvis du dog vil holde på at hvis de er et sufix som f.eks: 'kr' og så brugeren kun må skrive med 2 decimaler kan du søge efter det først.



Første decimal tegn læses altid fra højre mod venstre. Det sidste tegn findes i venstre side og første findes i højre side.

Men filter_var() vil nok være den fortrukne løsning.



t