#include <cmath>
#include <cstring>
/*
unsigned int strlen(const char *str){
const char *p = str;
for(; *str; str++);
return str - p;
}*/
#include <iostream>
double RoundTo(double valor, int decimais){
decimais = int(pow(10.0, decimais));
return (floor(valor * decimais +.5) / decimais);
}
int str2int(const char *str){
int lenght = strlen(str), s = 0;
int number = 0;
if(str[0] == '-')
s++;
for(; s < lenght && str[s] >= '0' && str[s] <= '9'; s++){
number += (str[s] - 48) * pow(10, (lenght - s) - 1);
}
if(str[0] == '-')
number *= -1;
return number;
}
unsigned int str2uint(const char *str){
int lenght = strlen(str), s = 0;
unsigned int number = 0;
for(; s < lenght && str[s] >= '0' && str[s] <= '9'; s++){
number += (str[s] - 48) * pow(10, (lenght - s) - 1);
}
return number;
}
float str2float(const char *str){
char buffer[256];
const char* p = strrchr(str, '.');
int i = (int)str, exp;
bool negative = false;
float result;
if(str[0] == '-'){
i++;
negative = true;
}
memcpy(buffer, (const void*)i, (size_t)(p - i));
buffer[(size_t)(p - i)] = 0;
exp = strlen(p) - 1;
result = float(str2int(p + 1)) * pow(10.0, -exp);
result += str2int(buffer);
return negative? -result : result;
}
double str2double(const char *str){
char buffer[256];
const char* p = strrchr(str, '.');
int i = (int)str, exp;
bool negative = false;
double result;
if(str[0] == '-'){
i++;
negative = true;
}
memcpy(buffer, (const void*)i, (size_t)(p - i));
buffer[(size_t)(p - i)] = 0;
exp = strlen(p) - 1;
result = double(str2int(p + 1)) * pow(10.0, double(-exp));
result += str2int(buffer);
return negative? -result : result;
}
long double str2ldouble(const char *str){
char buffer[256];
const char* p = strrchr(str, '.');
int i = (int)str, exp;
bool negative = false;
long double result;
if(str[0] == '-'){
i++;
negative = true;
}
memcpy(buffer, (const void*)i, (size_t)(p - i));
buffer[(size_t)(p - i)] = 0;
exp = strlen(p) - 1;
result = ((long double)str2int(p + 1)) * pow(10.0L, (long double)(-exp));
result += str2int(buffer);
return negative? -result : result;
}
char *int2str(int n, char *dest){
char *b = dest;
int powValue, ignoreZero = true;
memset(dest, '0', sizeof(char) * 10);
if(n < 0) *dest++ = '-', n *= -1;
for(int i = 10, t = 0; i > -1; i--){
powValue = pow(10, i);
t = n / powValue;
if(ignoreZero && t == 0) continue;
*dest++ = t + int('0');
n -= t * powValue;
ignoreZero = false;
}
if(dest == b) *dest++ = '0';
*dest = 0;
return b;
}
char *uint2str(unsigned int n, char *dest){
char *b = dest;
unsigned int powValue, ignoreZero = true;
memset(dest, '0', sizeof(char) * 10);
if(n < 0) *dest++ = '-', n *= -1;
for(int i = 10, t = 0; i > -1; i--){
powValue = pow(10, i);
t = n / powValue;
if(ignoreZero && t == 0) continue;
*dest++ = t + int('0');
n -= t * powValue;
ignoreZero = false;
}
if(dest == b) *dest++ = '0';
*dest = 0;
//dest = b;
//return dest;
return b;
}
char *float2str(float n, char *dest){
double integerPart = floor(n), decimalPart;
int s;
int2str(integerPart, dest);
decimalPart = n - integerPart;
decimalPart *= 1000000000.0L; // Get full precision by multiply decimals with pow(10.0, 9.0);
s = strlen(dest);
dest[s] = '.';
s++;
uint2str(decimalPart, &dest[s]);
s++;
for(int i = strlen(&dest[s]); i > s && dest[i] == '0'; i--){
dest[i] = 0;
}
return dest;
}
char *double2str(double n, char *dest){
double integerPart = floor(n), decimalPart;
int s;
int2str(integerPart, dest);
decimalPart = n - integerPart;
decimalPart *= 1000000000.0L; // Get full precision by multiply decimals with pow(10.0, 9.0);
s = strlen(dest);
dest[s] = '.';
s++;
uint2str(decimalPart, &dest[s]);
for(int i = strlen(&dest[s]); i > s && dest[i] == '0'; i--){
dest[i] = 0;
}
return dest;
}
int main(){
char buffer[256], buffer2[256];
std::cout << str2int("84025") << " " << str2double("512894.07845") << std::endl;
std::cout << int2str(949148289, buffer) << " " << double2str(100.0, buffer2) << "\n";
}