У меня есть следующий скрипт:
<?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()
не согласуется с датской локалью – по причинам, которые мне неясны.
(float)"2,5"
равно 2 (обратите внимание на запятую), тогда как (float)"2.5"
равно 2,5. Причина может быть прочитана в руководстве:
Если строка не содержит символов «.», «E» или «E», а числовое значение вписывается в ограничения типа целочисленного типа (как определено PHP_INT_MAX), строка будет оцениваться как целое число. Во всех остальных случаях он будет оцениваться как плавающий.
setlocale()
не влияет на тип литья.