Форматирование гигантских чисел!

Pikachu

Добрый вечер!
Я еще нуб в этом направлении, да код Гг но как умеем!
ПОМОГИТЕ НОВИЧКУ!!!
Сам код:

PHP:
  1. function n_f($i, $b = 0) { //Сама функция форматирования
  2.     $pow = intval(log($i, 1000));
  3.     if(count($b) > $pow) {
  4.         $i = round(number_format($i, 0, », ‘.’), 1);
  5.         return $i.$b[$pow];
  6.     } else {
  7.         return «<img src=»https://php.ru/style/1.gif»>»;
  8.     }
  9. }
  10.  
  11. $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)
  12.  
  13. echo(n_f($user[‘gold’], $b)); //Вывожу так!

В итоге если число превышает отметку у которого 300 цифр то выводит (return «<img src=’/style/1.gif’>»;)
есть много способов конечно но там код не читабелен из за этих самых чисел!
Приведите пример, как можно сделать так чтоб числа выводились нормально и без каких либо ошибок, а точнее числа у которых превышает более 300 цифр

 

roboformation

Числа, состоящие из более 201 цифры (а не 300), можно выводить, например, с помощью научной нотации

PHP:
  1. function n_f($i, $b = 0) { //Сама функция форматирования
  2.     $pow = intval(log($i, 1000));
  3.     if(count($b) > $pow) {
  4.         $i = round(number_format($i, 0, », ‘.’), 1);
  5.         return $i.$b[$pow];
  6.     } else {
  7.         return sprintf («%.1e«, $i);
  8.     }
  9. }
  10. $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)
  11. echo(n_f($user[‘gold’], $b)); //Вывожу так!
 

Chushkin

Ваши варианты ограничены типом FLOAT: на x32 — 1.8e308.
— Добавлено —
Мой вариант:

PHP:
  1. function bcShort($bigN, $round=false, $postfix=[]) {
  2.     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’];
  3.     if(!$postfix) {
  4.         $postfix = $default;
  5.     }
  6.     $l = strlen($bigN);
  7.     $ln = ($l % 3 ?: 3);
  8.     $n = substr($bigN, 0, $ln);
  9.     if($round and $l > 3) {
  10.         $n = round($n . ‘.’ . ($bigN[strlen($n)] ?? 0));
  11.     }
  12.     $le = ($l $ln);
  13.     return $n . ($postfix[$le/3] ?? ‘e’ . $le);
  14. }
  15. // Пример
  16. $n1 = ‘155550’ . str_repeat(‘0’, 400);
  17. $n2 = ‘155550’ . str_repeat(‘0’, 190);
  18.     bcShort($n1), // 1e405
  19.     bcShort($n1, true), // 2e405
  20.     bcShort($n2), // 1bf
  21.     ]);
 

roboformation

Если $i — int типа, то никакое решение не поможет.
А если хочется побольше поддерживаемых чисел, то

PHP:
  1. function n_f($i, $b = 0) {
  2.          if (strlen ($i) > 201) {
  3.              return round (substr ($i, 0, 2) / 10).«e».(strlen
  4.               ($i) 1);
  5.          }
  6.          $pow = intval(log($i, 1000));
  7.           $i = round(number_format($i, 0, », ‘.’), 1);
  8.           return $i.$b[$pow];
  9.   }

Здесь $i — string типа

 

Chushkin

Ещё раз, — не забывайте про ограничение FLOAT.

 

roboformation

А как оно мне сейчас мешает?

 

Pikachu

ок спасибо! Сейчас попробуем.

 

Pikachu

не пашет
— Добавлено —
нужно рабочее решение! Остальное даже пробовать не буду так как 100% покажет 0
когда число 100000000000000000000000000000*1000

 

roboformation

Пашет и моё последнее решение, и его. Это не проблема кода (как я понял, у тебя php 5.6 — может, из-за версии не работает, либо ты что-то недосмотрел)

 

mkramer

Не истерим. Тут никто никому ничего не обязан, люди тратят свободное время, пытаясь помочь.
— Добавлено —
Для работы со сверхбольшими числами есть https://www.php.net/manual/ru/book.bc.php

 

Chushkin

BC, GMP не подходят для задачки. Там нет нужных функций.
ТС-у нужно просто отформатировать число. Т.е. приведение числа к сокращённому формату с округлением значимого числа до целого.
— Добавлено —

Ох уж эти студенты XXI века, — чуть что сразу визг, истерика, разбрасывание тетрадок. :)
— Добавлено —
Дошло. Если ТС-у нужна ещё и математика с числами, то конечно BC, GMP ему в руки.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *