PDA

Просмотр полной версии : [Function] formatnum - форматирование цифр



VVWVV
06.01.2017, 06:56
Описание:

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

Параметры:

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

Возвращаемое значение:

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

Плюсы реализации:

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

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

Код:


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;
}


Пример использования:


main()
{
new buffer[12];
new r = formatnum(buffer, 2, '.');
printf("%d", r);
printf("%s", buffer);
}


См. также:

[Function] GetNumberOfArguments (http://pro-pawn.ru/showthread.php?14689)
[Function] Чистим массив игрока (http://pro-pawn.ru/showthread.php?7931)
[Function] Защита от DeAMX (new) (http://pro-pawn.ru/showthread.php?8277)
[Function] ClearKillFeed (http://pro-pawn.ru/showthread.php?12295)
[Function] dc_SleepFix (http://pro-pawn.ru/showthread.php?13188)
[Function] GetNumberOfPublics (http://pro-pawn.ru/showthread.php?14704)
[Function] GetStackSize (http://pro-pawn.ru/showthread.php?10824)
[Function] itos (http://pro-pawn.ru/showthread.php?3243)


Автор: VVWVV


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


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