[PHP/Linux] setlocale, decimal_point veranderd niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 20-09 15:55
we hebben hier op mijn stage laatst de webserver naar een andere distro verhuist, dit omdat de vorige server (Rethat 8 NL) niet al te best liep,we zijn dus nu naar een Slackware server verhuist (Slackware 9.1 EN).

nu heeft de webdeveloper hier veel gebruik heeft gemaakt van de functie
number_format()
het probleem is dat deze gebruik maakt van de lokale valuta/getal weergave, waardoor de afronding dus niet goed gaat
PHP:
1
2
3
4
5
6
7
8
9
// gaat niet goed
$baka = "12,34";
echo number_format($baka, 1, ',', '');
// uitkomst 12.0

// gaat goed
$baka = "12.34";
echo number_format($baka, 1, ',', '');
// uitkomst 12.3

zoals je ziet verwacht php dus een punt als decimaal teken, het probleem is dat de bron de gegevens met een , aanbied en dit ook niet te veranderen is.

oke .. geen probleem .. dan gebruiken we toch gewoon de functie
PHP:
1
setlocale(LC_ALL, "nl_NL");

het probleem is echter dat na het gebruik van deze functie nog steeds het decimaal teken op een . staat

code:
1
2
3
4
5
6
7
8
9
10
11
Array
(
    [decimal_point] => .
    [thousands_sep] => 
    [int_curr_symbol] => EUR 
    [currency_symbol] => EUR
    [mon_decimal_point] => ,
    [mon_thousands_sep] => .
    [positive_sign] => 
    *knip*
)


terwijl als ik in
/usr/share/i18n/locales/nl_NL kijk ik hier prima zie staan :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LC_MONETARY
int_curr_symbol           "<U0045><U0055><U0052><U0020>"
currency_symbol           "<U20AC>"
decimal_point             ","
mon_decimal_point         ","
mon_thousands_sep         "."
*knip*
END LC_MONETARY

LC_NUMERIC
decimal_point             ","
thousands_sep             ""
grouping                  0;0
END LC_NUMERIC


zie ik hier nu wat over het hoofd of is PHP gewoon aan het fucken

Acties:
  • 0 Henk 'm!

Verwijderd

ereg_replace() ???

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan sowieso preg_replace of nog beter: str_replace, die zijn veel sneller. Maar er was inderdaad iets met die punten, ik zal de doc er eens bij zoeken, moment.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

misschien rare vraag, maar hoe kan php nou zien dat $baka valuta is? Naar mijn idee geldt LC_MONETARY alleen voor valuta, maar dan moet php wel weten dat $baka valuta is.

edit:
en waarom het getal als string tussen " " en niet gewoon $baka=12.34?

[ Voor 20% gewijzigd door Verwijderd op 08-06-2004 12:08 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 08 juni 2004 @ 12:07:
misschien rare vraag, maar hoe kan php nou zien dat $baka valuta is? Naar mijn idee geldt LC_MONETARY alleen voor valuta, maar dan moet php wel weten dat $baka valuta is.
Onder LC_NUMERIC staat ook dat de seperator een komma moet zijn dus dat zal geen prob zijn. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 08 juni 2004 @ 12:09:
[...]

Onder LC_NUMERIC staat ook dat de seperator een komma moet zijn dus dat zal geen prob zijn. ;)
Maar hij heeft het getal tussen "" staan, dus is het geen numerieke waarde toch?

edit:
$baka=12.34;
set_locale(blabla);
$baka=strval($baka);

volgens php.net gaat bovenstaande wel goed

[ Voor 19% gewijzigd door Verwijderd op 08-06-2004 12:14 ]


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

number_format maakt niet gebruik van de instellingen van setlocale

http://nl2.php.net/setlocale

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 20-09 15:55
als ik de webdeveloper qoute : " jullie zoeken maar een oplossing want het is veel te veel werks om alles eerst door een preg_replace te halen"

dat was inderdaad de eerste sugstie die ik aan die gast gaf
Verwijderd schreef op 08 juni 2004 @ 12:11:
[...]

Maar hij heeft het getal tussen "" staan, dus is het geen numerieke waarde toch?

edit:
$baka=12.34;
set_locale(blabla);
$baka=strval($baka);

volgens php.net gaat bovenstaande wel goed
het probleem is juist dat de data met een , aangeleverd word, en als je die niet tussen " zet krijg je een parse error

[Tue Jun 8 12:18:51 2004] [error] PHP Parse error: parse error, unexpected ',' in /var/www/excyle/test.php on line 17

[ Voor 59% gewijzigd door eXcyle op 08-06-2004 12:21 ]


Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 20-09 15:55
*dubbel*

[ Voor 98% gewijzigd door eXcyle op 08-06-2004 12:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

ik even een en ander gelezen en kwam erachter dat je eerst je waarde moet inlezen ($baka), vervolgens setlocale() moet doen, waarde ($baka) converteren naar string, en dan gaat het verder als het goed is wel goed. Dan wel gewoon echo $baka (dus zonder number_format()).

edit:
dat gaat dus niet op als hij met een komma wordt aangeboden :)

edit2:
waar komt dat $baka eigenlijk vandaan (database, formulier, etc). Ik denk dan dat je het daar al moet aanpassen zodat je op andere pagina's nergens meer last van hebt met die komma (omdat het dan geen string hoeft te zijn). Dus eigenlijk moet hij met een punt in de database en met setlocale() kun je hem wel met komma's afdrukken, als je dat wilt.

[ Voor 47% gewijzigd door Verwijderd op 08-06-2004 12:26 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Setlocale is bedoeld om het weergeven van een variabele goed te regelen, niet om intern met die komma's te kunnen werken. Ik denk dat je dus idd moet replacen:

PHP:
1
$baka = str_replace($baka, ",", ".");

Voilà... :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 08 juni 2004 @ 12:30:
Setlocale is bedoeld om het weergeven van een variabele goed te regelen, niet om intern met die komma's te kunnen werken. Ik denk dat je dus idd moet replacen:

PHP:
1
$baka = str_replace($baka, ",", ".");

Voilà... :?
eXcyle schreef op 08 juni 2004 @ 12:16:
als ik de webdeveloper qoute : " jullie zoeken maar een oplossing want het is veel te veel werks om alles eerst door een preg_replace te halen"

dat was inderdaad de eerste sugstie die ik aan die gast gaf

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Er moet sowieso een oplossing komen in de code, en dan lijkt die str_replace me toch echt de kortste en simpelste oplossing.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

NMe84 schreef op 08 juni 2004 @ 12:47:
Er moet sowieso een oplossing komen in de code, en dan lijkt die str_replace me toch echt de kortste en simpelste oplossing.
Mij eigenlijk ook, maar dan moet TS er wel voor zorgen dat hij dit op de juiste pagina toepast. Voorbeeld:

- je hebt een pagina met een formulier waar je een waarde (met een komma) invoert
- de gegevens van het formulier komen in een database
- de gegevens uit de database worden op 500 pagina's afgedrukt met number_format

Waar zet je dan str_replace? VOOR het invoegen in de database dus :) Kun je op de pagina's waar het wordt afgedrukt gewoon number_format() gebruiken en doen wat je er mee wilt (afronden, anders tonen etc).

Maar dit was dus maar een voorbeeld, misschien zijn er wel 500 invoegformulieren en 1 pagina waar alles wordt afgedrukt, maar dat moet TS dan maar zeggen :)

Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 20-09 15:55
het vage is dat het op de nederlandse rethat server wel altijd gewerkt heeft

en als ik de webdever hier mag geloven is het geen optie om alles door een str_replace te halen, vandaar dat ik het in die setlocal zocht.

(en dat met die $baka was alleen een voorbeeld, het gaat namelijk om een array met cijfers (tis op een school))

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

eXcyle schreef op 08 juni 2004 @ 13:07:
het vage is dat het op de nederlandse rethat server wel altijd gewerkt heeft

en als ik de webdever hier mag geloven is het geen optie om alles door een str_replace te halen, vandaar dat ik het in die setlocal zocht.

(en dat met die $baka was alleen een voorbeeld, het gaat namelijk om een array met cijfers (tis op een school))
Je zult sowieso je code aan moeten passen, dus wat maakt het uit als je simpelweg een str_replace erin zet? Setlocale is sowieso heel erg serverafhankelijk, omdat taalpakketten maar net geïnstalleerd moeten zijn en dergelijke.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 20-09 15:55
de taal pakketen zijn geinstaleerd, en als het aan mij lag was ik al lang de code in gedoken, echter is de webdeveloper hier van mening dat het een server probleem is, het altijd gewerkt heeft op de vorige server en hij zijn code dus niet aanraakt (gaat volgens hem ook om veel te veel script)
(nu tel ik zelf maar 2 php files, waar die functie instaat, maar goed)

't gaat mij er om dat het eigelijk altijd gewerkt heeft en pas na de overgang van een nederlandse distro naar een engelse ging het mis.

[ Voor 17% gewijzigd door eXcyle op 08-06-2004 13:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Sorry dat ik nu over windows begin hoor, maar daar kun je bij 'Regional and Language settings' ook van alles instellen over komma's en weet ik veel wat allemaal. Hoe staat het daar op server ingesteld (ik neem aan dat Linux ook zoiets heeft???????). Misschien dat hij dan de verkeerde instellingen pakt (dus de instellingen van Linux ipv de taalpakketten).

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 08 juni 2004 @ 13:29:
Sorry dat ik nu over windows begin hoor, maar daar kun je bij 'Regional and Language settings' ook van alles instellen over komma's en weet ik veel wat allemaal. Hoe staat het daar op server ingesteld (ik neem aan dat Linux ook zoiets heeft???????). Misschien dat hij dan de verkeerde instellingen pakt (dus de instellingen van Linux ipv de taalpakketten).
Linux != PHP

@TS: je zal toch de ontwerper moeten contacten. Ik vind het sowieso een zeer slechte instelling van hem dat hij zegt dat "het altijd gewerkt heeft" en het dus een fout van jullie moet zijn. Het is gewoon zo dat hij nogal afhankelijke code heeft geschreven die door 1 of 2 regeltjes toe te voegen verbeterd kan worden. Als ie daar te lui voor is dan is het zijn probleem, maar intussen is jouw opdrachtgever wel eigenaar van de code, dus kan hij de code laten aanpassen lijkt me zo.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Maar PHP gebruikt wel de instellingen van de server :)
Pagina: 1