Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 4 из 4

Тема: format

  1. #1
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±

    format

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

    Параметры:
    output[] - преобразуемая строка.
    len - размер преобразуемой строки.
    format[] - строка, которая должна включать в себя спецификаторы.
    {Float,_}: ... - аргументы функции, которые должны соответствовать каждому спецификатору.

    Возвращаемое значение:
    Конкретного значения нет, но возвращает единицу.

    Спецификаторы:
    Спецификатор Значение
    %c 1 символ ( например f )
    %d, %i Целое число ( например 1024 )
    %x Целое число в шестнадцатеричном формате ( например 0xFF0000FF )
    %f Дробное число ( например 3.14 )
    %s Строка ( например "Pro-Pawn" )
    %b Число в бинарном виде ( например 0b001 )

    Примечание: Спецификаторы должны быть в таком же порядке, в котором указаны аргументы для вызова функции.

    Примеры использования:
    Иногда нам нужно вывести лишь несколько знаков в дроби после запятой.
    Для этого мы бы использовали спецификатор '%f', с помощью которого мы выводили бы дробное число.

    Теперь давайте представим, что мы объявили константу PI. Многие знают, что данная константа математически посчитана не до конца. Количество чисел после запятой очень огромно. Возьмём первые 15 знаков после запятой, создадим константу:
    PHP код:
    const 
        
    FloatPI 3.141592653589793// дробная часть составляет 15 знаков 
    Но, что делать, если мы хотим вывести не всё значение этой константы, а только лишь часть? Например, возьмём два числа после запятой и выведем на консоль значение константы:
    PHP код:
    printf("Значение константы PI ( 2 знака после запятой ): %1.2f"PI); 
    Данным способом мы указали, что хотим вывести 1 число перед запятой и 2 знака после запятой. Следовательно, результат вывода будет таким:
    Код:
    Значение константы PI ( 2 знака после запятой ): 3.14
    Хочу привести пример с получением даты. Наверняка, а скорее вы должны это знать, что число и месяц занимает 2 числа ( максимальное число в месяце: 31, последний месяц в году: 12 ).

    Для оптимального вывода числа и месяца в году рекомендую использовать данный вид записи спецификатора:
    PHP код:
    %02d 
    Данным способом мы даём понять компилятору, что будем выводить только 2 знака.

    Приведу небольшой пример кода, который будет выводить текущий месяц в году и текущее число в месяце:
    PHP код:
    new
        
    day,
        
    month;

    getdate(_monthday);
    // с помощью функции getdate получим данные о текущей дате
    // первый параметр - год, он нам не нужен, можно его пропустить, используя '_'
    // в остальных же аргументах получаем текущий месяц и текущее число этого месяца

    printf("Сегодняшний месяц: %02d. Сегодняшнее число: %02d."monthday);
    // выводим на консоль информацию о сегодняшней дате 
    Хочу также привести пример использования спецификатора '%s'. Но использовать мы его сейчас будем немного по другому.
    Давайте создадим массив, который будет хранить в себе текст: "Pro-Pawn - портал о Pawn-скриптинге":
    PHP код:
    new
        
    pp_string[] = "Pro-Pawn - портал о Pawn-скриптинге"
    Теперь представим, что перед нам стоит задача вывести текст до первого пробела, то есть нам нужно вывести данную строку:
    Код:
    Pro-Pawn
    Мы сможет это сделать используя спецификатор '%s' немного по другому:
    PHP код:
    %0.8 
    Почему же именно 8? Давайте посчитаем длину слова "Pro-Pawn". Длина этого слова: 8 символов.

    Теперь используем спецификатор в готовом виде в функции format:
    PHP код:
    new
        
    str[64],
        
    pp_string[] = "Pro-Pawn.Ru - портал о Pawn-скриптинге";

    format(strsizeof(str), "Всем привет, с вами %0.8s"pp_string);
    print(
    str); 
    В результате мы увидим текст:
    Код:
    Всем привет, с вами Pro-Pawn
    Вы также можете поэкспериментировать с другими спецификаторами.

    Ещё один пример использования нескольких спецификаторов сразу:
    PHP код:
    new
        
    temp_string[128],
        
    temp_name[MAX_PLAYER_NAME 1],
        
    temp_id 12;

    GetPlayerName(temp_idtemp_namesizeof(temp_name)); // получаем никнейм игрока под ID 12
    format(
        
    temp_string,
        
    // первым аргументом указываем строку, которую хотим преобразовать
        
    sizeof(temp_string),
        
    // на всякий пожарный, используйте оператор sizeof,
        // для того, чтобы получить размер массива
        // если размер преобразованной строки будет больше чем размер массива temp_string,
        // то сервер просто-напросто накроется медным тазом ( на linux вероятность ещё больше ).
        
    "Никнейм игрока под ID %i: %s. Первый символ никнейма игрока: %c",
        
    // строка со спецификаторами, которую мы хотим преобразовать в готовую,
        // более понятную для человека
        
    temp_id,
        
    // чтобы вывести ID игрока, используем сначала спецификатор '%i'
        
    temp_name,
        
    // чтобы вывести никнейм игрока, используем спецификатор '%s',
        
    temp_name[0]
        
    // чтобы вывести какой-либо символ, используем спецификатор '%c'
    );

    print(
    temp_string);
    // выведем в консоль преобразованный массив temp_string

    // представим, что никнейм игрока под ID 12 такой: "L0ndl3m", тогда
    // в консоли сервера мы увидим строку:
    // "Никнейм игрока под ID: 12: L0ndl3m. Первый символ никнейма игрока: L" 
    Статью подготовил: L0ndl3m

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено.
    Последний раз редактировалось L0ndl3m; 17.01.2020 в 15:06.

  2. 4 пользователя(ей) сказали cпасибо:
    $continue$ (14.11.2015) BadPawn (21.01.2016) Glant (19.12.2015) Nurick (14.11.2015)
  3. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    1. Переменная "id" не объявлена.
    Цитата Сообщение от Londlem Посмотреть сообщение
    PHP код:
    GetPlayerName(idtemp_namesizeof(temp_name)); // получаем никнейм игрока под ID 12 
    2. Таблица спецификаторов не относится к пункту "Возвращаемое значение", поэтому стоило бы перенести её куда-нибудь ещё. Под список параметров, например.

    3. Не расписано поведение format при указании цифр между "%" и спецификатором. Например, "%4s", "%4.2f" или "%5d".

    Если что, я есть в XMPP. Либо могу зайти в скайп, когда доберусь до пека.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. Пользователь сказал cпасибо:
    L0ndl3m (15.11.2015)
  5. #3
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    1. Переменная "id" не объявлена.

    2. Таблица спецификаторов не относится к пункту "Возвращаемое значение", поэтому стоило бы перенести её куда-нибудь ещё. Под список параметров, например.

    3. Не расписано поведение format при указании цифр между "%" и спецификатором. Например, "%4s", "%4.2f" или "%5d".

    Если что, я есть в XMPP. Либо могу зайти в скайп, когда доберусь до пека.
    Спасибо за поправки, в скором времени исправлю.

  6. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Пока не забыл, напишу здесь.
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Обновление 0.3.7 R2
    • Добавлен спецификатор "%q" в функции format. Он предназначен для форматирования строковых значений, как и "%s", но дополнительно пропускает форматируемое значение через экранирующую функцию в SQLite. Нововведение может быть полезно для защиты от SQL-инъекций.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. Пользователь сказал cпасибо:
    Outsider (11.08.2019)
 

 

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

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

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

Ваши права

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