Здравствуйте.
Как добавить пробелы между числами как на скринах? https://imgur.com/a/
Вид для печати
Здравствуйте.
Как добавить пробелы между числами как на скринах? https://imgur.com/a/
stock AddDelimiterToInt(number, delimiter[2] = ".") { new int_string[14+1]; switch(value) { case 4..6: { } case 7..9: { } case 10..12: { } } return int_string; }
Использование:
new string[20+14+1];
Ещё вариант, с поддержкой Float и других тегов.
/* FormatNumber by Slice. ------------------------- Usage: FormatNumber( number, decimals, thousand seperator, decimal point ) number - This can be any variable type (float, integer, bool, etc.) If you want the value to be printed as HEX, tag the variable with hex. Example: new myvariable = 5312851; FormatNumber( hex:myvariable ); // gives 0x00511153 Additionaly, you can print out the bits of either the first byte or the whole cell by using the following tags: bit:, bit_byte: If you get a type error, tag the variable with _. Example: new omgomg:specialVariable = omgomg:5; FormatNumber( _:specialVariable ); // gives 5 decimals - The number of decimals to show new mynumber = 50; FormatNumber( mynumber, 2 ); // gives 50.00 new Float:myfloat = 123.456; FormatNumber( myfloat, 0 ); // gives 123 thousand seperator - char between thousands new mynumber = 5000000000; FormatNumber( myfloat ); // gives 5 000 000 000 FormatNumber( myfloat, 0, ',' ); // gives 5,000,000,000 FormatNumber( myfloat, 0, 0 ); // gives 5000000000 decimal point - duh new myfloat = 50.0; FormatNumber( myfloat, 2, ' ', ',' ); // gives 50,00 FormatNumber( myfloat, 2, ' ', '~' ); // gives 50~00 You can set these constants __before__ including this file: HEX_PREFIX - default value "0x". Example: #define HEX_PREFIX "#" #include <formatnumber.inc> FormatNumber( hex:50000 ); // gives #0000C350 BIT_PREFIX - default value: "0b" DEFAULT_DECIMAL_COUNT - default value: 8 DEFAULT_THOUSAND_SEP - default value: ' ' DEFAULT_DECIMAL_POINT - default value: '.' */ #if defined _formatnumber_included #endinput #else #define _formatnumber_included #endif #if !defined HEX_PREFIX #define HEX_PREFIX "0x" #endif #if !defined BIT_PREFIX #define BIT_PREFIX "0b" #endif #if !defined DEFAULT_DECIMAL_COUNT #define DEFAULT_DECIMAL_COUNT 8 #endif #if !defined DEFAULT_THOUSAND_SEP #define DEFAULT_THOUSAND_SEP ' ' #endif #if !defined DEFAULT_DECIMAL_POINT #define DEFAULT_DECIMAL_POINT '.' #endif 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 ) ) { static s_szReturn[ 32 ], s_szThousandSeparator[ 2 ] = { ' ', EOS }, s_iDecimalPos, s_iChar, s_iSepPos, bool:s_isNegative ; if ( iTag == tagof( bool: ) ) { if ( xVariable ) else return s_szReturn; } else if ( iTag == tagof( Float: ) ) { if ( iDecimals == -1 ) iDecimals = DEFAULT_DECIMAL_COUNT; } else if ( iTag == tagof( hex: ) || iTag == tagof( Hex: ) ) { format( s_szReturn, sizeof( s_szReturn ), HEX_PREFIX "%04h%04h", ( xVariable & ( 0xFFFF0000 ) ) >>> 16, xVariable & ( 0x0000FFFF ) ); return s_szReturn; } else if ( iTag == tagof( bit: ) || iTag == tagof( Bit: ) ) { format( s_szReturn, sizeof( s_szReturn ), BIT_PREFIX "%08b%08b%08b%08b", ( xVariable & 0xFF000000 ) >>> 24, ( xVariable & 0x00FF0000 ) >>> 16, ( xVariable & 0x0000FF00 ) >>> 8, ( xVariable & 0x000000FF ) ); return s_szReturn; } else if ( iTag == tagof( bit_byte: ) ) { return s_szReturn; } else { if ( iDecimals > 0 ) { while ( iDecimals-- ) } s_iDecimalPos = -1; } if ( s_iDecimalPos == -1 ) else s_szReturn[ s_iDecimalPos ] = iDecimalPoint; if ( s_iDecimalPos >= 4 && iThousandSeparator ) { s_szThousandSeparator[ 0 ] = iThousandSeparator; s_iChar = s_iDecimalPos; s_iSepPos = 0; s_isNegative = s_szReturn[0] == '-'; while ( --s_iChar > _:s_isNegative ) { if ( ++s_iSepPos == 3 ) { s_iSepPos = 0; } } } return s_szReturn; }
Сделал свою версию
stock AddDelimiterToInt(value, const space[] = " ") { new string[16], i, k, v = 3, s; i = k/3; k %= 3; if (k != 0) { k++; } while (--i > 0) { k += v; v++; } if (value < 0) return string; }
Если параметр number имеет минимально возможное значение cellmin (-2147483648), то выражение (-number) выдаст 0. Да, так работает целочисленная арифметика: у минимального отрицательного значения нет положительного аналога, и нужно всегда иметь это в виду! Собственно, по той же причине и format() не может вывести это значение правильно, выдавая "--".
Вот здесь не совсем понятно: для чего нужно именно "10..12", если положительное число в десятичной записи не может занимать больше 10 знаков?
За примерами далеко ходить не нужно (см. примечания по багам), можно добиться и записи за пределы массива, и зависания "намертво".
Вообще, ИМХО, вариант DeimoS'а выглядит почти идеальным, не считая перестановки всех элементов массива при вставке "-" (наверняка можно реализовать это как-то получше) и ещё пары уже упомянутых нюансов. Также настораживает в том варианте повторяющийся код внутри switch, но это такая особенность Pawn, что нельзя сделать, чтобы из одного case нельзя было "провалиться" в следующий, как в C/C++. Впрочем, это не ещё значит, что такую возможность нельзя добавить в компилятор :)
Да, точно. Если честно, уже давно не вчитывался в код, который я там понаписал. Помнил просто, что, вроде как, всё работало и этот вариант быстрее варианта с циклом, поэтому и не парился. Мой косяк :D
Эту функцию я на pastebin выкладывал ещё году в 2015-ом и, если честно, не совсем помню какой логикой я руководствовался при написании этого кода :scratch_one-s_head:
В общем, как-то так:
Если ты про
Тут я ничего лучше пока придумать не могу. При добавлении разделителя минус всё равно нужно учитывать, чтоб функция не добавила разделитель прямо после минуса в числах, а-ля "-100" или "-100000".
А точки или запятые можно ли так поставить