2016-10-06 2 views
0

Так по какой-то причине, когда я использую count_chars(11111111111111111111,3) я получаю ответ что-то к эффекту .1111111111111119count_chars в PHP, где количество символов больше, чем 16

Есть другой способ подсчета вхождений каждого символа в строка?

Вот несколько примеров кода

  $value = 11111111111111111111; 
      $value = strval($value); 
      $count = count_chars($value,3); 
      print_r($count); 

Если я распечатать результат я получаю + .012E

+0

Есть ли причина, по которой вы используете 'strval()' вместо того, чтобы просто помещать число между кавычками? – Blaatpraat

+0

Да, я использую strval, потому что в производственном коде строка приходит из другого метода и не всегда имеет тип string. Иногда его тип INT или double. –

ответ

1

Если вы хотите посчитать символы в строке , дают строку ...

count_chars('11111111111111111111',3) 

ps: и если вы действительно хотите использовать режим использования символов 1

$res = count_chars('1111111111111111111122333', 1); 

foreach ($res as $char => $number) { 
    echo chr($char). ' ' . $number .'<br />'; 
} 
+0

То же самое происходит независимо от того, передаю ли я строку или INT. –

+0

Для меня отлично работает. Покажите мне, пожалуйста, ваш ** точно ** код – nospor

+0

Обновлено сообщение с образцом кода. –

0

Проблема в том, что вы не используете целые числа, а плавающие точки.
И с большими поплавками, они будут показаны научным способом (с E).

So 11111111111111111111 становится 1.1111111111111E+19 (в математике это тот же номер).
Если вы конвертируете его в строку (cast, of strval()), она будет второй здесь.
И поскольку у вас будет 1.1111111111111E+19 в виде строки, вы получите вывод, который вы нам дадите.

Решение этой проблемы? У вас их мало, но они не так хороши.
Лучший способ, которым я могу думать, это использование функции number_format:

$value = number_format($value, 0, '', ''); 

Вместо если функция strval().

Большая проблема здесь в том, что плавающие точки недостаточно для этого. Вы столкнетесь с проблемами округления. См. Дополнительную информацию here.

На моем компьютере строка будет 11111111111111110656, потому что она округляется до 1111111111111111.0656.

Если вы знаете длину целого числа (в данном случае 16), для этого вы можете использовать substr(), но опять же: это будет только обходным путем.

Смежные вопросы