Следующий код дает мне два разных выхода:
$number = '1562798794365432135246'; echo $number; echo number_format($number);
Может кто-нибудь объяснить это?
EDIT: забыл упомянуть, выше сказанное дает мне «1562798794365432135246 1,562,798,794,365,432,233,984». Обратите внимание, что последние шесть цифр совершенно разные по какой-либо очевидной причине (все, что я просил сделать, это вставить тысячи разделителей).
number_format()
, как указано в руководстве PHP , преобразует float в строку с тысячами групп с запятыми.
$number = '1562798794365432135246'; var_dump($number); // string(22) "1562798794365432135246" var_dump(number_format($number)); // string(29) "1,562,798,794,365,432,233,984"
Если вы пытаетесь передать строку целому числу, вы можете сделать это следующим образом:
$number = (int) $number;
Однако будьте осторожны, так как наибольшее возможное целочисленное значение в PHP равно 2147483647
на 32-битной системе и 9223372036854775807
на 64-битной системе. Если вы попытаетесь наложить строку, подобную приведенной выше, на int в 32-битной системе, вы назначите $number
to 2147483647
а не значение, которое вы намереваетесь!
Функция number_format()
принимает поплавок в качестве аргумента, который имеет схожие проблемы. Когда вы передаете строку в качестве аргумента для number_format()
, она внутренне преобразуется в float. Поплавки немного сложнее, чем целые. Вместо того, чтобы иметь жесткую верхнюю границу, такую как целочисленное значение, поплавки постепенно теряют точность в наименее значимых цифрах, что делает эти последние несколько мест неправильными.
Поэтому, к сожалению, если вам нужно форматировать длинные строки, как это, вам, вероятно, придется написать свою собственную функцию. Если вам нужно только добавить запятые в тысячи мест, это должно быть легко – просто используйте strlen и substr, чтобы получить каждый набор из трех символов из конца строки и создать новую строку с запятыми между ними.
Я знаю, что это старый вопрос, но недавно я столкнулся с этой проблемой и закодировал функцию, которая работает для моих целей. Надеюсь, это помогает другим. Он работает с одиночными кавычками и $ _GET. Я не тестировал $ _POST. Модификации должны быть сделаны, если вы имеете дело с отрицательными целыми или не целыми числами.
<?php function format_big_numbers($number, $delimiter) { $len = strlen($number); if ($len > 3){ if ($len % 3 == 0) { $split = str_split($number, 3); $number_with_commas = implode("$delimiter", $split); return $number_with_commas; } else if ($len % 3 == 1) { $front = substr($number, 0, 1); $split = substr($number, 1, $len - 1); $split = str_split($split, 3); $number_with_commas = implode("$delimiter", $split); $number_with_commas = $front . "$delimiter" . $number_with_commas; return $number_with_commas; } else { $front = substr($number, 0, 2); $split = substr($number, 2, $len - 2); $split = str_split($split, 3); $number_with_commas = implode("$delimiter", $split); $number_with_commas = $front . "$delimiter" . $number_with_commas; return $number_with_commas; } } else { return $number; } } $num = '1234567891234567891234567891234'; echo format_big_numbers($num, ","); // output is 1,234,567,891,234,567,891,234,567,891,234 ?>
Чтобы работать с PHP и такими большими числами, вы должны использовать некоторую библиотеку. Работа с большими числами в PHP.
BC Math – http://www.php.net/manual/en/book.bc.php , GMP – http://www.php.net/manual/en/book.gmp.php