タイトルまんまです
float型の数字列をChar*型にする関数を作ってみました
BLEnano2(nrf52**)をArduino化して使用しているのですがfloat型をchar*型にしたいと思った時に色々しらべてみるとで予約語としてそういうものがないことをわかりました
avr系ならdtostrfというもので変換できますが、nrf52にはありません
String(float型の変数)でもできる記事をみつけて実装してみましたがうまくきませんでした
なかったら作るしかないだろ精神で以下のようなプログラムを作りました
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
char* ConvertFloatChar(float value){ char szbuf[200]; int whl, frac; bool Inverse = false; //符号 whl = (int)value; //整数 frac = (int)(value * 100) % 100; //少数 if(frac < 0){ frac *= -1; Inverse = true; } if(whl < 0){ whl *= -1; Inverse = true; } if(Inverse == true){ sprintf(&szbuf[0], "-%d.%02d", whl, frac); }else{ sprintf(&szbuf[0], "%d.%02d", whl, frac); } return szbuf; } |
もっとスマートに書けると思いますがまぁ気にしないということで
プログラムの動きとして、少数第二位までをchar*型に変換しています
変換し終わるとreturnでchar*型を返します
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
void setup() { // put your setup code here, to run once: Serial.begin(115200); float fltvalue1 = 12.5; float fltvalue2 = -6.5; Serial.println("befor:after"); Serial.print(fltvalue1); Serial.print(":"); Serial.println(ConvertFloatChar(fltvalue1)); Serial.print(fltvalue2); Serial.print(":"); Serial.println(ConvertFloatChar(fltvalue2)); } void loop() { // put your main code here, to run repeatedly: } char* ConvertFloatChar(float value){ char szbuf[200]; int whl, frac; bool Inverse = false; //符号 whl = (int)value; //整数 frac = (int)(value * 100) % 100; //少数 if(frac < 0){ frac *= -1; Inverse = true; } if(whl < 0){ whl *= -1; Inverse = true; } if(Inverse == true){ sprintf(&szbuf[0], "-%d.%02d", whl, frac); }else{ sprintf(&szbuf[0], "%d.%02d", whl, frac); } return szbuf; } |
出力結果
1 2 3 |
befor:after 12.50:12.50 -6.50:-6.50 |
スポンサーリンク
参考文献
- qiita, https://qiita.com/7of9/items/e8e50156f687d026cbec
- Arduino Programming Questions, http://forum.arduino.cc/index.php?topic=243660.0