2011-01-26 3 views
0

je le script suivant:En utilisant setlocale() ne modifie pas le numéro phps conversions

<?php 
$test = "2.5"; 
echo (float)$test; 
echo "\n"; 

$r = setlocale(LC_ALL, "da_DK.UTF8"); 
setlocale(LC_ALL, NULL); 
print_r(localeconv()); 
echo "\n"; 
echo (float)$test; 
echo "\n"; 
echo (float)"2,5"; 
echo "\n"; 
?> 

qui génère la sortie suivante:

2.5 
Array 
(
    [decimal_point] => , 
    [thousands_sep] => . 
    [int_curr_symbol] => DKK 
    [currency_symbol] => kr 
    [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] => 2 
    [n_cs_precedes] => 1 
    [n_sep_by_space] => 2 
    [p_sign_posn] => 4 
    [n_sign_posn] => 4 
    [grouping] => Array 
     (
      [0] => 3 
      [1] => 3 
     ) 

    [mon_grouping] => Array 
     (
      [0] => 3 
      [1] => 3 
     ) 

) 

2,5 
2 

La dernière ligne qui se lit 2 - Je voudrais Je m'attendais à lire 2,5 - et autant que je peux voir sur la documentation PHP, il devrait.
Si le deuxième appel à setlocale est omis alors la sortie de localeconv() est incohérente avec la locale danois - pour des raisons qui ne sont pas claires pour moi.

Répondre

1

(float)"2,5" est égal à 2 (notez la virgule) tandis que (float)"2.5" est égal à 2,5. La raison peut être lue dans le manuel:

Si la chaîne ne contient aucun des caractères '.', 'E' ou 'E' et que la valeur numérique correspond à des limites de type entier (telles que définies par PHP_INT_MAX), la chaîne sera évaluée comme un entier. Dans tous les autres cas, il sera évalué comme un flotteur.

La coulée de type n'est pas affectée par setlocale().

+0

malheureusement typecasting _is_ affecté par setlocale: echo (setlocale (LC_ALL, array ('de_DE', 'deu_deu'))); $ p = 3,1412592; var_dump ($ p); var_dump ((chaîne) $ p); var_dump ((float) (chaîne) $ p); – andig

Questions connexes