[PHP] float op server 1, wordt int op server 2*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Ik heb een develop- en een live-server. Beide draaien PHP 4.1.2

Ik geef met een formulier een getal door, bv 1.26

<FORM METHOD="post" ... >
<INPUT NAME=resizefactor TYPE=text VALUE="1.26">

Als ik dit op de volgende pagina bekijk;

PHP:
1
echo "resizefactor: " . $HTTP_POST_VARS["resizefactor"];


.. dan zie ik op beide servers:

resizefactor: 1.26

Echter, wil ik dit getal nu gebruiken voor een berekening, dan gaat het fout.

PHP:
1
echo "result: " . 100* $HTTP_POST_VARS["resizefactor"];


- dit geeft op de develop-server :

result: 126

en op de live-server:

result: 100

Ik heb toen het volgende er op losgelaten om erachter te komen waar dat 'm in zit:

PHP:
1
2
3
4
5
6
7
8
9
10
$rf = $HTTP_POST_VARS["resizefactor"];
echo("<UL>");
echo("<LI>resizefactor #1: " . number_format($rf, 2, '.', '')   );
echo("<LI>resizefactor #2: " . (double) $rf   );
echo("<LI>resizefactor #3: " . (float) $rf   );
echo("<LI>resizefactor #4: " . (real) $rf   );
echo("<LI>resizefactor #5: " . ($rf + 0)   );
echo("<LI>resizefactor #6: " . ($rf + 0.5)   );
echo("<LI>resizefactor #7: " . ($rf / 1.001)   );
echo("</UL>");


Dit geeft op de devlop-server het volgende:
code:
1
2
3
4
5
6
7
resizefactor #1: 1.26
resizefactor #2: 1.26
resizefactor #3: 1.26
resizefactor #4: 1.26
resizefactor #5: 1.26
resizefactor #6: 1.76
resizefactor #7: 1.2587412587413


en op de live-server:
code:
1
2
3
4
5
6
7
resizefactor #1: 1.00
resizefactor #2: 1
resizefactor #3: 1
resizefactor #4: 1
resizefactor #5: 1
resizefactor #6: 1,5
resizefactor #7: 0,999000999001


Wanneer ik er het volgende van maakte:
PHP:
1
$rf = str_replace(".", ",", $HTTP_POST_VARS["resizefactor"]);


.. dan ging het op de live-server wel goed (dwz je kreeg de cijfers die ik eerst alleen op de develop-server kreeg). Echter, hiermee kreeg de develop-server weer te maken met de 1.00-grappen: een omgekeerde situatie dus.

Ik vermoed dat het een of andere getal/taal-instelling is, maar ik weet niet waar ik naar moet kijken of wat ik moet veranderen in de server-configuratie. In phpinfo() zie ik wat dat betreft geen verschillen waarvan ik vermoed dat het daar in zou kunnen zitten.

Waar kan dit aan liggen, en hoe kan ik het verhelpen zodat ik met beide servers met dit getal berekeningen kan uitvoeren?

/edit - sorry, vergeten [PHP] in subject te zetten. Het draait op Apache 1.3.23 (develop) en 1.3.22 (live) trouwens.

[ Voor 11% gewijzigd door Anders op 27-08-2003 13:10 ]

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 04-08 16:29

Tim

Ik schat ook op de instellingen van die PC..
Misschien dat je hier wat mee kan:

http://nl.php.net/manual/en/function.setlocale.php
http://nl.php.net/manual/en/function.localeconv.php

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Kijk eens op live server wat de setting is van

>> precision

Default waarde is 14

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Thanks, dat leverde inderdaad iets op. Ik gebruikte al:

PHP:
1
2
/* Set locale to Dutch */
setlocale (LC_ALL, 'nl_NL');


.. ik heb nu het script uit de tweede pagina die je noemde, toegepast, en de live-server geeft daar het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--------------------------------------------
  Monetary information for current locale:  
--------------------------------------------

int_curr_symbol:   NLG 
currency_symbol:   fl
mon_decimal_point: ,
mon_thousands_sep:  
positive_sign:     
negative_sign:     -
int_frac_digits:   2
frac_digits:       2
p_cs_precedes:     1
p_sep_by_space:    1
n_cs_precedes:     1
n_sep_by_space:    1
p_sign_posn:       1
n_sign_posn:       2


.. terwijl de develop-server het volgende geeft:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--------------------------------------------
  Monetary information for current locale:  
--------------------------------------------

int_curr_symbol:   
currency_symbol:   
mon_decimal_point: 
mon_thousands_sep: 
positive_sign:     
negative_sign:     
int_frac_digits:   127
frac_digits:       127
p_cs_precedes:     127
p_sep_by_space:    127
n_cs_precedes:     127
n_sep_by_space:    127
p_sign_posn:       127
n_sign_posn:       127


De set_locale nl_NL kent ie op de develop-server dus niet. Kom ik nu pas achter... Anyway, bij en_US geven ze beide hetzelfde:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--------------------------------------------
  Monetary information for current locale:  
--------------------------------------------

int_curr_symbol:   USD 
currency_symbol:   $
mon_decimal_point: .
mon_thousands_sep: ,
positive_sign:     
negative_sign:     -
int_frac_digits:   2
frac_digits:       2
p_cs_precedes:     1
p_sep_by_space:    0
n_cs_precedes:     1
n_sep_by_space:    0
p_sign_posn:       1
n_sign_posn:       1


dus gebruik ik dat maar, en dan vis ik later wel uit hoe ik die nl_NL ook op de develop-server in kan voeren.

Thanks beide (precision was op beide servers 14). Modje ook bedankt voor veranderen topic-titel :)

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • terrapin
  • Registratie: Februari 2002
  • Niet online
Waarom niet casten naar float, dan voorkom je ook meteen exploits doordat iemand er bijvoorbeeld stiekem tekst in zet...
code:
1
2
3
<?php
$a = (float)$HTTP_GET_VARS["a"];
?>


edit:
dat had je dus al getest :)

[ Voor 24% gewijzigd door terrapin op 27-08-2003 14:42 ]

The higher that the monkey can climb, The more he shows his tail


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Thanks, dat leverde inderdaad iets op. Ik gebruikte al:

PHP:
1
2
/* Set locale to Dutch */ 
setlocale (LC_ALL, 'nl_NL');


.. ik heb nu het script uit de tweede pagina die je noemde, toegepast, en de live-server geeft daar het volgende:
De manier waarop je de setlocale aanspreekt is op elke server anders, ik bedoel op elk besturingssysteem.

Zo moet ik voor mijn Freebsd dit gebruiken:
PHP:
1
setlocale (LC_ALL, 'nl_NL.ISO8859-1');


Op de website van PHP bij setlocale staan ook nog voorbeelden voor andere systemen bij de user comments
Pagina: 1