Добрый вечер! Я еще нуб в этом направлении, да код Гг но как умеем! ПОМОГИТЕ НОВИЧКУ!!! Сам код: PHP: function n_f($i, $b = 0) { //Сама функция форматирования $pow = intval(log($i, 1000)); if(count($b) > $pow) { $i = round(number_format($i, 0, '', '.'), 1); return $i.$b[$pow]; } else { return "<img src='/style/1.gif'>"; } } $b = array('', 'k', 'm', 'b', 't', 'q', 'u', 'x', 'y', 'h', 's', 'd', 'v', 'w', 'r', 'g', 'n', 'c', 'p', 'o', 'z', 'vi', 'un', 'du', 'tr', 'qu', 'qi', 'se', 'sp', 'oc', 'nv', 'tn', 'ut', 'dt', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an', 'ao', 'ap', 'aq', 'ar', 'as', 'at', 'au', 'av', 'aw', 'ax', 'ay', 'az', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'bg'); //чтоб не выводило 1 000 000 выводит так (1m) echo(n_f($user['gold'], $b)); //Вывожу так! В итоге если число превышает отметку у которого 300 цифр то выводит (return "<img src='/style/1.gif'>" есть много способов конечно но там код не читабелен из за этих самых чисел! Приведите пример, как можно сделать так чтоб числа выводились нормально и без каких либо ошибок, а точнее числа у которых превышает более 300 цифр
Числа, состоящие из более 201 цифры (а не 300), можно выводить, например, с помощью научной нотации PHP: function n_f($i, $b = 0) { //Сама функция форматирования $pow = intval(log($i, 1000)); if(count($b) > $pow) { $i = round(number_format($i, 0, '', '.'), 1); return $i.$b[$pow]; } else { return sprintf ("%.1e", $i); } } $b = array('', 'k', 'm', 'b', 't', 'q', 'u', 'x', 'y', 'h', 's', 'd', 'v', 'w', 'r', 'g', 'n', 'c', 'p', 'o', 'z', 'vi', 'un', 'du', 'tr', 'qu', 'qi', 'se', 'sp', 'oc', 'nv', 'tn', 'ut', 'dt', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an', 'ao', 'ap', 'aq', 'ar', 'as', 'at', 'au', 'av', 'aw', 'ax', 'ay', 'az', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'bg'); //чтоб не выводило 1 000 000 выводит так (1m) echo(n_f($user['gold'], $b)); //Вывожу так!
Ваши варианты ограничены типом FLOAT: на x32 - 1.8e308. --- Добавлено --- Мой вариант: PHP: function bcShort($bigN, $round=false, $postfix=[]) { static $default = ['', 'k', 'm', 'b', 't', 'q', 'u', 'x', 'y', 'h', 's', 'd', 'v', 'w', 'r', 'g', 'n', 'c', 'p', 'o', 'z', 'vi', 'un', 'du', 'tr', 'qu', 'qi', 'se', 'sp', 'oc', 'nv', 'tn', 'ut', 'dt', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an', 'ao', 'ap', 'aq', 'ar', 'as', 'at', 'au', 'av', 'aw', 'ax', 'ay', 'az', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'bg']; if(!$postfix) { $postfix = $default; } $l = strlen($bigN); $ln = ($l % 3 ?: 3); $n = substr($bigN, 0, $ln); if($round and $l > 3) { $n = round($n . '.' . ($bigN[strlen($n)] ?? 0)); } $le = ($l - $ln); return $n . ($postfix[$le/3] ?? 'e' . $le); } // Пример $n1 = '155550' . str_repeat('0', 400); $n2 = '155550' . str_repeat('0', 190); print_r([ bcShort($n1), // 1e405 bcShort($n1, true), // 2e405 bcShort($n2), // 1bf ]);
Если $i - int типа, то никакое решение не поможет. А если хочется побольше поддерживаемых чисел, то PHP: function n_f($i, $b = 0) { if (strlen ($i) > 201) { return round (substr ($i, 0, 2) / 10)."e".(strlen ($i) - 1); } $pow = intval(log($i, 1000)); $i = round(number_format($i, 0, '', '.'), 1); return $i.$b[$pow]; } Здесь $i - string типа
не пашет --- Добавлено --- нужно рабочее решение! Остальное даже пробовать не буду так как 100% покажет 0 когда число 100000000000000000000000000000*1000
Пашет и моё последнее решение, и его. Это не проблема кода (как я понял, у тебя php 5.6 - может, из-за версии не работает, либо ты что-то недосмотрел)
Не истерим. Тут никто никому ничего не обязан, люди тратят свободное время, пытаясь помочь. --- Добавлено --- Для работы со сверхбольшими числами есть https://www.php.net/manual/ru/book.bc.php
BC, GMP не подходят для задачки. Там нет нужных функций. ТС-у нужно просто отформатировать число. Т.е. приведение числа к сокращённому формату с округлением значимого числа до целого. --- Добавлено --- Ох уж эти студенты XXI века, - чуть что сразу визг, истерика, разбрасывание тетрадок. --- Добавлено --- Дошло. Если ТС-у нужна ещё и математика с числами, то конечно BC, GMP ему в руки.