Использование setlocale () не влияет на преобразование чисел в PHP - PullRequest
0 голосов
/ 26 января 2011

У меня есть следующий скрипт:

<?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";
?>

, который генерирует следующий вывод:

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

Самая последняя строка, которая читает 2 - я бы ожидал, что читать2,5 - и, насколько я вижу в документации PHP, это должно быть.
Если второй вызов setlocale опущен, то вывод localeconv() не соответствует датскому языку - по причинам, которыенепонятно для меня.

1 Ответ

1 голос
/ 27 января 2011

(float)"2,5" равно 2 (обратите внимание на запятую), тогда как (float)"2.5" равно 2,5.Причину можно прочитать в руководстве:

Если строка не содержит символов '.', 'E' или 'E' и числовое значение соответствует ограничениям целочисленного типа (как определено PHP_INT_MAX), строка будет оцениваться как целое число.Во всех остальных случаях он будет оцениваться как число с плавающей запятой.

На приведение типа не влияет setlocale().

...