В кои времена, хоть что-то полезное добавлено в кодабазу.
Наверное, можно значительно лаконичнее и производительнее сделать решение.
fxsaber:
Наверное, можно значительно лаконичнее и производительнее сделать решение.
Наверное, можно значительно лаконичнее и производительнее сделать решение.
да, именно поэтому база не пополняется среди пользователей)
fxsaber:
Наверное, можно значительно лаконичнее и производительнее сделать решение.
Наверное, можно значительно лаконичнее и производительнее сделать решение.
для целого числа этот код должен работать:
void OnStart() { string s = "1234567890"; ushort result[], sep[] = {' '}; StringToShortArray(s, result); for(int i = ArraySize(result) - 4; i > 0; i -= 3) { ArrayInsert(result, sep, i); } Print(ShortArrayToString(result)); }
Igor Makanu:
для целого числа этот код должен работать:
Другой вариант.
#define MACROS(A) ((A >= 1000) ? IntegerToString(A % 1000, 3, '0') : (string)(A % 1000)) void OnStart() { long Num = 1234567890; string StrOut = MACROS(Num); while ((bool)(Num /= 1000)) StrOut = MACROS(Num) + " " + StrOut; Print(StrOut); }
#define SEP ' ' string SeparatorFast(string value){ int len=StringLen(value), dot=StringFind(value,"."), i=0, ii=0; if (dot<0) dot=len; int sep=dot%3; if (!sep) sep+=3; else if (sep==1&&value[0]=='-') sep=4; string ret; StringReserve(ret,len+len/3); while(i<dot){ StringSetCharacter(ret,ii++,value[i++]); if(!--sep&&i!=dot){ StringSetCharacter(ret,ii++,SEP) ; sep=3; } } while(i<len) StringSetCharacter(ret,ii++,value[i++]); return ret; } template<typename Type> string Separator(Type value){ return SeparatorFast(IntegerToString(value)); } string Separator(string value){ string parts[]; int k=StringSplit(value,'.',parts); if (k<1||k>2) return NULL; if (k==2&&(string)(ulong)parts[1]!=parts[1]) return NULL; bool isMinus=parts[0][0]=='-'; if (k==2){ if (parts[0]==""||parts[0]=="-") parts[0]+="0"; } if (isMinus){ if ((k!=2||parts[0]!="-0")&&(string)(long)parts[0]!=parts[0]) return NULL; } else if ((string)(ulong)parts[0]!=parts[0]) return NULL; return SeparatorFast(parts[0])+"."+parts[1]; } string Separator(double val,int digits=8){ return SeparatorFast(DoubleToString(val,digits)); } string Separator(float val,int digits=8){ return SeparatorFast(DoubleToString(val,digits)); } void OnStart(){ int a=3456; int b=-54321; double c=1234567.0987; float d=-0.543670f; Print("Выведем число через функцию: "+Separator(a)); Print("Выведем число через функцию: "+Separator(b)); Print("Выведем число через функцию: "+Separator(c)); Print("Выведем число через функцию: "+Separator(d)); Print("Выведем число через функцию: "+Separator("-.76543")); }
Тоже решил размяться)))
PS: Всем привет!!!
Vladimir Simakov:
Ну да… Этот код будет покруче чем у fxsaber. Особенно если писать за деньги и считать стоимость по количеству строк…)))
Тоже решил размяться)))
PS: Всем привет!!!
HINT: если в локале поставить нужную опцию, то это действие __должен__ выполнять обычный StringFormat("%f %d")
смотрим https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/reference/setlocale-wsetlocale
особенно про LC_NUMERIC и разделители групп
setlocale, _wsetlocale
- 2021.06.08
- TylerMSFT
- docs.microsoft.com
Описывает функции библиотеки среды выполнения Microsoft C (CRT) setlocale и _wsetlocale .
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Функция для разделения тысячных знаков пробелом.:
Функция помогает помогает разбить большие числа пробелом для удобного визуального восприятия.
Автор: Aleksandr Krokhalev