#php #string #counting
#php #строка #подсчет
Вопрос:
Поэтому по какой-то причине, когда я использую count_chars(11111111111111111111,3)
, я возвращаю что-то к эффекту .1111111111111119
Есть ли другой способ подсчитать вхождения каждого символа в строке?
Вот несколько примеров кода
$value = 11111111111111111111;
$value = strval($value);
$count = count_chars($value,3);
print_r($count);
Если я распечатаю результат, я получу .012E
Комментарии:
1. Есть ли причина, по которой вы используете
strval()
вместо того, чтобы просто заключать число в кавычки?2. Да, я использую 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 />';
}
Комментарии:
1. То же самое происходит независимо от того, даю ли я ему строку или INT.
2. Для меня работает отлично. Покажите мне, пожалуйста, ваш точный код
3. У вас все еще есть большое число, которое слишком велико. Можете ли вы показать нам, как вы получаете эти числа?
Ответ №2:
Проблема здесь в том, что вы используете не целые числа, а плавающие точки.
И с такими большими числами с плавающей запятой они будут показаны научным способом (с E).
Так 11111111111111111111
становится 1.1111111111111E 19
(в математике это то же число).
Если вы преобразуете его в строку (приведение, из strval()
), он займет второе место здесь.
И поскольку у вас будет 1.1111111111111E 19
строка, вы получите результат, который вы нам предоставляете.
Решение этой проблемы? У вас есть несколько, но они не настолько хороши.
Лучший способ, который я могу придумать, — это использовать функцию number_format:
$value = number_format($value, 0, '', '');
Вместо этого, если strval()
функция.
Большая проблема здесь в том, что плавающие точки недостаточно точны для этого. Вы получите проблемы с округлением. Смотрите больше информации здесь .
На моем компьютере строка станет 11111111111111110656
, потому что она округляется до 1111111111111111.0656
.
Если вы знаете длину целого числа (в данном случае 16), вы могли бы использовать substr()
для этого, но опять же: это будет только обходной путь.