fgetcsv 错误地解释数字
fgetcsv interpreting numbers incorrectly
我在读取包含 886468000000 等值的 csv 文件时遇到问题,它被解析为 8,86468E+11,这对我的应用来说是个大问题,因为我需要解析并保留原始数字表格.
我google翻遍了文档,一无所获,我也尝试在解析过程中将指数字符串表示重新键入为浮点数,但这也不起作用,它是returns 8,这显然是不正确的.
在使用 PHP 7.2.8 x86 和 x64 进行测试后,下面是我的观察结果。
8,86468E+11
被转换为 8
的原因是 PHP 在使用逗号而不是句点作为小数点分隔符时的类型转换行为。见下文:
echo (float) '8,86468E+11'; // 8 wrong
echo (float) 8,86468E+11; // 88646800000000000 still wrong but getting close
echo (float) '8.86468E+11'; // 886468000000 success!
echo (float) 8.86468E+11; // 886468000000 success!
您的主要问题是您的小数点分隔符是逗号而不是句点,因此要解决此问题,您需要使用 str_replace()
:
$my_num_from_csv = '8,86468E+11';
$my_num_from_csv = (float) str_replace( ',', '.', $my_num_from_csv );
echo $my_num_from_csv; //886468000000
我在读取包含 886468000000 等值的 csv 文件时遇到问题,它被解析为 8,86468E+11,这对我的应用来说是个大问题,因为我需要解析并保留原始数字表格.
我google翻遍了文档,一无所获,我也尝试在解析过程中将指数字符串表示重新键入为浮点数,但这也不起作用,它是returns 8,这显然是不正确的.
在使用 PHP 7.2.8 x86 和 x64 进行测试后,下面是我的观察结果。
8,86468E+11
被转换为 8
的原因是 PHP 在使用逗号而不是句点作为小数点分隔符时的类型转换行为。见下文:
echo (float) '8,86468E+11'; // 8 wrong
echo (float) 8,86468E+11; // 88646800000000000 still wrong but getting close
echo (float) '8.86468E+11'; // 886468000000 success!
echo (float) 8.86468E+11; // 886468000000 success!
您的主要问题是您的小数点分隔符是逗号而不是句点,因此要解决此问题,您需要使用 str_replace()
:
$my_num_from_csv = '8,86468E+11';
$my_num_from_csv = (float) str_replace( ',', '.', $my_num_from_csv );
echo $my_num_from_csv; //886468000000