Intereting Posts
Zend_JSON: Кодировать беспорядок – почему? Перенос PHP-рендеринга Handlebarsjs PHP microtime () дрейф, внешняя служба NTP Ресурс интерпретируется как документ, но передается с типом MIME text / css PHP – Заменить данные в многомерном массиве, конкретный ключ Изучение классов PHP, застрявших на __contruct (); Список всех файлов в каталоге, дополнительная информация идет cURL Html вывод отличается от исходной страницы при визуализации php + unixODBC + DB2 + DESCRIBE = токен недействителен? Как разрешить пользователям с необходимым разрешением загружать файл через php? Проблемы с отправкой SOAP-заголовка заголовков в php Неустранимая ошибка: использование $ this, если не в объектном контексте Приложение Yii, загруженное на хост, вызывает ошибку 404, когда я вызываю определенное действие Как читать тег <abc: xyz> xml с помощью php? Как найти самую большую общую подстроку между двумя строками в PHP?

Использование setlocale () не влияет на числовые преобразования PHP

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

<?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() не влияет на тип литья.