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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Josan_Solomon Посмотреть сообщение
    Промелькнула шальная мысль хранить значение во float(а потом убирать точку), потом дошло что сам язык 32-х битный и ничего с этим ограничением уже не поделаешь. Как печально.. А как вы хранили бы большие числа?

    - - - Добавлено - - -

    И какое максимальное значение у float? Не нашел список диапазона значений для pawn

    - - - Добавлено - - -

    Поэкспериментировал и не нашел четкого ограничения, но увы, точность стала пропадать
    Зачем вам такие числа? Если вы хотите хранить числа в диапазоне [0, 4294967296), то можно использовать библиотеку ulong. Тем не менее я не вижу абсолютно никакого смысла использовать в SA:MP значения больше имеющихся.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Есть ещё такой вариант
    1. stock AddCommasToInt(number, delimiter[2] = ".")
    2. {
    3. new int_string[10+3+1+1];
    4.  
    5. format(int_string, sizeof(int_string), "%d", number >= 0 ? number : -number);//Если число положительное - запишем его в обычном виде. Иначе - добавим ещё один минус, дабы сделать его положительным
    6.  
    7.  
    8. new value = strlen(int_string);// Запишем в value размер строки с числом
    9.  
    10. switch(value)
    11. {
    12. case 4..6: // Если переданное число содержит от 4-х до 6-и символов, добавим один разделитель
    13. strins(int_string, delimiter, value-3,1);
    14. case 7..9: // Если от 7-и до 9-и - два разделителя
    15. strins(int_string, delimiter, value-3,1),
    16. strins(int_string, delimiter, value-6,1);
    17. case 10..12: // Если от 10-и до 12-и - три разделителя
    18. strins(int_string, delimiter, value-3,1),
    19. strins(int_string, delimiter, value-6,1),
    20. strins(int_string, delimiter, value-9,1);
    21. }
    22.  
    23. if(number < 0) strins(int_string, "-", 0); // Если число отрицательное, вернём ему минус
    24. return int_string;
    25. }
    Немного поздно, но всё же: функция неправильно выводит cellmin, вместо "-2147483648" выводится "---" (причина кроется в баге в функции format()). Решение из formatnumber.inc тоже фейлит на cellmin.

    Поделюсь своим костылём:
    1. stock NumToString(dest[], num, sep = '\'', size = sizeof(dest))
    2. { // by Daniel_Cortez \\ pro-pawn.ru
    3. if (num == cellmin)
    4. {
    5. format(dest, size, "-2%c147%c483%c648", sep, sep, sep);
    6. return 14;
    7. }
    8. static neg, len, offs;
    9. new numstr[11];
    10. if ((neg = (num < 0)))
    11. {
    12. dest[0] = '-';
    13. size--;
    14. num = -num;
    15. }
    16. format(numstr, sizeof(numstr), "%d", num);
    17. offs = ((len = strlen(numstr)) - 1) % 3 + 1;
    18. switch (len)
    19. {
    20. case 1..3:
    21. return strunpack(dest[neg], numstr, size) + neg;
    22. case 4..6:
    23. return format(dest[neg], size, "%.*s%c%.3s", offs, numstr, sep, numstr[offs]), (len + neg + 1);
    24. case 7..9:
    25. return format(dest[neg], size, "%.*s%c%.3s%c%.3s", offs, numstr, sep, numstr[offs], sep, numstr[3+offs]), (len + neg + 2);
    26. }
    27. format(dest[neg], size, "%.*s%c%.3s%c%.3s%c%.3s", offs, numstr, sep, numstr[offs], sep, numstr[3+offs], sep, numstr[6+offs]);
    28. return len + neg + 3;
    29. }

    Из плюсов данного варианта: отсутствие возврата массива через стек (вместо этого пользователь сам должен указать массив для записи), правильный вывод cellmin, функция возвращает длину строки с числом.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #13
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    ...
    Еще можно так это сделать.
    1. stock
    2. ulong_string(dest[], ulong:value, bool:is_packed = false,
    3. delimiter, size = sizeof dest)
    4. {
    5. dest[0] = '0';
    6. if (value) {
    7. if (is_packed)
    8. size <<= 2;
    9. new
    10. end = ulong_getDigitCount(value),
    11. mod = 0,
    12. part_size = 0,
    13. out_chr = 0;
    14. while (value) {
    15. // dest[end] = '0' + (value % 10)
    16. #emit load.s.pri value
    17. #emit const.alt 10
    18. #emit udiv
    19. #emit stor.s.pri value
    20. #emit stor.s.alt mod
    21.  
    22. if (++part_size == 4) {
    23. part_size = 0;
    24. out_chr = delimiter;
    25. } else if (--end < size) {
    26. out_chr = '0' + mod;
    27. }
    28. if (is_packed) {
    29. dest{end} = out_chr;
    30. } else {
    31. dest[end] = out_chr;
    32. }
    33. }
    34. }
    35. return 0;
    36. }

 

 
Страница 2 из 2 ПерваяПервая 1 2

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

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

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

Ваши права

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