Почему меняет числовое значение с помощью number_format ()?

Следующий код дает мне два разных выхода:

$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