1.700.00 opslaan en weergeven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Mohamed nvt

Mohamed nvt

29/09/2017 21:43:29
Quote Anchor link
Hallo allemaal,

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<td>' . number_format($row['purchaseprice'], 3, '.','.') .'</td>

En de output is: 1.700, maar ik wil juist het volledig bedrag laten zien.

Iemand een idee?
 
PHP hulp

PHP hulp

22/12/2024 13:25:21
 
Ben van Velzen

Ben van Velzen

29/09/2017 22:25:36
Quote Anchor link
Float is geen geschikt datatype. Gebruik decimal met de benodigde precisie. Ook is het handig om verschillende scheidingstekens te gebruiken en niet alleen maar ".".
 
Frank Nietbelangrijk

Frank Nietbelangrijk

30/09/2017 13:41:57
Quote Anchor link
Misschien helpt wat 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
 
Ward van der Put
Moderator

Ward van der Put

30/09/2017 14:56:04
Quote Anchor link
Er zijn ook enkele valuta die 3 decimalen gebruiken.

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.
 
Mohamed nvt

Mohamed nvt

30/09/2017 15:50:56
Quote Anchor link
Hallo allemaal,

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.
 
Ward van der Put
Moderator

Ward van der Put

30/09/2017 17:50:10
Quote Anchor link
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).
 
Mohamed nvt

Mohamed nvt

30/09/2017 19:52:27
Quote Anchor link
Hallo Ward van der Put,

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
 
Ward van der Put
Moderator

Ward van der Put

30/09/2017 20:26:51
Quote Anchor link
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.
Gewijzigd op 30/09/2017 20:35:14 door Ward van der Put
 
Mohamed nvt

Mohamed nvt

30/09/2017 20:34:11
Quote Anchor link
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?
 
Ozzie PHP

Ozzie PHP

30/09/2017 20:53:45
Quote Anchor link
Gewoon zonder punten opslaan.
 
Mohamed nvt

Mohamed nvt

30/09/2017 20:59:25
Quote Anchor link
Dat accepteer PHPMyAdmin niet.

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;
 
Ben van Velzen

Ben van Velzen

30/09/2017 21:00:10
Quote Anchor link
Zonder punten dus, zoals gezegd. Je query heeft wel punten.
 
Mohamed nvt

Mohamed nvt

30/09/2017 21:24:22
Quote Anchor link
Oh sorry, ik dacht zonder punten/nullen ;-)

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.
 
Ben van Velzen

Ben van Velzen

30/09/2017 21:39:14
Quote Anchor link
Hier hoef je niks aan te doen, gaat helemaal vanzelf. Vooral omdat je toch al number_format gebruikt.
 
Mohamed nvt

Mohamed nvt

01/10/2017 08:01:13
Quote Anchor link
Jah daar heb je wel gelijk in ;-)
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<td>' . number_format($row['purchaseprice'], 3, '.','.') .'</td>


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?
 
Rob Doemaarwat

Rob Doemaarwat

01/10/2017 10:00:05
Quote Anchor link
Ik krijg het idee dat je de boel hier loopt te trollen, maar nog even een samenvatting:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
number_format($row['purchaseprice'], 3, ',','.')

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
number_format(1700.25, 3, '$ ','.') . '/1000'; //1.700$ 250/1000

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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
rtrim(number_format(...),'0')

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$bedrag = rtrim(number_format(...),'0');
if(substr($bedrag,-1) == '.') $bedrag .= '-';

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
 
Mohamed nvt

Mohamed nvt

01/10/2017 14:04:51
Quote Anchor link
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.



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.
 
Ozzie PHP

Ozzie PHP

01/10/2017 15:16:57
Quote Anchor link
Misschien is het handig als je je even inleest hoe een functie werkt?

Jij schrijft:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
number_format($row['purchaseprice'], 3, '.','.')


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
number_format($row['purchaseprice'], 3, ',','.')


Die 3 geeft aan dat je 3 getallen achter de komma wil. Als je geen getallen achter de komma wil, wordt het:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
number_format($row['purchaseprice'], 0, ',','.')


Dit had je allemaal kunnen weten door even de documentatie te lezen.
Gewijzigd op 01/10/2017 15:23:16 door Ozzie PHP
 
Mohamed nvt

Mohamed nvt

01/10/2017 16:03:40
Quote Anchor link
Hallo 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?
 
Ozzie PHP

Ozzie PHP

01/10/2017 16:13:20
Quote Anchor link
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 str_replace ',00' vervangen door '' of door ',-'.
Gewijzigd op 01/10/2017 16:14:42 door Ozzie PHP
 
Mohamed nvt

Mohamed nvt

01/10/2017 20:19:19
Quote Anchor link
Hallo Ozzie,

Bedankt voor je tip. Ik zal even kijken
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.