Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 1 из 1
  1. #1
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±

    formatnum - форматирование цифр

    Описание:
    Преобразует число в строку с разделителями.

    Параметры:
    dest[] - массив/строковая переменная, в которую будет записан результат
    number - число
    const delimiter = ' ' - разделитель
    bool:packed = false - вид возвращаемой строки (true - упакованная, false - обычная строка)
    size = sizeof dest - размер массива dest (не рекомендую изменять)

    Возвращаемое значение:
    Возвращает количество цифр в числе.

    Плюсы реализации:
    • В отличие от функции format умеет работать с упакованными строками.
    • Быстрое вычисление из-за инструкций sdiv/udiv.

    Минусы реализации:
    • N/A

    Код:
    PHP код:
    stock
        formatnum
    (dest[], number, const delimiter ' 'bool:packed false,
            
    size sizeof dest)
    {
        
    dest[0] = '0';
        new 
    i;
        if (
    number) {
            new
                
    tnum number,
                
    part_size,
                
    mod,
                
    end;

            
    // Умножаем размер на 4, ибо sizeof возвращает количество ячеек.
            
    if (packed)
                
    size <<= 2;

            
    // Подсчитываем количество цифр.
            
    do {
                
    tnum /= 10;
                ++
    i;
            } while (
    tnum);

            
    end i;

            
    // Проверяем, является ли число большее 999, и стоит ли ему добавлять
            // в размер количество разделителей.
            
    if (number 999) {
                
    end += (end 3) + 2;
            }

            while (
    number) {
                if (
    part_size 3) {
                    ++
    part_size;
                } else {
                    
    part_size 0;
                    if (
    packed) {
                        
    dest{--end} = delimiter;
                    } else {
                        
    dest[--end] = delimiter;
                    }
                    continue;
                }
                
    // Пустой блок для фикса ошибки.
                
    {}

                
    #emit load.s.pri number
                #emit const.alt 10

                // Если вы хотите работать с беззнаковыми числами, то используйте
                // инструкцию udiv.
                #emit sdiv

                #emit stor.s.pri number
                #emit stor.s.alt mod

                
    if (--end size) {
                    if (
    packed) {
                        
    dest{end} = '0' mod;
                    } else {
                        
    dest[end] = '0' mod;
                    }
                }
            }
        }
        return 
    i;

    Пример использования:
    PHP код:
    main()
    {
        new 
    buffer[12];
        new 
    formatnum(buffer2'.');
        
    printf("%d"r);
        
    printf("%s"buffer);

    См. также:

    Автор: VVWVV

    Исключительно для pro-pawn.ru

    Копирование данной статьи на других ресурсах без разрешения автора запрещено.

  2. 2 пользователя(ей) сказали cпасибо:
    DeimoS (09.10.2017) Osetin (07.01.2017)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •