1.700.00 opslaan en weergeven
Omdat het vorige topic over alles ging behalve de gestelde vraag, wil ik nu dezelfde vraag opnieuw stellen met meer informatie.
Om bovenstaand bedrag op te slaan, heb ik de type van betreffende kolom veranderd in float. En, om dit bedrag weer te geven in PHP gebruik ik nu de functie number_format().
Concreet gebruik ik nu de volgende code:
En de output is: 1.700, maar ik wil juist het volledig bedrag laten zien.
Iemand een idee?
Float is geen geschikt datatype. Gebruik decimal met de benodigde precisie. Ook is het handig om verschillende scheidingstekens te gebruiken en niet alleen maar ".".
taaladvies?
De enige juiste notatie voor bedragen in het Nederlands is dus punten tussen de duizendtallen en een komma voor de decimalen/eurocenten.
€ 1.250.000,50
Toevoeging op 30/09/2017 13:48:17:
Overigens kun je er voor kiezen om de bedragen zoals Ben zegt op te slaan met een decimal(10,2) in EURO'S maar je kunt de bedragen ook opslaan in een integer als EUROCENTEN. In dat geval sla je een bedrag van 1 euro op als 100 eurocent.
Beiden methoden zijn prima. De kneep zit hem echter bij het invoeren. Hoe zal en mag een gebruiker een getal invoeren in een form input? Je zult de invoer moeten valideren en waar nodig converteren naar een decimaal of een integer alvorens je het opslaat in de database.
Toevoeging op 30/09/2017 13:50:58:
Sommige branches gebruiken ook nog bedragen met meer dan twee decimalen. Kijk maar eens naar de tankstations. Daar zie je soms een prijs voor een liter benzine genoteerd met drie decimalen: 1,549
Misschien helpt wat De enige juiste notatie voor bedragen in het Nederlands is dus punten tussen de duizendtallen en een komma voor de decimalen/eurocenten.
€ 1.250.000,50
Toevoeging op 30/09/2017 13:48:17:
Overigens kun je er voor kiezen om de bedragen zoals Ben zegt op te slaan met een decimal(10,2) in EURO'S maar je kunt de bedragen ook opslaan in een integer als EUROCENTEN. In dat geval sla je een bedrag van 1 euro op als 100 eurocent.
Beiden methoden zijn prima. De kneep zit hem echter bij het invoeren. Hoe zal en mag een gebruiker een getal invoeren in een form input? Je zult de invoer moeten valideren en waar nodig converteren naar een decimaal of een integer alvorens je het opslaat in de database.
Toevoeging op 30/09/2017 13:50:58:
Sommige branches gebruiken ook nog bedragen met meer dan twee decimalen. Kijk maar eens naar de tankstations. Daar zie je soms een prijs voor een liter benzine genoteerd met drie decimalen: 1,549
En over valuta gesproken: die moeten erin als je niet met bijvoorbeeld alleen euro's wilt rekenen.
Verder is de juiste notatie van een geldbedrag afhankelijk van de taal van de gebruikersinterface, niet van de valuta.
Sorry, ik vergat te melden dat er geen Euro's zullen opgeslagen worden, maar enkel Amerikaanse Dollar en/of Irakese/Koerdische Dinar.
En het bovenstaande bedrag is juist een voorbeeld van het Irakese/Koerdische dinar.
Bijv 1.700.00 is 1.400 Dollar. Zoals je ziet, bevat het enkel punten en geen komma's.
Om Amerikaanse Dollars op te slaan, heb ik de volgende link gevonden:
https://rietta.com/blog/2012/03/03/best-data-types-for-currencymoney-in/ en hierin wordt uitgelegd dat ik type decimal moet gebruiken voor de tabel met waarde 13,2.
Is dit de juiste type en waarde om Amerikaanse dollars op te slaan?
En is het nodig om een bedrag af te ronden, sinds men hier werk met volledige bedragen. Er wordt dus niet gewerkt met centen.
En voor het Irakese/Koerdische dinar zijn het 6 nullen. Bijv 1000 dinar is misschien wel 0.20 cent waard en dus niets waard, maar daarin tegen een miljoen Dinar 1.000.000 is gelijk aan 800 Dollar.
Concreet is mijn vraag; moet ik het type decimal ook gebruiken voor het Irakese/Koerdische Dinar en hoe precies moet de waarde zijn? En is het nodig om een bedrag af te ronden?
Alvast bedankt voor het meedenken.
Gebruik DECIMAL(15,4) en voeg er een kolom aan toe voor de valuta (en maak daarvan een foreign key die verwijst naar een aparte tabel voor valuta).
Bedankt voor je feedback.
Ik heb de tabel type aangepast naar decimal 15,4, maar wanneer ik 1.700.00 invoer in PHPMyAdmin dan verschijnt de volgende foutmelding:
Note: #1265 Data truncated for purchaseprice column at row 1. En op het net wordt gezegd dat er niet genoeg ruimte is voor de waarde ik wil invoeren en daarom wordt de waarde kleiner/truncated gemaakt?
En de waarde is 1.7000
Wat doe ik hier verkeerd? Overigens, ik krijg precies dezelfde foutmelding, wanneer ik de tabel type veranderd naar double.
Btw, ik snap de logica niet waarom ik een aparte tabel moet aanmaken voor valuta. Ik vind het niet nodig, maar ben benieuwd naar je idee hierachter.
Momenteel heb ik een kolom voor valuta, maar aangezien ik ondersteuning moet bieden voor 2 verschillende valuta's, ben ik van plan een tweede kolom te maken voor andere valuta.
Toevoeging op 30/09/2017 20:23:31:
Update 1:
Het waarde van het kolom heb ik veranderd naar 15,6 en ik kan nu wel 9 digits opslaan, maar niet met de punt ertussen. PHPMyAdmin laat nu wel zien 1.700000
Mijn veronderstelling is dat het mogelijk moet zijn om het getal 1.700.000 op te slaan in MySQL of moet ik straks in PHP dit getal als 1.700.00 weer te geven? En als ik het straks optel, kloppen dan de berekeningen?
Gewijzigd op 30/09/2017 19:58:45 door Mohamed nvt
In de weergave, oftewel een view, kun je daarvan afwijken met allerlei andere punten, komma's en valutasymbolen. Zolang je maar rekent met getallen met slechts die ene punt.
Aangezien je bedragen in verschillende vulata wilt opslaan, moet je weten of 1700.00 nu dollars of dinars zijn. Dat sla je dus bij elk bedrag op
Als je streng normaliseert, gebruik je daarbij een aparte tabel voor de valuta. Daarin leg je bijvoorbeeld vast wat het juiste valutasymbool of de valuta-afkorting is. En daarin kun je ook vastleggen dat je dollars noteert met twee decimalen, maar dinars met drie decimalen.
Gewijzigd op 30/09/2017 20:35:14 door Ward van der Put
Hmm oke, maar hoe moet ik straks 1.700.250 op te slaan? En als ik dit bedrag wil straks optellen met 1.650.500?
Gewoon zonder punten opslaan.
Ik krijg de volgende foutmelding:
0 rows affected.
Note: #1265 Data truncated for column 'purchaseprice' at row 1
UPDATE `DB2681116`.`medicines` SET `purchaseprice` = '1.700.25' WHERE `medicines`.`id` = 130;
Zonder punten dus, zoals gezegd. Je query heeft wel punten.
Wanneer ik het zonder punten invul, dan krijg ik volgend resultaat:
1700250.000000
Het lijkt dus goed te gaan, maar nu krijg ik 6 nullen achter de punt.
Moet ik me zorgen om hier maken?
Hoef ik nu alleen maar goed weer te geven in PHP of moet ik het eerst in MySql doen met de functie format?
En als ik berekening wil doen met dit bedrag, betekent dat ik wat moet doen met het origineel bedrag of met het geformatteerde bedrag?
Hopelijk is mijn vraag duidelijk.
Hier hoef je niks aan te doen, gaat helemaal vanzelf. Vooral omdat je toch al number_format gebruikt.
Ik merk ook nu dat wanneer ik bijv 1700500 invul, dus zonder punten, dan wordt het weergeven als 100.700.500.000.
Zoals je ziet, is het dus bijna goed ;-)
Die laatste 3 nullen wil ik weg hebben, want anders klopt het bedrag niet.
En, ik gebruik number_format met de volgende specs
Mijn vraag is dus nu:
moet ik die extra 3 nullen weghalen:
1. Voordat het bedrag wordt opgeslagen in DB
2. Of nadat het bedrag opgeslagen is in de DB en dus met number_format functie achteraf?
Code (php)
1
UPDATE `DB2681116`.`medicines` SET `purchaseprice` = '1700.25' WHERE `medicines`.`id` = 130;
Hiermee zet je een prijs van 1700 Dinar en 25 Dinarcent (?) in de database (in een veld DECIMAL(15,4)). En let op: dus geen "leestekens" toevoegen tussen de duizendtallen, dat snapt een *database* niet; enkel een punt tussen de hele Dinars en de centen). In de database is dit gewoon een getal, dus die weet niet dat het om Dinars gaat, dat moet jij zelf onthouden. Als je de prijs in Dollars wilt tonen zul je 'm dus eerst om moeten rekenen (met een koers die je in een andere tabel opslaat - zie antwoord Ward). Als de prijzen over het algemeen in Dollars gaan zou ik dat als basis eenheid gebruiken, en omrekenen naar Dinars als daar om wordt gevraagd.
Hiermee toon je een getal op de manier zoals de *gebruiker* het graag ziet. Dit is de Nederlandse manier, met een komma tussen de hele getallen en de decimalen (centen), en een punt om de duizendtallen beter te kunnen onderscheiden (het bedrag hierboven wordt dan dus getoond als "1.700,25"). Nou begrijp ik dat Irakezen/Koerden voor beiden een punt gebruiken, maar dat geeft dus wel de verwarrende situaties die je hierboven zelf al aangeeft als je drie cijfers "achter de komma" toont. Misschien zou je dus zoiets kunnen doen:
Geen idee of dat duidelijker is, het geeft in ieder geval minder kans op verwarring.
Samenvatting:
- In de database sla je getallen dus altijd op zonder "opmaak", met een punt als decimaal scheider ("voor de centen"), en verder niks.
- Op het scherm kunt je het net zo mooi maken als je wilt, maar moet je er dus wel rekening mee houden dat de gebruiker het blijft snappen.
Voor je laatste vraag
Hiermee haal je de achterste nullen van je bedrag af. Bij "1.700.000" hou je dan "1.700." over. Met die punt op het eind zul je nog iets moeten. Ik zou 'm niet weg halen, anders wordt het weer verwarrend (is het nu 1700, of 1.7?). Dus misschien kun je iets doen als:
Een rond bedrag als 1700 (hele Dinars) wordt dan getoond als 1.700,- (zo gaat het in NL in ieder geval vaak bij ronde bedragen).
Gewijzigd op 01/10/2017 10:00:22 door Rob Doemaarwat
Ward van der Put op 30/09/2017 20:26:51:
Je moet bedragen met maar één punt gebruiken. Die punt heeft de functie van onze komma: voor de punt staan euro's, achter de punt volgen de centen.
In de weergave, oftewel een view, kun je daarvan afwijken met allerlei andere punten, komma's en valutasymbolen. Zolang je maar rekent met getallen met slechts die ene punt.
Aangezien je bedragen in verschillende vulata wilt opslaan, moet je weten of 1700.00 nu dollars of dinars zijn. Dat sla je dus bij elk bedrag op
Als je streng normaliseert, gebruik je daarbij een aparte tabel voor de valuta. Daarin leg je bijvoorbeeld vast wat het juiste valutasymbool of de valuta-afkorting is. En daarin kun je ook vastleggen dat je dollars noteert met twee decimalen, maar dinars met drie decimalen.
In de weergave, oftewel een view, kun je daarvan afwijken met allerlei andere punten, komma's en valutasymbolen. Zolang je maar rekent met getallen met slechts die ene punt.
Aangezien je bedragen in verschillende vulata wilt opslaan, moet je weten of 1700.00 nu dollars of dinars zijn. Dat sla je dus bij elk bedrag op
Als je streng normaliseert, gebruik je daarbij een aparte tabel voor de valuta. Daarin leg je bijvoorbeeld vast wat het juiste valutasymbool of de valuta-afkorting is. En daarin kun je ook vastleggen dat je dollars noteert met twee decimalen, maar dinars met drie decimalen.
Hallo Ward,
Volgens mij heb je je bericht bewerkt, nadat je had al had gereageerd, want ik zie nu pas je laatste wijziging en ik snap nu meer wat je bedoelt. Bedankt iig ;-)
Toevoeging op 01/10/2017 14:27:06:
Hallo Rob,
Geen idee hoe je erbij komt dat ik de boel hier probeer te trollen, want dat is niet mijn intentie en ook nooit geweest hoor.
Ik post hier een bericht, omdat ik een probleem heb en wil graag de feedback van anderen erover horen.
Over geen verwarring te veroorzaken; ik wil graag nogmaals aangeven dat ik zal werken met Dinars en met Dollars, maar absoluut geen Euro's. Dat gezegd te hebben.
Overigens, het is me nu duidelijk dat ik een punt moet gebruiken tussen de gehele getallen en centen. Dus zowel voor Dinars als voor Dollars. Mocht ik dit punt verkeerd hebben, begrepen,dan hoor ik dat graag. ;-)
En het 'probleem' waar ik nu tegen aanloop of eigenlijk geen probleem, want het ligt aan het bedrag:
Wanneer ik 20000 invoer, dan verschijnt het op de website 20.000.000. Dus zoals je ziet, die 3 nullen aan het einde zijn niet nodig, omdat het bedrag 20.000 oftewel twintigduizend is en geen twintig miljoen
Maar wanneer ik 2000.750 invul, dus twintigduizend + 750 cent, dan wordt het weergegeven als 20.000.750, dus twintigduizend + 750 cent. En, dit bedrag klopt wel.
Het lijkt erop dat ik die extra 3 nullen moet verwijderen, wanneer er geen getal achter de punt komt en moet laten staan er wel een getal komt achter de punt. Klopt mijn gedachte hier?
En volgens mij moet ik dit bepalen, voordat het bedrag in de DB opgeslagen worden?
Alvast bedankt voor het meedenken.
Jij schrijft:
Zoals je ziet gebruik je hetzelfde scheidingsteken voor duizendtallen en decimalen, namelijk in beide gevallen een punt.
>> Wanneer ik 20000 invoer, dan verschijnt het op de website 20.000.000.
Dat komt omdat die laatste punt in 20.000.000 eigenlijk een komma moet zijn.
Je moet dus dit doen:
Die 3 geeft aan dat je 3 getallen achter de komma wil. Als je geen getallen achter de komma wil, wordt het:
Dit had je allemaal kunnen weten door even de documentatie te lezen.
Gewijzigd op 01/10/2017 15:23:16 door Ozzie PHP
Daar heb je wel gelijk in, maar aanvankelijk wilde ik weten of ik op het juiste pad was met number_format en daarom had ik nog niet veel over gezocht. Iig bedankt.
En zoals ik boven aangaf, afhankelijk van het bedrag wil ik soms de getallen achter de nul hebben en soms helemaal geen getallen achter de nul.
Moet ik dit soms aanpakken met een if statement of is er een betere/makkelijkere manier om te controleren of er getallen zijn achter de punt?
str_replace ',00' vervangen door '' of door ',-'.
Lay-out technisch zou ik er in dat geval voor kiezen om gewoon altijd 2 getallen achter de komma te zetten. Als je xxx,00 lelijk vindt, dan kun je met Gewijzigd op 01/10/2017 16:14:42 door Ozzie PHP
Bedankt voor je tip. Ik zal even kijken