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

    Статус
    Оффлайн
    Регистрация
    22.04.2013
    Сообщений
    44
    Репутация:
    0 ±

    Пробелы между цифрами

    Здравствуйте.
    Как добавить пробелы между числами как на скринах? https://imgur.com/a/
    Последний раз редактировалось scory; 02.01.2021 в 21:05.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1. stock AddDelimiterToInt(number, delimiter[2] = ".")
    2. {
    3. new int_string[14+1];
    4. format(int_string, sizeof(int_string), "%d", number >= 0 ? number : -number);
    5. new value = strlen(int_string);
    6. switch(value)
    7. {
    8. case 4..6:
    9. {
    10. strins(int_string, delimiter, value-3,1);
    11. }
    12. case 7..9:
    13. {
    14. strins(int_string, delimiter, value-3,1);
    15. strins(int_string, delimiter, value-6,1);
    16. }
    17. case 10..12:
    18. {
    19. strins(int_string, delimiter, value-3,1);
    20. strins(int_string, delimiter, value-6,1);
    21. strins(int_string, delimiter, value-9,1);
    22. }
    23. }
    24. if(number < 0) strins(int_string, "-", 0);
    25. return int_string;
    26. }


    Использование:
    1. new string[20+14+1];
    2. format(string, sizeof(string), "Продаётся за $%s: /buy", AddDelimiterToInt(3000000, " "));
    3. SendClientMessage(playerid, 0x0000FFFF, string);
    Последний раз редактировалось DeimoS; 17.08.2019 в 02:48.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Ещё вариант, с поддержкой Float и других тегов.

    1. /*
    2.   FormatNumber by Slice.
    3.   -------------------------
    4.   Usage:
    5.   FormatNumber( number, decimals, thousand seperator, decimal point )
    6.  
    7.   number - This can be any variable type (float, integer, bool, etc.)
    8.   If you want the value to be printed as HEX, tag the variable with hex. Example:
    9.   new myvariable = 5312851;
    10.  
    11.   FormatNumber( hex:myvariable ); // gives 0x00511153
    12.  
    13.   Additionaly, you can print out the bits of either the first byte or the whole cell by using the following tags: bit:, bit_byte:
    14.  
    15.   If you get a type error, tag the variable with _. Example:
    16.   new omgomg:specialVariable = omgomg:5;
    17.  
    18.   FormatNumber( _:specialVariable ); // gives 5
    19.  
    20.   decimals - The number of decimals to show
    21.   new mynumber = 50;
    22.  
    23.   FormatNumber( mynumber, 2 ); // gives 50.00
    24.  
    25.   new Float:myfloat = 123.456;
    26.  
    27.   FormatNumber( myfloat, 0 ); // gives 123
    28.  
    29.   thousand seperator - char between thousands
    30.   new mynumber = 5000000000;
    31.  
    32.   FormatNumber( myfloat ); // gives 5 000 000 000
    33.   FormatNumber( myfloat, 0, ',' ); // gives 5,000,000,000
    34.   FormatNumber( myfloat, 0, 0 ); // gives 5000000000
    35.  
    36.   decimal point - duh
    37.   new myfloat = 50.0;
    38.  
    39.   FormatNumber( myfloat, 2, ' ', ',' ); // gives 50,00
    40.   FormatNumber( myfloat, 2, ' ', '~' ); // gives 50~00
    41.  
    42.   You can set these constants __before__ including this file:
    43.  
    44.   HEX_PREFIX - default value "0x". Example:
    45.   #define HEX_PREFIX "#"
    46.  
    47.   #include <formatnumber.inc>
    48.  
    49.   FormatNumber( hex:50000 ); // gives #0000C350
    50.  
    51.   BIT_PREFIX - default value: "0b"
    52.  
    53.   DEFAULT_DECIMAL_COUNT - default value: 8
    54.  
    55.   DEFAULT_THOUSAND_SEP - default value: ' '
    56.  
    57.   DEFAULT_DECIMAL_POINT - default value: '.'
    58. */
    59.  
    60. #if defined _formatnumber_included
    61. #endinput
    62. #else
    63. #define _formatnumber_included
    64. #endif
    65.  
    66. #if !defined HEX_PREFIX
    67. #define HEX_PREFIX "0x"
    68. #endif
    69.  
    70. #if !defined BIT_PREFIX
    71. #define BIT_PREFIX "0b"
    72. #endif
    73.  
    74. #if !defined DEFAULT_DECIMAL_COUNT
    75. #define DEFAULT_DECIMAL_COUNT 8
    76. #endif
    77.  
    78. #if !defined DEFAULT_THOUSAND_SEP
    79. #define DEFAULT_THOUSAND_SEP ' '
    80. #endif
    81.  
    82. #if !defined DEFAULT_DECIMAL_POINT
    83. #define DEFAULT_DECIMAL_POINT '.'
    84. #endif
    85.  
    86. stock FormatNumber( { _, Float, Text3D, Menu, Text, DB, DBResult, bool, File, hex, Hex, bit, bit_byte, Bit }:xVariable, iDecimals = -1, iThousandSeparator = DEFAULT_THOUSAND_SEP, iDecimalPoint = DEFAULT_DECIMAL_POINT, iTag = tagof( xVariable ) )
    87. {
    88. static
    89. s_szReturn[ 32 ],
    90. s_szThousandSeparator[ 2 ] = { ' ', EOS },
    91. s_iDecimalPos,
    92. s_iChar,
    93. s_iSepPos,
    94. bool:s_isNegative
    95. ;
    96.  
    97. if ( iTag == tagof( bool: ) )
    98. {
    99. if ( xVariable )
    100. memcpy( s_szReturn, "true", 0, 5 * ( cellbits / 8 ) );
    101. else
    102. memcpy( s_szReturn, "false", 0, 6 * ( cellbits / 8 ) );
    103.  
    104. return s_szReturn;
    105. }
    106. else if ( iTag == tagof( Float: ) )
    107. {
    108. if ( iDecimals == -1 )
    109. iDecimals = DEFAULT_DECIMAL_COUNT;
    110.  
    111. format( s_szReturn, sizeof( s_szReturn ), "%.*f", iDecimals, xVariable );
    112.  
    113. s_iDecimalPos = strfind( s_szReturn, "." );
    114. }
    115. else if ( iTag == tagof( hex: ) || iTag == tagof( Hex: ) )
    116. {
    117. format( s_szReturn, sizeof( s_szReturn ), HEX_PREFIX "%04h%04h", ( xVariable & ( 0xFFFF0000 ) ) >>> 16, xVariable & ( 0x0000FFFF ) );
    118.  
    119. return s_szReturn;
    120. }
    121. else if ( iTag == tagof( bit: ) || iTag == tagof( Bit: ) )
    122. {
    123. format( s_szReturn, sizeof( s_szReturn ), BIT_PREFIX "%08b%08b%08b%08b", ( xVariable & 0xFF000000 ) >>> 24, ( xVariable & 0x00FF0000 ) >>> 16, ( xVariable & 0x0000FF00 ) >>> 8, ( xVariable & 0x000000FF ) );
    124.  
    125. return s_szReturn;
    126. }
    127. else if ( iTag == tagof( bit_byte: ) )
    128. {
    129. format( s_szReturn, sizeof( s_szReturn ), BIT_PREFIX "%08b", ( xVariable & 0x000000FF ) );
    130.  
    131. return s_szReturn;
    132. }
    133. else
    134. {
    135. format( s_szReturn, sizeof( s_szReturn ), "%d", xVariable );
    136. if ( iDecimals > 0 )
    137. {
    138. strcat( s_szReturn, "." );
    139.  
    140. while ( iDecimals-- )
    141. strcat( s_szReturn, "0" );
    142. }
    143. s_iDecimalPos = -1;
    144. }
    145.  
    146. if ( s_iDecimalPos == -1 )
    147. s_iDecimalPos = strlen( s_szReturn );
    148. else
    149. s_szReturn[ s_iDecimalPos ] = iDecimalPoint;
    150.  
    151. if ( s_iDecimalPos >= 4 && iThousandSeparator )
    152. {
    153. s_szThousandSeparator[ 0 ] = iThousandSeparator;
    154.  
    155. s_iChar = s_iDecimalPos;
    156. s_iSepPos = 0;
    157. s_isNegative = s_szReturn[0] == '-';
    158.  
    159. while ( --s_iChar > _:s_isNegative )
    160. {
    161. if ( ++s_iSepPos == 3 )
    162. {
    163. strins( s_szReturn, s_szThousandSeparator, s_iChar );
    164.  
    165. s_iSepPos = 0;
    166. }
    167. }
    168. }
    169. return s_szReturn;
    170. }

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

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Сделал свою версию

    1. stock AddDelimiterToInt(value, const space[] = " ")
    2. {
    3. new
    4. string[16],
    5. i,
    6. k,
    7. v = 3,
    8. s;
    9.  
    10. format(string, sizeof string, "%i", value >= 0 ? value : -value);
    11.  
    12. k = strlen(string);
    13. i = k/3;
    14. k %= 3;
    15.  
    16. if (k != 0)
    17. {
    18. strins(string, space, k);
    19. k++;
    20. }
    21.  
    22. while (--i > 0)
    23. {
    24. k += v;
    25. strins(string, space, k);
    26. v++;
    27. }
    28.  
    29. if (value < 0)
    30. strins(string, "-", 0);
    31.  
    32. return string;
    33. }
    Последний раз редактировалось m1n1vv; 29.08.2019 в 08:23.

  6. #5
    Аватар для vvw
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    45
    Репутация:
    9 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Сделал свою версию

    1. stock AddDelimiterToInt(value, const space[] = " ")
    2. {
    3. new
    4. string[16],
    5. i,
    6. k,
    7. v = 3,
    8. s;
    9.  
    10. valstr(string, value >= 0 ? value : -value);
    11.  
    12. k = strlen(string);
    13. i = k/3;
    14. k %= 3;
    15.  
    16. if (k != 0)
    17. {
    18. strins(string, space, k);
    19. k++;
    20. }
    21.  
    22. while (--i > 0)
    23. {
    24. k += v;
    25. strins(string, space, k);
    26. v++;
    27. }
    28.  
    29. if (value < 0)
    30. strins(string, "-", 0);
    31.  
    32. return string;
    33. }
    Реализация у Slice лучше. В твоем же коде могут быть ошибки при определенных ситуациях (например, OOB).

  7. #6
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Цитата Сообщение от vvw Посмотреть сообщение
    Реализация у Slice лучше. В твоем же коде могут быть ошибки при определенных ситуациях (например, OOB).
    Приведи пример

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    1. format(int_string, sizeof(int_string), "%d", number >= 0 ? number : -number);
    Если параметр number имеет минимально возможное значение cellmin (-2147483648), то выражение (-number) выдаст 0. Да, так работает целочисленная арифметика: у минимального отрицательного значения нет положительного аналога, и нужно всегда иметь это в виду! Собственно, по той же причине и format() не может вывести это значение правильно, выдавая "--".

    Цитата Сообщение от DeimoS Посмотреть сообщение
    1. switch (value)
    2. {
    3. // ...
    4. case 10..12:
    Вот здесь не совсем понятно: для чего нужно именно "10..12", если положительное число в десятичной записи не может занимать больше 10 знаков?

    Цитата Сообщение от vvw Посмотреть сообщение
    Реализация у Slice лучше. В твоем же коде могут быть ошибки при определенных ситуациях (например, OOB).
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Приведи пример
    За примерами далеко ходить не нужно (см. примечания по багам), можно добиться и записи за пределы массива, и зависания "намертво".

    Вообще, ИМХО, вариант DeimoS'а выглядит почти идеальным, не считая перестановки всех элементов массива при вставке "-" (наверняка можно реализовать это как-то получше) и ещё пары уже упомянутых нюансов. Также настораживает в том варианте повторяющийся код внутри switch, но это такая особенность Pawn, что нельзя сделать, чтобы из одного case нельзя было "провалиться" в следующий, как в C/C++. Впрочем, это не ещё значит, что такую возможность нельзя добавить в компилятор :)
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. #8
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    За примерами далеко ходить не нужно (см. примечания по багам), можно добиться и записи за пределы массива, и зависания "намертво".
    Не обращал на это внимание. Учту.

  10. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Если параметр number имеет минимально возможное значение cellmin (-2147483648), то выражение (-number) выдаст 0. Да, так работает целочисленная арифметика: у минимального отрицательного значения нет положительного аналога, и нужно всегда иметь это в виду! Собственно, по той же причине и format() не может вывести это значение правильно, выдавая "--".
    Да, точно. Если честно, уже давно не вчитывался в код, который я там понаписал. Помнил просто, что, вроде как, всё работало и этот вариант быстрее варианта с циклом, поэтому и не парился. Мой косяк :D

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Вот здесь не совсем понятно: для чего нужно именно "10..12", если положительное число в десятичной записи не может занимать больше 10 знаков?
    Эту функцию я на pastebin выкладывал ещё году в 2015-ом и, если честно, не совсем помню какой логикой я руководствовался при написании этого кода



    В общем, как-то так:
      Открыть/закрыть
    1. stock AddDelimiterToInt(number, const delimiter[2] = ".")
    2. {
    3. new int_string[14+1];
    4. if(number == cellmin)
    5. int_string = "2147483648";
    6. else
    7. format(int_string, sizeof(int_string), "%d", number >= 0 ? number : -number);
    8.  
    9. new value = strlen(int_string);
    10. switch(value)
    11. {
    12. case 4..6:
    13. {
    14. strins(int_string, delimiter, value-3,1);
    15. }
    16. case 7..9:
    17. {
    18. strins(int_string, delimiter, value-3,1);
    19. strins(int_string, delimiter, value-6,1);
    20. }
    21. case 10:
    22. {
    23. strins(int_string, delimiter, value-3,1);
    24. strins(int_string, delimiter, value-6,1);
    25. strins(int_string, delimiter, value-9,1);
    26. }
    27. }
    28. if(number < 0) strins(int_string, "-", 0);
    29. return int_string;
    30. }


    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    не считая перестановки всех элементов массива при вставке "-" (наверняка можно реализовать это как-то получше)
    Если ты про
    1. format(int_string, sizeof(int_string), "%d", number >= 0 ? number : -number);
    2. //...
    3. if(number < 0) strins(int_string, "-", 0);

    Тут я ничего лучше пока придумать не могу. При добавлении разделителя минус всё равно нужно учитывать, чтоб функция не добавила разделитель прямо после минуса в числах, а-ля "-100" или "-100000".
    Последний раз редактировалось DeimoS; 29.08.2019 в 12:16.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  11. #10
    Аватар для Геннадий Литвинов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.08.2019
    Адрес
    Казахстан
    Сообщений
    8
    Репутация:
    0 ±
    А точки или запятые можно ли так поставить

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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