-4

I have a problem when I read csv files that contain values like 886468000000, it gets parsed as 8,86468E+11, which is a huge problem for my app, because I need to parse and retain the number in original form.

I google around the documentation and found nothing, I also tried retypging the exponential string representation as float during parsing , but that does not work either, it returns 8, which is obviously incorrect.

jww
  • 97,681
  • 90
  • 411
  • 885
The Law
  • 344
  • 3
  • 20

1 Answers1

1

After testing with PHP 7.2.8 x86 and x64 below are my observations.

The reason that 8,86468E+11 is being converted to 8 is because of PHP's type-casting behavior when a comma is used instead of a period as the decimal separator. See below:

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!

The primary issue for you is that your decimal separator is a comma instead of a period so to remedy this you will need to make use of 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
MonkeyZeus
  • 20,375
  • 4
  • 36
  • 77
  • Maybe related: [Converting a number with comma as decimal point to float](https://stackoverflow.com/q/4325363/608639) – jww Dec 10 '18 at 14:07
  • @jww Thanks, I did consider using that post as a dupe reason but it doesn't really address the behavior that OP is experiencing. One could certainly deduce that foreign decimal notation is the culprit but I think the issue at hand warranted a dedicated answer. – MonkeyZeus Dec 10 '18 at 14:13