Getallen, punt, komma, streepje
€ 8.627,89
€ 35,78
€ 12,-
Allemaal verschillende manieren om een bedrag te schrijven. Maar nou is het zo dat mijn DB alleen getallen herkent zonder het duizendsplits teken (punt), met een punt voor decimalen. Ik heb de volgende manier bedacht maar ik vind het zo omslachtig kan het ook anders of is dit de juiste manier.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$prijs = str_replace('-', '00',str_replace(',', '.',str_replace('.', '','1.108.627,89')));
echo $prijs . '<br/>';
$prijs1 = str_replace('-', '00',str_replace(',', '.',str_replace('.', '','35,78')));
echo $prijs1 . '<br/>';
$prijs3 = str_replace('-', '00',str_replace(',', '.',str_replace('.', '','12,-')));
echo $prijs3 . '<br/>';
?>
$prijs = str_replace('-', '00',str_replace(',', '.',str_replace('.', '','1.108.627,89')));
echo $prijs . '<br/>';
$prijs1 = str_replace('-', '00',str_replace(',', '.',str_replace('.', '','35,78')));
echo $prijs1 . '<br/>';
$prijs3 = str_replace('-', '00',str_replace(',', '.',str_replace('.', '','12,-')));
echo $prijs3 . '<br/>';
?>
Gewijzigd op 27/08/2014 21:20:00 door Peter paul
met een kolom type INTEGER als centen. (6,75 wordt dan 675 in de database)
of
met een kolom type DECIMAL met een lengte ingesteld op 10,2. Dan kun je bedragen opslaan als 6.75
Vervolgens laat je die bedragen in PHP ongewijzigd, eventueel doe je enkel de centen delen door honderd om weer op euro's uit te komen. (je kunt dan namelijk nog rekenen met de getallen)
Pas als je de bedragen wilt tonen op het scherm dan ga je number_format() of money_format() gebruiken. Het resultaat van deze functies levert namelijk tekst op. En met tekst kun je niet meer rekenen. (bijvoorbeeld optellen van alle bedragen) En dus is de tekst enkel nog geschikt om het te tonen op de webpagina (of PDF of whatever).
Gewijzigd op 27/08/2014 22:52:43 door Ger van Steenderen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
/**
* Toon een getal: 8627.89
* als een bedrag: € 8.627,89
*/
// Het getal (kun je veranderen voor tests)
$getal = 8627.89;
// Het begin van het bedrag: euroteken en vaste spatie
$bedrag = '€ ';
// De rest van het getal toevoegen aan het bedrag
if ($getal == round($getal)) {
$bedrag .= number_format($getal, 0, ',', '.') . ',-';
} else {
$bedrag .= number_format($getal, 2, ',', '.');
}
// Testdump
echo $bedrag;
?>
/**
* Toon een getal: 8627.89
* als een bedrag: € 8.627,89
*/
// Het getal (kun je veranderen voor tests)
$getal = 8627.89;
// Het begin van het bedrag: euroteken en vaste spatie
$bedrag = '€ ';
// De rest van het getal toevoegen aan het bedrag
if ($getal == round($getal)) {
$bedrag .= number_format($getal, 0, ',', '.') . ',-';
} else {
$bedrag .= number_format($getal, 2, ',', '.');
}
// Testdump
echo $bedrag;
?>
Vervolgens even een functie maken van wat Ward heeft gemaakt en je dient alleen maar de functie aan te roepen en een getal er in te gooien.
Frank Nietbelangrijk op 27/08/2014 22:22:19:
of
met een kolom type DECIMAL met een lengte ingesteld op 10,2. Dan kun je bedragen opslaan als 6.75
met een kolom type DECIMAL met een lengte ingesteld op 10,2. Dan kun je bedragen opslaan als 6.75
Even uitgelegd: de 10 staat voor het maximaal aantal karakters, de 2 voor getallen na de komma. 3 zal dus resulteren in 0,000
Met 10,2 mag je 8 voor de komma, en 2 na de komma: 12345678.12
Met 5,3 mag je 8 voor de komma, en 2 na de komma: 12.123
Donny Wie weet op 28/08/2014 11:35:15:
Met 5,3 mag je 8 voor de komma, en 2 na de komma: 12.123
2 voor en 3 na de komma.
Als je de sql tabel zet op varchar dan kan wel het bedrag met punt en komma's worden opgeslagen.
Daan Daan op 28/08/2014 19:24:59:
Als je de sql tabel zet op varchar dan kan wel het bedrag met punt en komma's worden opgeslagen.
Dat moet je echt niet willen!
Frank Nietbelangrijk op 28/08/2014 20:32:47:
Dat moet je echt niet willen!
Daan Daan op 28/08/2014 19:24:59:
Als je de sql tabel zet op varchar dan kan wel het bedrag met punt en komma's worden opgeslagen.
Dat moet je echt niet willen!
Waarom niet??
Bijvoorbeeld: het totaal van deze maand:
Als je daar dan "omdat het zo gemakkelijk is bij het weergeven" een komma in duwt, dat gaat dat niet meer en moet je eerst alle records ophalen, de komma vervangen door een punt en dan nog eens optellen.
Daarbij is 95 ineens groter dan 112 in een varchar: immers de "9" is alfabetisch groter dan de 1, net als dat "ie" groter is dan "aab"
Probeer maar eens een SUM() te doen op een varchar-kolom... ;-)
Dat iets werkt betekent niet dat dit ook goed is. Een veel gemaakte fout :)
Dus dan moet je gwn de punt verwijderen en de komma veranderen door een punt dan kan je er wel mee rekenen rn dan met nummer format er weer een getal van maken
* de spatie vervangen door een punt
* "twaalf" vervangen door 12
* "vijfennegentig" vervangen door 95.
Werkt ook....
Maar waarom zou je getallen als tekst opslaan? Alleen omdat je dan in php niet meer number_format() hoeft te gebruiken bij het weergeven?
Er zijn voor databases in die 40 jaar dat daaraan ontwikkeld wordt niet voor niets kolommen van allerlei typen bedacht.
Ja, je kúnt alles opslaan in een tekst-kolom. als hij breed genoeg is, krijg je er ook nog wel een jpeg in.
Maar elk type heeft zijn optimalistatie voor een bepaald doel:
* int
* decimal voor exacte gebroken getallen (geld)
* float
* date
* datetime
* point
etc
Toevoeging op 29/08/2014 11:26:17:
Quote:
an met nummer format er weer een getal van maken
dat zie ik nu pas staan.
NEE!
Voor computers is 12,95 geen getal. Getallen worden in 99% van de gevallen -en in elk geval voor php en SQL genoteerd als 12.95
Net als in de Engelstalige wereld gebruikelijk is.
In Spanje heb ik bedragen genoteerd zien worden als € 12'95
Kan ook maar ook daar kan een computer niet mee rekenen.
32 bits integer:
Signed: van 2,147,483,648 tot 2,147,483,647
Unsigned: van 0 tot 4,294,967,295
deze toch wel grote getallen passen dus in slechts 4 bytes.
In een varchar is dit 10 bytes en dan tel ik een eventueel minteken of andere leestekens nog niet eens mee. 2.5 keer zoveel dus :-)
Gewijzigd op 29/08/2014 12:39:02 door Frank Nietbelangrijk