From 0778f8a3f3afa6c714a0126830600ca9450cbd28 Mon Sep 17 00:00:00 2001
From: Ryan Esteves <snargledorf@gmail.com>
Date: Wed, 5 Jun 2013 14:08:59 -0400
Subject: [PATCH 1/2] Added remove methods to WString

---
 hardware/arduino/cores/arduino/WString.cpp | 16 ++++++++++++++++
 hardware/arduino/cores/arduino/WString.h   |  2 ++
 2 files changed, 18 insertions(+)

diff --git a/hardware/arduino/cores/arduino/WString.cpp b/hardware/arduino/cores/arduino/WString.cpp
index c6839fc0d..aab2a5476 100644
--- a/hardware/arduino/cores/arduino/WString.cpp
+++ b/hardware/arduino/cores/arduino/WString.cpp
@@ -604,6 +604,22 @@ void String::replace(const String& find, const String& replace)
 	}
 }
 
+void String::remove(unsigned int index){
+	if (index >= len) { return; }
+	int count = len - index;
+	remove(index, count);
+}
+
+void String::remove(unsigned int index, unsigned int count){
+	if (index >= len) { return; }
+	if (count <= 0) { return; }
+	if (index + count > len) { count = len - index; }
+	char *writeTo = buffer + index;
+	len = len - count;
+	strncpy(writeTo, buffer + index + count,len - index);
+	buffer[len] = 0;
+}
+
 void String::toLowerCase(void)
 {
 	if (!buffer) return;
diff --git a/hardware/arduino/cores/arduino/WString.h b/hardware/arduino/cores/arduino/WString.h
index 642b016c5..b587a3d62 100644
--- a/hardware/arduino/cores/arduino/WString.h
+++ b/hardware/arduino/cores/arduino/WString.h
@@ -164,6 +164,8 @@ public:
 	// modification
 	void replace(char find, char replace);
 	void replace(const String& find, const String& replace);
+	void remove(unsigned int index);
+	void remove(unsigned int index, unsigned int count);
 	void toLowerCase(void);
 	void toUpperCase(void);
 	void trim(void);

From 82a2c1d3d968fcf852b63ccac5100d241f6ab17c Mon Sep 17 00:00:00 2001
From: Tevin Zhang <mail2tevin@gmail.com>
Date: Wed, 29 May 2013 10:42:07 +0800
Subject: [PATCH 2/2] add String.toFloat

---
 hardware/arduino/cores/arduino/WString.cpp | 45 ++++++++++++++++++++++
 hardware/arduino/cores/arduino/WString.h   |  7 ++++
 2 files changed, 52 insertions(+)

diff --git a/hardware/arduino/cores/arduino/WString.cpp b/hardware/arduino/cores/arduino/WString.cpp
index aab2a5476..e19f54343 100644
--- a/hardware/arduino/cores/arduino/WString.cpp
+++ b/hardware/arduino/cores/arduino/WString.cpp
@@ -100,6 +100,19 @@ String::String(unsigned long value, unsigned char base)
 	*this = buf;
 }
 
+String::String(float value, int decimalPlaces)
+{
+	init();
+	char buf[33];
+	*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
+}
+
+String::String(double value, int decimalPlaces)
+{
+	init();
+	char buf[33];
+	*this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
+}
 String::~String()
 {
 	free(buffer);
@@ -283,6 +296,20 @@ unsigned char String::concat(unsigned long num)
 	return concat(buf, strlen(buf));
 }
 
+unsigned char String::concat(float num)
+{
+	char buf[20];
+	char* string = dtostrf(num, 8, 6, buf);
+	return concat(string, strlen(string));
+}
+
+unsigned char String::concat(double num)
+{
+	char buf[20];
+	char* string = dtostrf(num, 8, 6, buf);
+	return concat(string, strlen(string));
+}
+
 /*********************************************/
 /*  Concatenate                              */
 /*********************************************/
@@ -343,6 +370,19 @@ StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
 	return a;
 }
 
+StringSumHelper & operator + (const StringSumHelper &lhs, float num)
+{
+	StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
+	if (!a.concat(num)) a.invalidate();
+	return a;
+}
+
+StringSumHelper & operator + (const StringSumHelper &lhs, double num)
+{
+	StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
+	if (!a.concat(num)) a.invalidate();
+	return a;
+}
 /*********************************************/
 /*  Comparison                               */
 /*********************************************/
@@ -659,3 +699,8 @@ long String::toInt(void) const
 }
 
 
+float String::toFloat(void) const
+{
+	if (buffer) return float(atof(buffer));
+	return 0;
+}
diff --git a/hardware/arduino/cores/arduino/WString.h b/hardware/arduino/cores/arduino/WString.h
index b587a3d62..2d372c5af 100644
--- a/hardware/arduino/cores/arduino/WString.h
+++ b/hardware/arduino/cores/arduino/WString.h
@@ -68,6 +68,8 @@ public:
 	explicit String(unsigned int, unsigned char base=10);
 	explicit String(long, unsigned char base=10);
 	explicit String(unsigned long, unsigned char base=10);
+    explicit String(float, int decimalPlaces=6);
+    explicit String(double, int decimalPlaces=6);
 	~String(void);
 
 	// memory management
@@ -100,6 +102,8 @@ public:
 	unsigned char concat(unsigned int num);
 	unsigned char concat(long num);
 	unsigned char concat(unsigned long num);
+	unsigned char concat(float num);
+	unsigned char concat(double num);
 	
 	// if there's not enough memory for the concatenated value, the string
 	// will be left unchanged (but this isn't signalled in any way)
@@ -120,6 +124,8 @@ public:
 	friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num);
 	friend StringSumHelper & operator + (const StringSumHelper &lhs, long num);
 	friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num);
+	friend StringSumHelper & operator + (const StringSumHelper &lhs, float num);
+	friend StringSumHelper & operator + (const StringSumHelper &lhs, double num);
 
 	// comparison (only works w/ Strings and "strings")
 	operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; }
@@ -172,6 +178,7 @@ public:
 
 	// parsing/conversion
 	long toInt(void) const;
+	float toFloat(void) const;
 
 protected:
 	char *buffer;	        // the actual char array