Библиотеки: Функция для разделения тысячных знаков пробелом.

 

Функция для разделения тысячных знаков пробелом.:

Функция помогает помогает разбить большие числа пробелом для удобного визуального восприятия.

Функция для разделения тысячных знаков пробелом.

Автор: Aleksandr Krokhalev

 
В кои времена, хоть что-то полезное добавлено в кодабазу. 
 
Наверное, можно значительно лаконичнее и производительнее сделать решение.
 
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:

Тоже решил размяться)))

PS: Всем привет!!!

Ну да… Этот код будет покруче чем у fxsaber. Особенно если писать за деньги и считать стоимость по количеству строк…)))
 

HINT: если в локале поставить нужную опцию, то это действие __должен__ выполнять обычный StringFormat("%f %d")

смотрим https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/reference/setlocale-wsetlocale

особенно про LC_NUMERIC и разделители групп

setlocale, _wsetlocale
setlocale, _wsetlocale
  • 2021.06.08
  • TylerMSFT
  • docs.microsoft.com
Описывает функции библиотеки среды выполнения Microsoft C (CRT) setlocale и _wsetlocale .