Not registered yet?
Register now! It is easy and done in 1 minute and gives you access to special discounts and much more!
I have this arduino sketch,
float temp = 10.55;
sprintf(temperature,"%f F", temp);
temperature prints out as
Any thoughts on how to format this float? I need it to be a char string.
I've struggled for a few hours on getting this right, but I did finally. And this uses modern Espressif C++ provided by Platformio, and my target MCU is an ESP32.
I wanted to display a prefix label, the float/int value, then the unit, all inline.
I can't relay on seperate Serial.print() statements, as I am using an OLED display.
Here's my code example:
int strLenLight = sizeof("Light ADC: 0000");
int strLenTemp = sizeof("Temp: 000.0 °C");
int strLenHumd = sizeof("Humd: 00.0 %");
char displayLight[strLenLight] = "Light ADC: ";
char displayTemp[strLenTemp] = "Temp: ";
char displayHumd[strLenHumd] = "Humd: ";
snprintf(strchr(displayLight, '\0'), sizeof(displayLight), "%d", light_value);
snprintf(strchr(displayTemp, '\0'), sizeof(displayTemp), "%.1f °C", temperature);
snprintf(strchr(displayHumd, '\0'), sizeof(displayHumd), "%.1f %%", humidity);
Light ADC: 1777
Temp: 25.4 °C
Humd: 55.0 %
dtostrf() is deprecated, and it doesn't exist on every board core platforms.
On the other hand, sprintf() doesn't format floats on AVR platforms!
The sprintf() linked by default does not support %f, but you can link in a full version of sprintf() if required.
As has been stated before Float support is not included in sprintf on Arduino.
Arduino has its own String class.
String value = String(3.14);
char *result = value.c_str();
Constructs an instance of the String class. There are multiple versions that construct Strings from different data types (i.e. format them as sequences of characters), including:
Important notice to the pointer above: "When you modify the String object, or when it is destroyed, any pointer previously returned by c_str() becomes invalid and should not be used any longer."
I would say, obviously, but yes, that is an excellent point for people new to Arduino programming.
Arduino's String class does not have a method that accepts float or double. This only works because it converts it to an integer.
@CameronLowellPalmer You're right, my mistake. The most recent Arduino release does include String support for double and float. I'm using an older release included with Ubuntu that pre-dates this, and throws a compiler error when I try to pass a float to String().
Caution: just a tedious yet important note about String class for newbies: it dynamically allocates/deallocates heap memory, because of this it is a great generator of "heap-fragmentation" in the long run. Try to keep its use limited preferring C-style strings. More about Arduino memory caveats
It even takes second parameter as precision, String(3.1434, 4)
Due to some performance reasons %f is not included in the Arduino's implementation of sprintf(). A better option would be to use dtostrf() - you convert the floating point value to a C-style string, Method signature looks like:
char *dtostrf(double val, signed char width, unsigned char prec, char *s)
Use this method to convert it to a C-Style string and then use sprintf, eg:
/* 4 is mininum width, 2 is precision; float value is copied onto str_temp*/
dtostrf(temp, 4, 2, str_temp);
sprintf(temperature,"%s F", str_temp);
You can change the minimum width and precision to match the float you are converting.
Worked fine in my case. Thumbs up!
just a caution, the width of your buffer: str_temp is very tight at 6 characters