Added numeric conversion to opp strings

This commit is contained in:
drmortalwombat 2023-08-15 16:55:58 +02:00
parent 952d087a2b
commit 82dff88ba8
2 changed files with 534 additions and 1 deletions

View File

@ -573,4 +573,521 @@ int string::find(char c, char pos) const
return -1; return -1;
} }
} string to_string(int val)
{
char buffer[10];
bool sign = false;
if (val < 0)
{
val = -val;
sign = true;
}
char i = 10;
while (val)
{
char d = val % 10;
val /= 10;
buffer[--i] = d + '0';
}
if (i == 10)
buffer[--i] = '0';
if (sign)
buffer[--i] = '-';
return string(buffer + i, 10 - i);
}
string to_string(long val)
{
char buffer[12];
bool sign = false;
if (val < 0)
{
val = -val;
sign = true;
}
char i = 12;
while (val)
{
char d = val % 10;
val /= 10;
buffer[--i] = d + '0';
}
if (i == 12)
buffer[--i] = '0';
if (sign)
buffer[--i] = '-';
return string(buffer + i, 12 - i);
}
string to_string(unsigned int val)
{
char buffer[10];
char i = 10;
while (val)
{
char d = val % 10;
val /= 10;
buffer[--i] = d + '0';
}
if (i == 10)
buffer[--i] = '0';
return string(buffer + i, 10 - i);
}
string to_string(unsigned long val)
{
char buffer[12];
char i = 12;
while (val)
{
char d = val % 10;
val /= 10;
buffer[--i] = d + '0';
}
if (i == 12)
buffer[--i] = '0';
return string(buffer + i, 12 - i);
}
static float fround5[] = {
0.5e-0, 0.5e-1, 0.5e-2, 0.5e-3, 0.5e-4, 0.5e-5, 0.5e-6
};
string to_string(float val)
{
char buffer[20];
char d = 0;
float f = val;
if (f < 0.0)
{
f = -f;
buffer[d++] = '-';
}
char prefix = d;
if (isinf(f))
{
buffer[d++] = 'I';
buffer[d++] = 'N';
buffer[d++] = 'F';
}
else
{
int exp = 0;
char fdigits = 6;
if (f != 0.0)
{
while (f >= 1000.0)
{
f /= 1000;
exp += 3;
}
while (f < 1.0)
{
f *= 1000;
exp -= 3;
}
while (f >= 10.0)
{
f /= 10;
exp ++;
}
}
char digits = fdigits + 1;
while (exp < 0)
{
f /= 10.0;
exp++;
}
digits = fdigits + exp + 1;
if (digits < 7)
f += fround5[digits - 1];
else
f += fround5[6];
if (f >= 10.0)
{
f /= 10.0;
fdigits--;
}
char pdigits = digits - fdigits;
if (digits > 20)
digits = 20;
if (pdigits == 0)
buffer[d++] = '0';
for(char i=0; i<digits; i++)
{
if (i == pdigits)
buffer[d++] = '.';
if (i > 6)
buffer[d++] = '0';
else
{
int c = (int)f;
f -= (float)c;
f *= 10.0;
buffer[d++] = c + '0';
}
}
}
return string(buffer, d);
}
int string::to_int(char * idx, char base) const
{
char i = 1;
unsigned n = 0;
bool sign = false;
if (cstr)
{
const char * cp = cstr;
char ch = cp[i];
if (ch == '-')
{
sign = true;
ch = cp[++i];
}
else if (ch == '+')
ch = cp[++i];
if (ch == '0' && base == 0)
{
ch = cp[++i];
if (ch == 'x' || ch == 'X')
{
base = 16;
ch = cp[++i];
}
else if (ch == 'b' || ch == 'B')
{
base = 2;
ch = cp[++i];
}
}
for(;;)
{
char d;
if (ch >= '0' && ch <= '9')
d = (ch - '0');
else if (base > 10 && ch >= 'A' && ch <= 'F')
d = (ch - 'A' + 10);
else if (base > 10 && ch >= 'a' && ch <= 'f')
d = (ch - 'a' + 10);
else
break;
n = n * base + d;
ch = cp[++i];
}
}
if (idx)
*idx = i - 1;
if (sign)
return -(int)n;
else
return n;
}
long string::to_long(char * idx, char base) const
{
char i = 1;
unsigned long n = 0;
bool sign = false;
if (cstr)
{
const char * cp = cstr;
char ch = cp[i++];
if (ch == '-')
{
sign = true;
ch = cp[i++];
}
else if (ch == '+')
ch = cp[i++];
if (ch == '0' && base == 0)
{
ch = cp[i++];
if (ch == 'x' || ch == 'X')
{
base = 16;
ch = cp[i++];
}
else if (ch == 'b' || ch == 'B')
{
base = 2;
ch = cp[i++];
}
}
for(;;)
{
char d;
if (ch >= '0' && ch <= '9')
d = (ch - '0');
else if (base > 10 && ch >= 'A' && ch <= 'F')
d = (ch - 'A' + 10);
else if (base > 10 && ch >= 'a' && ch <= 'f')
d = (ch - 'a' + 10);
else
break;
n = n * base + d;
ch = cp[i++];
}
i--;
}
if (idx)
*idx = i - 1;
if (sign)
return -(long)n;
else
return n;
}
unsigned string::to_uint(char * idx, char base) const
{
char i = 1;
unsigned n = 0;
if (cstr)
{
const char * cp = cstr;
char ch = cp[i];
if (ch == '0' && base == 0)
{
ch = cp[++i];
if (ch == 'x' || ch == 'X')
{
base = 16;
ch = cp[++i];
}
else if (ch == 'b' || ch == 'B')
{
base = 2;
ch = cp[++i];
}
}
for(;;)
{
char d;
if (ch >= '0' && ch <= '9')
d = (ch - '0');
else if (base > 10 && ch >= 'A' && ch <= 'F')
d = (ch - 'A' + 10);
else if (base > 10 && ch >= 'a' && ch <= 'f')
d = (ch - 'a' + 10);
else
break;
n = n * base + d;
ch = cp[++i];
}
}
if (idx)
*idx = i - 1;
return n;
}
unsigned long string::to_ulong(char * idx, char base) const
{
char i = 1;
unsigned long n = 0;
if (cstr)
{
const char * cp = cstr;
char ch = cp[i++];
if (ch == '0' && base == 0)
{
ch = cp[i++];
if (ch == 'x' || ch == 'X')
{
base = 16;
ch = cp[i++];
}
else if (ch == 'b' || ch == 'B')
{
base = 2;
ch = cp[i++];
}
}
for(;;)
{
char d;
if (ch >= '0' && ch <= '9')
d = (ch - '0');
else if (base > 10 && ch >= 'A' && ch <= 'F')
d = (ch - 'A' + 10);
else if (base > 10 && ch >= 'a' && ch <= 'f')
d = (ch - 'a' + 10);
else
break;
n = n * base + d;
ch = cp[i++];
}
i--;
}
if (idx)
*idx = i - 1;
return n;
}
float string::to_float(char * idx) const
{
char i = 1;
float vf = 0;
bool sign = false;
if (cstr)
{
const char * cp = cstr;
char ch = cp[i++];
if (ch == '-')
{
sign = true;
ch = cp[i++];
}
else if (ch == '+')
ch = cp[i++];
if (ch >= '0' && ch <= '9' || ch == '.')
{
while (ch >= '0' && ch <= '9')
{
vf = vf * 10 + (int)(ch - '0');
ch = cp[i++];
}
if (ch == '.')
{
float digits = 1.0;
ch = cp[i++];
while (ch >= '0' && ch <= '9')
{
vf = vf * 10 + (int)(ch - '0');
digits *= 10;
ch = cp[i++];
}
vf /= digits;
}
char e = 0;
bool eneg = false;
if (ch == 'e' || ch == 'E')
{
ch = cp[i++];
if (ch == '-')
{
eneg = true;
ch = cp[i++];
}
else if (ch == '+')
{
ch = cp[i++];
}
while (ch >= '0' && ch <= '9')
{
e = e * 10 + ch - '0';
ch = cp[i++];
}
}
if (e)
{
if (eneg)
{
while (e > 6)
{
vf /= 1000000.0;
e -= 6;
}
vf /= tpow10[e];
}
else
{
while (e > 6)
{
vf *= 1000000.0;
e -= 6;
}
vf *= tpow10[e];
}
}
}
i--;
}
if (idx)
*idx = i - 1;
if (sign)
return -vf;
else
return vf;
}
}

View File

@ -70,12 +70,28 @@ public:
int find(char c, char pos) const; int find(char c, char pos) const;
void copyseg(char * p, char at, char num) const; void copyseg(char * p, char at, char num) const;
int to_int(char * idx = nullptr, char base = 10) const;
long to_long(char * idx = nullptr, char base = 10) const;
unsigned to_uint(char * idx = nullptr, char base = 10) const;
unsigned long to_ulong(char * idx = nullptr, char base = 10) const;
float to_float(char * idx = nullptr) const;
protected: protected:
string(char l, char * b); string(char l, char * b);
}; };
void swap(string & u, string & v); void swap(string & u, string & v);
string to_string(int val);
string to_string(long val);
string to_string(unsigned int val);
string to_string(unsigned long val);
string to_string(float val);
} }
#pragma compile("string.cpp") #pragma compile("string.cpp")