Skip to content
Snippets Groups Projects
Commit 65036cd7 authored by stefan's avatar stefan
Browse files

Fixed float to string function (LPaddedFloat)

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2267 5a81b35b-ba03-0410-adc8-b2c5c5119f08
parent cb21e2f6
No related branches found
No related tags found
No related merge requests found
#ifndef OST_IO_FORMATTED_LINE_HH #ifndef OST_IO_FORMATTED_LINE_HH
#define OST_IO_FORMATTED_LINE_HH #define OST_IO_FORMATTED_LINE_HH
#ifdef _MSC_VER
#define snprintf _snprintf
#endif
#include <cstdio>
#include <ost/string_ref.hh> #include <ost/string_ref.hh>
/* /*
...@@ -68,43 +74,58 @@ struct LPaddedInt { ...@@ -68,43 +74,58 @@ struct LPaddedInt {
struct LPaddedFloat { struct LPaddedFloat {
LPaddedFloat(Real val, int prec) LPaddedFloat(Real val, int prec)
{ {
Real rounded_val=round(val*pow(Real(10), prec))*pow(Real(0.1), prec); switch(prec){
size_t curr=0; case 0:
bool minus=rounded_val<0; len = snprintf(data, sizeof(data), "%.0f", val);
rounded_val=std::abs(rounded_val); break;
int int_val=int(rounded_val); case 1:
if (minus) { len = snprintf(data, sizeof(data), "%.1f", val);
data[curr]='-'; break;
++curr; case 2:
len = snprintf(data, sizeof(data), "%.2f", val);
break;
case 3:
len = snprintf(data, sizeof(data), "%.3f", val);
break;
default:
Real rounded_val=round(val*pow(Real(10), prec))*pow(Real(0.1), prec);
size_t curr=0;
bool minus=rounded_val<0;
rounded_val=std::abs(rounded_val);
int int_val=int(rounded_val);
if (minus) {
data[curr]='-';
++curr;
}
do {
int m=int_val%10;
data[curr]='0'+m;
++curr;
int_val/=10;
} while(int_val);
// swap
for (size_t i=0, e=(curr-int(minus))/2; i<e; ++i) {
std::swap(data[int(minus)+i], data[curr-i-1]);
}
data[curr]='\0';
len=curr;
if (prec==0) {
return;
}
data[curr]='.';
curr++;
rounded_val-=int(rounded_val);
while(prec>0) {
rounded_val*=10;
int m=int(rounded_val);
rounded_val-=int(rounded_val);
data[curr]='0'+m;
curr++;
--prec;
}
data[curr]='\0';
len=curr;
} }
do {
int m=int_val%10;
data[curr]='0'+m;
++curr;
int_val/=10;
} while(int_val);
// swap
for (size_t i=0, e=(curr-int(minus))/2; i<e; ++i) {
std::swap(data[int(minus)+i], data[curr-i-1]);
}
data[curr]='\0';
len=curr;
if (prec==0) {
return;
}
data[curr]='.';
curr++;
rounded_val-=int(rounded_val);
while(prec>0) {
rounded_val*=10;
int m=int(rounded_val);
rounded_val-=int(rounded_val);
data[curr]='0'+m;
curr++;
--prec;
}
data[curr]='\0';
len=curr;
} }
char data[20]; char data[20];
size_t len; size_t len;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment