float2str converts floating point numbers to a character array. Its purpose is to have a character representation of floating point numbers when printf floating point support is not enabled by compiler options.

Committer:
Jens
Date:
Fri Dec 09 11:02:00 2016 +0100
Revision:
3:56bf83e1dd1d
Parent:
2:b013360d489a
change to timer functionality

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jensstruemper 0:d8558b73ffd7 1 /*
jensstruemper 0:d8558b73ffd7 2 Copyright (c) 2016 Jens Strümper
jensstruemper 0:d8558b73ffd7 3
jensstruemper 0:d8558b73ffd7 4 Permission is hereby granted, free of charge, to any person obtaining a copy
jensstruemper 0:d8558b73ffd7 5 of this software and associated documentation files (the "Software"), to deal
jensstruemper 0:d8558b73ffd7 6 in the Software without restriction, including without limitation the rights
jensstruemper 0:d8558b73ffd7 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
jensstruemper 0:d8558b73ffd7 8 copies of the Software, and to permit persons to whom the Software is
jensstruemper 0:d8558b73ffd7 9 furnished to do so, subject to the following conditions:
jensstruemper 0:d8558b73ffd7 10
jensstruemper 0:d8558b73ffd7 11 The above copyright notice and this permission notice shall be included in
jensstruemper 0:d8558b73ffd7 12 all copies or substantial portions of the Software.
jensstruemper 0:d8558b73ffd7 13
jensstruemper 0:d8558b73ffd7 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jensstruemper 0:d8558b73ffd7 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jensstruemper 0:d8558b73ffd7 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jensstruemper 0:d8558b73ffd7 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jensstruemper 0:d8558b73ffd7 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jensstruemper 0:d8558b73ffd7 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
jensstruemper 0:d8558b73ffd7 20 THE SOFTWARE.
jensstruemper 0:d8558b73ffd7 21 */
jensstruemper 0:d8558b73ffd7 22
jensstruemper 0:d8558b73ffd7 23 #ifndef MBED_H
jensstruemper 0:d8558b73ffd7 24 #include "mbed.h"
jensstruemper 0:d8558b73ffd7 25 #endif
jensstruemper 0:d8558b73ffd7 26
jensstruemper 0:d8558b73ffd7 27 #ifndef FLOAT2STR_H
Jens 2:b013360d489a 28 #define FLOAT2STR_H 1
jensstruemper 0:d8558b73ffd7 29
jensstruemper 0:d8558b73ffd7 30 namespace js {
jensstruemper 0:d8558b73ffd7 31
jensstruemper 0:d8558b73ffd7 32 /** float2str converts floating point numbers to a character array. Its purpose is to
jensstruemper 0:d8558b73ffd7 33 * have a character representation of floating point numbers when printf floating point support
jensstruemper 0:d8558b73ffd7 34 * is not enabled by compiler options.
jensstruemper 0:d8558b73ffd7 35 *
jensstruemper 0:d8558b73ffd7 36 * This is done by: .
jensstruemper 0:d8558b73ffd7 37 * <ul>
jensstruemper 0:d8558b73ffd7 38 * <li> Separating the integer from the fract part of the floating point number. </li>
jensstruemper 0:d8558b73ffd7 39 * <li> Casting both parts to integer </li>
jensstruemper 0:d8558b73ffd7 40 * <li> Convert the integers to char arrays </li>
jensstruemper 0:d8558b73ffd7 41 * <li> Add the "." seperator and padding zeros behind the "." </li>
jensstruemper 0:d8558b73ffd7 42 * <li> return the compile charater array </li>
jensstruemper 0:d8558b73ffd7 43 * </ul>
jensstruemper 0:d8558b73ffd7 44 * The toString function takes two arguments:
jensstruemper 0:d8558b73ffd7 45 * <ul>
jensstruemper 0:d8558b73ffd7 46 * <li> Floating point number that shall be converted </li>
jensstruemper 0:d8558b73ffd7 47 * <li> Number of digits after the "." </li>
jensstruemper 0:d8558b73ffd7 48 * </ul>
jensstruemper 0:d8558b73ffd7 49 *
jensstruemper 0:d8558b73ffd7 50 * Only callbacks that have been attached will be called by the library.
jensstruemper 0:d8558b73ffd7 51 *
jensstruemper 0:d8558b73ffd7 52 * Example:
jensstruemper 0:d8558b73ffd7 53 * @code
jensstruemper 0:d8558b73ffd7 54 * #include "mbed.h"
jensstruemper 0:d8558b73ffd7 55 * #include "float2str.h"
jensstruemper 0:d8558b73ffd7 56 *
jensstruemper 0:d8558b73ffd7 57 * float number = 13.467472;
jensstruemper 0:d8558b73ffd7 58 * char *string;
jensstruemper 0:d8558b73ffd7 59 *
jensstruemper 0:d8558b73ffd7 60 * int main(){
jensstruemper 0:d8558b73ffd7 61 *
jensstruemper 0:d8558b73ffd7 62 * while(1){
jensstruemper 0:d8558b73ffd7 63 * float number = static_cast <float> (rand()) / (static_cast <float> (100000));
jensstruemper 0:d8558b73ffd7 64 * charArray = toString (number, 5);
jensstruemper 0:d8558b73ffd7 65 * printf ("Char Array: %s Float: %f \r\n", charArray, number );
jensstruemper 0:d8558b73ffd7 66 * wait(1);
jensstruemper 0:d8558b73ffd7 67 * }
jensstruemper 0:d8558b73ffd7 68 * @endcode
jensstruemper 0:d8558b73ffd7 69 *
jensstruemper 0:d8558b73ffd7 70 * This example will convert randomly generated floating point numbers to a character array of fixed lenght [10].
jensstruemper 0:d8558b73ffd7 71 *
jensstruemper 0:d8558b73ffd7 72 */
jensstruemper 0:d8558b73ffd7 73
jensstruemper 0:d8558b73ffd7 74
jensstruemper 0:d8558b73ffd7 75 /*
jensstruemper 0:d8558b73ffd7 76 ** reverse string in place
jensstruemper 0:d8558b73ffd7 77 */
jensstruemper 0:d8558b73ffd7 78 void reverse(char *s) {
jensstruemper 0:d8558b73ffd7 79 char *j;
jensstruemper 0:d8558b73ffd7 80 int c;
jensstruemper 0:d8558b73ffd7 81
jensstruemper 0:d8558b73ffd7 82 j = s + strlen(s) - 1;
jensstruemper 0:d8558b73ffd7 83 while(s < j) {
jensstruemper 0:d8558b73ffd7 84 c = *s;
jensstruemper 0:d8558b73ffd7 85 *s++ = *j;
jensstruemper 0:d8558b73ffd7 86 *j-- = c;
jensstruemper 0:d8558b73ffd7 87 }
jensstruemper 0:d8558b73ffd7 88 }
jensstruemper 0:d8558b73ffd7 89 /*
jensstruemper 0:d8558b73ffd7 90 ** itoa: convert n to characters in s
jensstruemper 0:d8558b73ffd7 91 */
jensstruemper 0:d8558b73ffd7 92 void itoa(int n, char s[])
jensstruemper 0:d8558b73ffd7 93 {
jensstruemper 0:d8558b73ffd7 94 int i, sign;
jensstruemper 0:d8558b73ffd7 95
jensstruemper 0:d8558b73ffd7 96 if ((sign = n) < 0) /* record sign */
jensstruemper 0:d8558b73ffd7 97 n = -n; /* make n positive */
jensstruemper 0:d8558b73ffd7 98 i = 0;
jensstruemper 0:d8558b73ffd7 99 do { /* generate digits in reverse order */
jensstruemper 0:d8558b73ffd7 100 s[i++] = n % 10 + '0'; /* get next digit */
jensstruemper 0:d8558b73ffd7 101 } while ((n /= 10) > 0); /* delete it */
jensstruemper 0:d8558b73ffd7 102 if (sign < 0)
jensstruemper 0:d8558b73ffd7 103 s[i++] = '-';
jensstruemper 0:d8558b73ffd7 104 s[i] = '\0';
jensstruemper 0:d8558b73ffd7 105 reverse(s);
jensstruemper 0:d8558b73ffd7 106 }
jensstruemper 0:d8558b73ffd7 107
jensstruemper 0:d8558b73ffd7 108 /*
jensstruemper 0:d8558b73ffd7 109 ** toString: convert floating point number to
jensstruemper 0:d8558b73ffd7 110 */
jensstruemper 0:d8558b73ffd7 111
Jens 3:56bf83e1dd1d 112 char *toString(float number, uint8_t digits)
jensstruemper 0:d8558b73ffd7 113 {
jensstruemper 0:d8558b73ffd7 114 int d1;
jensstruemper 0:d8558b73ffd7 115 int d2;
jensstruemper 0:d8558b73ffd7 116 char buf_d1[10];
jensstruemper 0:d8558b73ffd7 117 char buf_d2[10];
jensstruemper 0:d8558b73ffd7 118 static char buf_out[10];
jensstruemper 0:d8558b73ffd7 119 // char padzero[10];
jensstruemper 0:d8558b73ffd7 120 double fractpart, intpart;
jensstruemper 0:d8558b73ffd7 121 int multiplier=1;
jensstruemper 0:d8558b73ffd7 122
jensstruemper 0:d8558b73ffd7 123 for (int j=0; j < digits; j++){
jensstruemper 0:d8558b73ffd7 124 multiplier = multiplier * 10;
jensstruemper 0:d8558b73ffd7 125 }
jensstruemper 0:d8558b73ffd7 126 fractpart = modf (number , &intpart);
jensstruemper 0:d8558b73ffd7 127 d2 = int(fractpart*multiplier);
jensstruemper 0:d8558b73ffd7 128 d1 = int(intpart);
jensstruemper 0:d8558b73ffd7 129 itoa(d1, buf_d1);
jensstruemper 0:d8558b73ffd7 130 itoa(d2, buf_d2);
jensstruemper 0:d8558b73ffd7 131
jensstruemper 0:d8558b73ffd7 132 strcpy(buf_out, buf_d1);
jensstruemper 0:d8558b73ffd7 133
jensstruemper 1:89abb5f1c2fd 134 if (digits > 0){
jensstruemper 1:89abb5f1c2fd 135 strcat(buf_out, ".");
jensstruemper 1:89abb5f1c2fd 136
jensstruemper 1:89abb5f1c2fd 137 if (strlen(buf_d2) < digits) { /* adding n padding zero's if nessesary */
Jens 3:56bf83e1dd1d 138 for (uint8_t k=0; k < (digits - strlen(buf_d2)); k++){
jensstruemper 1:89abb5f1c2fd 139 strcat(buf_out, "0");
jensstruemper 1:89abb5f1c2fd 140 }
jensstruemper 0:d8558b73ffd7 141 }
jensstruemper 1:89abb5f1c2fd 142 strcat(buf_out, buf_d2);
jensstruemper 0:d8558b73ffd7 143 }
jensstruemper 0:d8558b73ffd7 144 return buf_out;
jensstruemper 0:d8558b73ffd7 145 }
jensstruemper 0:d8558b73ffd7 146
jensstruemper 0:d8558b73ffd7 147 };
jensstruemper 0:d8558b73ffd7 148
jensstruemper 0:d8558b73ffd7 149 using namespace js;
jensstruemper 0:d8558b73ffd7 150
jensstruemper 0:d8558b73ffd7 151 #endif