Toon posts:

[php] number_format werkt niet correct

Pagina: 1
Acties:
  • 870 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een getal, dat afgekapt moet worden op 2 decimalen achter de komma.
Ik doe dit met number_format:
PHP:
1
<?$gegevens["Bedrag"] = number_format($bedrag,2);?>

Als ik dit echter echo in mijn html-pagina, dan krijg ik 1.00 te zien.
Het getal is echter: 1,547.00 (zo komt het uit de database)
Weet iemand een reden die dit zou kunnen veroorzaken???

Verwijderd

Die number_format() zal het allemaal wel naar beneden afronden. Ik zou zeggen, sla de manual er eens op na: http://www.php.net

Verwijderd

Topicstarter
Dank je voor de tip, maar dat had ik al gedaan.
Ik denk op dit moment overigens dat het ook aan het volgende stukje code kan liggen:
PHP:
1
<?$bedragexcl = $bedrag / 1.19;$bedragexcl = round($bedragexcl,2);$bedragbtw = $bedrag - $bedragexcl;$bedragbtw = round($bedragbtw,2);?>

Hier worden de bedragen berekent.
Maar dit klopt toch ook allemaal??

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 10 april 2002 12:02 schreef Grote Vos het volgende:
Het getal is echter: 1,547.00 (zo komt het uit de database)
Dat is een string, geen getal... Een , mag helemaal niet in een getal voorkomen uiteraard...

Oftewel, gooi er es str_replace(',', '', $bedrag) overheen

Verwijderd

Topicstarter
Sorry, ik zie net dat ik mijn openingspost een typfoutje gemaakt heb. Het moet niet bedrag zijn, maar bedragexcl.

  • Grum
  • Registratie: Juni 2001
  • Niet online
Klopt perfect hoor. 1,547.00 is een string en een deze string word bij de cast 1 zoals 2,123,123 logischerwijs 2 zal worden. Als je die 1 door number_format haalt dan wordt er logischerwijs 1.00 van gemaakt.

De niet zo nette oplossing:
code:
1
$gegevens["Bedrag"] = number_format(str_replace(',','',$bedrag),2);

Verwijderd

Topicstarter
Bedankt, dat was inderdaad de fout.
Het werkt nu!!! :)
Thanks again

Verwijderd

Wat wil je nu precies dan?

1) Je haalt het getal 1,547.00 uit de database en doet daar een number_format mee
2) Je hebt het getal 1547.00 en maakt daar met number_format 1,547.00 van wat je in de database stopt. En als je dit dan weer ophaalt krijg je 1.00 te zien

Verwijderd

ok, laat maar, het is al opgelost begrijp ik

  • DAMAGE
  • Registratie: December 2001
  • Laatst online: 10-11 19:29

DAMAGE

a.k.a. Rice_NL

Heel erg oud topic dit, maar ik zit dus met het precies de zelfde probleem. Ze hebben het dus niet nodig gevonden om het in al die jaren tijd op te lossen. Ik gebruik dit nu ook voor onze webshop, maar het gaat niet goed. Zelfs de work around die hier staat werkt niet. Ik heb nu van alles geprobeerd, maar bijvoorbeeld round alleen geeft bij mij geen goed resultaat.

Als je dit bedrag hebt: 39,95 dan zet hij het er keurig neer (wel met punt ipv comma dat is minder..) maar als je bijvoorbeeld 90,00 hebt dan zet hij er alleen 90 neer en dit tot mijn frustratie.

Heeft iemand inmiddels al een oplossing gevonden voor dit probleem? Ik vind het heel erg vervelend.

Even voor de duidelijkheid ik praat hier over het probleem dat number_format niet goed afrond. Het klopt niet. Dit is een bug... Ik dacht dat ik in het andere topic hier over aan het reply-en was, zie nu dat ik fout zit... Anyway ik moet nog even door met werk. Kijk hier morgen wel weer even.

[ Voor 18% gewijzigd door DAMAGE op 03-09-2008 17:18 ]

Lian Li O11 Dynamic EVO | Corsair HX1500i | Intel i9 13900K | ASUS Maximus HERO Z790 | 32GB GSkill Trident Z5 7200 DDR5 | Samsung 980 Pro 2TB | RTX 4080 | Simucube 2 Pro wheel


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je doet toch echt wat anders fout denk ik. De volgende test.php
PHP:
1
2
3
echo number_format( 90, 2, ",", "." );
echo "<br />";
echo number_format( 90, 2 );

geeft als output
code:
1
2
90,00
90.00

Waarschijnlijk converteer je het later alsnog weer naar een getal ( door er iets bij op te tellen? ) en als je het dan print dan vallen de 0'en natuurlijk wel weg.

[ Voor 27% gewijzigd door Woy op 03-09-2008 19:44 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • DAMAGE
  • Registratie: December 2001
  • Laatst online: 10-11 19:29

DAMAGE

a.k.a. Rice_NL

Met number format doet hij de nullen wel tonen, echter met Round niet.

Maar number_format rond niet goed af. Hij rond een bedrag van 39,95 af naar 39 euro, iets wat natuurlijk niet kan. Dit is overigens een bug in PHP zelf las ik. De processor gaat er niet goed mee om, vandaar de crappy berekening.

Hier zoek ik een oplossing voor. Ik ben zelf ook nog druk opzoek naar iets, dus als ik meer weet zal ik het posten. Als jullie nog tips hebben hoor ik deze graag.

[ Voor 13% gewijzigd door DAMAGE op 04-09-2008 09:37 ]

Lian Li O11 Dynamic EVO | Corsair HX1500i | Intel i9 13900K | ASUS Maximus HERO Z790 | 32GB GSkill Trident Z5 7200 DDR5 | Samsung 980 Pro 2TB | RTX 4080 | Simucube 2 Pro wheel


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
number_format hoeft ook helemaal niet af te ronden... het format een number, niet meer niet minder... je moet wel de functie gebruiken waar hij voor bedoeld is...

Verwijderd

Je kan ook eens kijken naar money_format voordat je dus number_format gebruikt:
http://nl3.php.net/manual/en/function.money-format.php

  • DAMAGE
  • Registratie: December 2001
  • Laatst online: 10-11 19:29

DAMAGE

a.k.a. Rice_NL

Het format een nummer. Precies!Maar dan moet het ook niet een nummer gaan veranderen. Ik wil het juist formatten, maar ik wil niet dat de functie mijn bedrag ongevraagd gaat aanpassen.

Dus als een product 39,95 kost, maakt hij er mooi 39,00 van. Daar heb ik toch niet om gevraagd? Wie kan mij vertellen welke functie het bedrag wel goed format dan, zonder ongevraagde aanpassingen en welke niet de nullen weg haalt bij 39,00?

Money format is niet wat ik zoek, aangezien deze er allemaal dingen bij zet die ik er niet bij wil hebben (Bijvoorbeeld van 39,95 maakt hij: EUR 39,95 of hij maakt van de comma een punt. Ik heb wel gekeken hoe ik er voor kan zorgen dat hij EUR niet laat zien, dit lukte ook, maar dan maakte hij van de punt weer een comma... Het deed niet wat ik wilde.)

[ Voor 29% gewijzigd door DAMAGE op 04-09-2008 10:00 ]

Lian Li O11 Dynamic EVO | Corsair HX1500i | Intel i9 13900K | ASUS Maximus HERO Z790 | 32GB GSkill Trident Z5 7200 DDR5 | Samsung 980 Pro 2TB | RTX 4080 | Simucube 2 Pro wheel


  • pedorus
  • Registratie: Januari 2008
  • Niet online
DAMAGE schreef op donderdag 04 september 2008 @ 09:36:
Met number format doet hij de nullen wel tonen, echter met Round niet.
Gelukkig maar dat round niets meer doet dan afronden...
Maar number_format rond niet goed af. Hij rond een bedrag van 39,95 af naar 39 euro, iets wat natuurlijk niet kan. Dit is overigens een bug in PHP zelf las ik. De processor gaat er niet goed mee om, vandaar de crappy berekening.
Dit is niet waar?
PHP:
1
2
3
4
echo number_format(90.995,2,",",".")."\n";
echo number_format(90.994,2,",",".")."\n";
echo number_format(39.95,2,",",".")."\n";
echo number_format(39.95,0,",",".");

geeft als output:
code:
1
2
3
4
91,00
90,99
39,95
40

...

Wat jij doet is waarschijnlijk gelijk aan:
PHP:
1
echo number_format("39,95",2,",",".")."\n";

Wat wel 39,00 oplevert. Dus dan moet je gewoon de data goed aanleveren aan number_format.

[ Voor 11% gewijzigd door pedorus op 04-09-2008 10:07 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

Heb je al eens gekeken naar locales ??

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ik mag toch hopen dat je number_format inclusief de decimals parameter aanroept?
En anders kan het wel met de printf familie van functies, of 1 vd related funcs in de manual... :z

{signature}


  • DAMAGE
  • Registratie: December 2001
  • Laatst online: 10-11 19:29

DAMAGE

a.k.a. Rice_NL

Niet dat jullie denken dat ik een PHP noob ben ofzo :)

PHP:
1
$totaalbedrag = number_format($totaalbedrag,2,",","");


en dan doe ik verder op:

PHP:
1
echo $totaalbedrag;


Niks mis mee toch? Of kijk ik nu ergens over heen.

Het gekke is, ik heb de zelfde code in een los bestand gezet, en daarbij toont hij hem wel goed :S


EDIT: Zodra je 39,95 uit een variable haalt gaat het mis!

[ Voor 27% gewijzigd door DAMAGE op 04-09-2008 10:40 ]

Lian Li O11 Dynamic EVO | Corsair HX1500i | Intel i9 13900K | ASUS Maximus HERO Z790 | 32GB GSkill Trident Z5 7200 DDR5 | Samsung 980 Pro 2TB | RTX 4080 | Simucube 2 Pro wheel


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 16-11 14:26

Creepy

Tactical Espionage Splatterer

En wat voor type is $totaalbedrag? Weet je 100% zeker dat dat geen string is? Of als dat wel het geval is, het juiste teken (punt of komma) gebruikt?

[ Voor 31% gewijzigd door Creepy op 04-09-2008 10:46 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

DAMAGE schreef op donderdag 04 september 2008 @ 09:58:
Het format een nummer. Precies!Maar dan moet het ook niet een nummer gaan veranderen. Ik wil het juist formatten, maar ik wil niet dat de functie mijn bedrag ongevraagd gaat aanpassen.

Dus als een product 39,95 kost, maakt hij er mooi 39,00 van. Daar heb ik toch niet om gevraagd?
Wel grappig dat jullie PHP de schuld geven, terwijl je zelf het bedrag verkeerd aanvoert. Je moet niet 39,95 aanvoeren, maar 39.95. De Amerikanen gebruiken punten voor de decimalen en komma's voor de duizendtallen, precies andersom als bij ons dus. 39,95 bestaat niet.

  • DAMAGE
  • Registratie: December 2001
  • Laatst online: 10-11 19:29

DAMAGE

a.k.a. Rice_NL

Heel raar ik ben er al achter wat het is.

Als het bedrag 39,95 dus een comma bevat, dan gaat het fout. Als het een punt bevat, dus 39.95 dan gaat het goed. Dit komt denk ik omdat de functie number_format natuurlijk comma's gebruikt voor de verschillende flags die je kunt instellen.

Hoe gek is dat?

[edit]

Lol ik zie dat er boven mij ook al een reactie geplaatst is met dit zelfde antwoord. Toch blijf ik het raar vinden, want dan moet je eerst je bedrag naar de amerikaanse manier veranderen en dan weer terug veranderen. Als je de locale veranderd, zou dat dus niet moeten hoeven. Dus wel een fout van PHP, want dan zit die functionaliteit er nog niet in ;)

[ Voor 37% gewijzigd door DAMAGE op 04-09-2008 10:54 ]

Lian Li O11 Dynamic EVO | Corsair HX1500i | Intel i9 13900K | ASUS Maximus HERO Z790 | 32GB GSkill Trident Z5 7200 DDR5 | Samsung 980 Pro 2TB | RTX 4080 | Simucube 2 Pro wheel


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
niet gek...

of doe jij ook:
const $test = 12,4;

??

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:23

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zucht. Er is niets fout in PHP (althans, hieromtrent dan ;)). number_format() verwacht een getal, geen string. Jij voert 'm een string, die automatisch omgezet wordt naar een getal, waarbij er uiteraard geen rekening wordt gehouden met locale.
string number_format ( float $number , int $decimals , string $dec_point , string $thousands_sep )
Daar staat toch echt "float $number", en geen "string $number".

De enige fout die hier optreedt is die van jou omdat jij om een of andere vage reden schijnt te denken dat je de representatie van een bepaald getal weer moet gebruiken om het originele getal weer terug te krijgen, ipv het getal zelf op te slaan en alleen een representatie ervan te maken op het moment dat je het getal wilt weergeven.

[ Voor 16% gewijzigd door .oisyn op 04-09-2008 11:05 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
DAMAGE schreef op donderdag 04 september 2008 @ 10:52:
Lol ik zie dat er boven mij ook al een reactie geplaatst is met dit zelfde antwoord. Toch blijf ik het raar vinden, want dan moet je eerst je bedrag naar de amerikaanse manier veranderen en dan weer terug veranderen. Als je de locale veranderd, zou dat dus niet moeten hoeven. Dus wel een fout van PHP, want dan zit die functionaliteit er nog niet in ;)
Je moet ook niet met Strings willen rekenen. Je moet gewoon met Getallen rekenen.
edit:

Wat .oisyn dus zegt

[ Voor 3% gewijzigd door Woy op 04-09-2008 11:05 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • DAMAGE
  • Registratie: December 2001
  • Laatst online: 10-11 19:29

DAMAGE

a.k.a. Rice_NL

Persoonlijk sla ik alle getallen op met een punt ipv een comma. Maar ik werk hier met OSCommerce waar wel meer dingen in zitten waar ik geen zak van snap dat ze er in zitten. Alleen was het mij nooit opgevallen dat je dus niet comma's mag gebruiken, omdat ik ze dus zelf nooit heb gebruikt en nooit tegen dit aangelopen ben.

Lian Li O11 Dynamic EVO | Corsair HX1500i | Intel i9 13900K | ASUS Maximus HERO Z790 | 32GB GSkill Trident Z5 7200 DDR5 | Samsung 980 Pro 2TB | RTX 4080 | Simucube 2 Pro wheel


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Nogmaals, je moet getallen niet met punt of komma opslaan. Je moet ze als getal opslaan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1