За последние 24 часа нас посетили 22579 программистов и 1141 робот. Сейчас ищут 663 программиста ...

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

Тема в разделе "PHP для новичков", создана пользователем Pikachu, 10 янв 2021.

Метки:
  1. Pikachu

    Pikachu Новичок

    С нами с:
    10 янв 2021
    Сообщения:
    3
    Симпатии:
    0
    Добрый вечер!
    Я еще нуб в этом направлении, да код Гг но как умеем!
    ПОМОГИТЕ НОВИЧКУ!!!
    Сам код:
    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='/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 цифр
     
  2. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    Числа, состоящие из более 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)); //Вывожу так!
     
  3. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Ваши варианты ограничены типом 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.     ]);
     
  4. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    Если $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 типа
     
  5. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Ещё раз, - не забывайте про ограничение FLOAT.
     
  6. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    А как оно мне сейчас мешает?
     
  7. Pikachu

    Pikachu Новичок

    С нами с:
    10 янв 2021
    Сообщения:
    3
    Симпатии:
    0
    ок спасибо! Сейчас попробуем.
     
  8. Pikachu

    Pikachu Новичок

    С нами с:
    10 янв 2021
    Сообщения:
    3
    Симпатии:
    0
    не пашет
    --- Добавлено ---
    нужно рабочее решение! Остальное даже пробовать не буду так как 100% покажет 0
    когда число 100000000000000000000000000000*1000
     
  9. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    Пашет и моё последнее решение, и его. Это не проблема кода (как я понял, у тебя php 5.6 - может, из-за версии не работает, либо ты что-то недосмотрел)
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

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

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    BC, GMP не подходят для задачки. Там нет нужных функций.
    ТС-у нужно просто отформатировать число. Т.е. приведение числа к сокращённому формату с округлением значимого числа до целого.
    --- Добавлено ---
    Ох уж эти студенты XXI века, - чуть что сразу визг, истерика, разбрасывание тетрадок. :)
    --- Добавлено ---
    Дошло. Если ТС-у нужна ещё и математика с числами, то конечно BC, GMP ему в руки.