Skip to content

Commit b0cb75a

Browse files
committed
improve float-string conversion: rounding and non-numbers
1 parent 7b975d9 commit b0cb75a

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

cpp/arduino/WString.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ class String: public string
3838
return 0 <= val ? ret : string("-") + ret;
3939
}
4040

41+
static string dtoas(double val, int decimalPlaces) {
42+
double r = 0.5 * pow(0.1, decimalPlaces); // make sure that integer truncation will properly round
43+
val += val > 0 ? r : -r;
44+
if (isnan(val)) return "nan";
45+
if (isinf(val)) return "inf";
46+
if (val > 4294967040.0) return "ovf";
47+
if (val <-4294967040.0) return "ovf";
48+
return mytoas(val, 10) + "." + mytoa(abs(val - (long)val) * pow(10, decimalPlaces), 10);
49+
}
50+
4151
public:
4252
~String(void) {}
4353
String(const char *cstr = ""): string(cstr) {}
@@ -51,10 +61,8 @@ class String: public string
5161
explicit String(long val, unsigned char base=10): string(mytoas(val, base)) {}
5262
explicit String(unsigned long val, unsigned char base=10): string(mytoa(val, base)) {}
5363

54-
explicit String(float val, unsigned char decimalPlaces=2):
55-
string(mytoas(val, 10) + "." + mytoa(abs(val - (long)val) * pow(10, decimalPlaces), 10)) {}
56-
explicit String(double val, unsigned char decimalPlaces=2):
57-
string(mytoas(val, 10) + "." + mytoa(abs(val - (long)val) * pow(10, decimalPlaces), 10)) {}
64+
explicit String(float val, unsigned char decimalPlaces=2): string(dtoas(val, decimalPlaces)) {}
65+
explicit String(double val, unsigned char decimalPlaces=2): string(dtoas(val, decimalPlaces)) {}
5866

5967
String & operator = (const String &rhs) { assign(rhs); return *this; }
6068
String & operator = (const char *cstr) { assign(cstr); return *this; }

0 commit comments

Comments
 (0)