Перевод числа в строку

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Здравствуйте. Есть число 0,1,2,3...90.

Нужно это число разделить на 10 и перевести в строку или массив char, указав 1.целую часть, 2. точку, 3. десятичную часть. Поясню:

0 -> "0.0"

1 -> "0.1"

10 -> "1.0"

55 -> "5.5"

Ремарка. Изучив особенности форума, я понял, что, обращаясь на форум сначала нужно хоть как-то написать свой "г@внокод", а профи уже научат уму-разуму. Поэтому вот код, котелось бы услышать как его оптимизировать (ускорить, использовать меньше памяти и т.д., ведь для Arduino с небольшими ресурсами это важно)

int grouppresure = 12;// число, которое надо перевести в "1.2"
String bar = String(grouppresure);    // то же число в виде строки (без точки)
char bars[3] = "0.0";                        // здесь сохраним только точку, заменив числа.
bars[0] = bar[bar.length()];
bars[2] = bar[bar.length()-1];
// теперь в переменной bars - значение "1.2"

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Если относительно нормально делать, то dtostrf(), а если говнокодить - взять целую часть в строку, дробную часть в строку и всё это соединить через точку.

Kakmyc
Offline
Зарегистрирован: 15.01.2018
int pressure=25;
char myStr[]={};
sprintf(myStr,"%d.%d", pressure/10,pressure%10);

 

Гриша
Offline
Зарегистрирован: 27.04.2014

andreykrasnodar пишет:

Здравствуйте. Есть число 0,1,2,3...90.

Нужно это число разделить на 10 и перевести в строку или массив char, указав 1.целую часть, 2. точку, 3. десятичную часть. Поясню:

0 -> "0.0"

1 -> "0.1"

55 -> "5.5"

доп вопросы:

1) числа ограничены 1-90, >0?

2) точка требуется для визуализации или расчетов далее?

к примеру, у меня температура хранится не во float, а в int  t*100, я просто помню что нужно будет поделить на 100 для визуализации или нарисовать точку в нужном месте или откинуть 2 знака.

собственно вопрос, а в том ли месте вы пытаетесь сэкономить?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Kakmyc пишет:

int pressure=25;
char myStr[]={};
sprintf(myStr,"%d.%d", pressure/10,pressure%10);

 

Спасибо. Полагаю, это как раз именно то, что мне нужно. К сожалению, с таким кодом программа компилируется, но некорректно работает, а что именно не так - не знаю, а параллельный порт занят, посмотреть не могу.

Но спасибо, что обратили внимание на эту функцию, я о ней не знал, теперь буду работать. И да, при использовании sprintf под скомпилированный проект отнимается 5% памяти устройства.

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

И да, при использовании sprintf под скомпилированный проект отнимается 5% памяти устройства.

а без sprintf скока было?

для чего нужна строчка. для вывода куда-то? Что мешает сделать вот так:

int pressure=25;
Serial.print(pressure/10);
Serial.print(".");
Serial.print(pressure%10);

И, главное - неужели до этого нельзя было додуматься самому???

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Гриша пишет:

andreykrasnodar пишет:

Здравствуйте. Есть число 0,1,2,3...90.

Нужно это число разделить на 10 и перевести в строку или массив char, указав 1.целую часть, 2. точку, 3. десятичную часть. Поясню:

0 -> "0.0"

1 -> "0.1"

55 -> "5.5"

доп вопросы:

1) числа ограничены 1-90, >0?

2) точка требуется для визуализации или расчетов далее?

к примеру, у меня температура хранится не во float, а в int  t*100, я просто помню что нужно будет поделить на 100 для визуализации или нарисовать точку в нужном месте или откинуть 2 знака.

собственно вопрос, а в том ли месте вы пытаетесь сэкономить?

1. Да, числа ограничены именно 0->90. Максимальное значение, конечно, может достигать и 150, но это уже аварийная ситуация, программа в теории не должна допустить таких значений (хотя в жизни бывает всё, на практике было дело, когда у меня провод отвалился).

2. Да, точка именно для визуализации. В программе нет смысла хранить значения во float, а потом и вычисления с float производить.

3. У меня именно как у вас - давление в теории от 0 до 9 бар, датчик даёт показания с точностью до сотой, что мне совсем не нужно, достаточно десятых и хранения давления*10.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Пока сделал так

String bars = String(grouppresure/10)+'.'+String(grouppresure%10);

Но это, скорее, костыль. Программируя для Windows я б не заморачивался, т.к. памяти в компьютере, как и частоты процессора over500, с Arduino приходится изголяться, да ещё и нужные вычисления успевать проводить в цикле 10 мсек.

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

Пока сделал так

String bars = String(grouppresure/10)+'.'+String(grouppresure%10);

Но это, скорее, костыль.

для вашего уровня сойдет...

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

b707 пишет:

andreykrasnodar пишет:

Пока сделал так

String bars = String(grouppresure/10)+'.'+String(grouppresure%10);

Но это, скорее, костыль.

для вашего уровня сойдет...

Есть желание уровень повышать. В скетче вообще хотел бы отказаться от использования String.

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

Есть желание уровень повышать.

Тогда больше пишите сами. Лучше не самое быстрое, но свое, чем чужой код. который завтра забыли.

А эффективность придет, если практиковаться будете

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

andreykrasnodar пишет:

 Да, числа ограничены именно 0->90. 

я б еще так костыль сделал:

  byte inChislo = 52;
  char strout[4]; 
  if (inChislo > 9) strout[0] = (inChislo / 10) + '0';
  else strout[0] = '0';
  strout[2] = (inChislo % 10) + '0';
  strout[1] = '.'; strout[3] = 0;
// P.S. Не проверял

 

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Ух. И не додумался бы, что 4+'0'='4', а это ж так элементарно.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Тогда 

char(grouppresure/10)+'0'
char(grouppresure%10)+'0'

И без String получится. Только с char никогда не работал. Как их (вместе с точкой) быстро "конкатенировать" в массив из трёх символов? На ум приходит только явное указание bars[0]=... bars[1]=...

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

Тогда 

char(grouppresure/10)+'0'
char(grouppresure%10)+'0'

И без String получится. Только с char никогда не работал. Как их (вместе с точкой) быстро "конкатенировать" в массив из трёх символов? На ум приходит только явное указание bars[0]=... bars[1]=...

Так пробуйте!

опять элементарщину спрашиваете?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

andreykrasnodar пишет:

Kakmyc пишет:

int pressure=25;
char myStr[]={};
sprintf(myStr,"%d.%d", pressure/10,pressure%10);

 

Спасибо. Полагаю, это как раз именно то, что мне нужно. К сожалению, с таким кодом программа компилируется, но некорректно работает, а что именно не так - не знаю, а параллельный порт занят, посмотреть не могу.

Но спасибо, что обратили внимание на эту функцию, я о ней не знал, теперь буду работать. И да, при использовании sprintf под скомпилированный проект отнимается 5% памяти устройства.

Нормально там все работает, просто нужно чуть подкорректировать
sprintf(myStr,%d.%d;, pressure/10+'0',pressure%10+'0')

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Нормально там все работает, просто нужно чуть подкорректировать

sprintf(myStr,%d.%d;, pressure/10+'0',pressure%10+'0')

 

Не портите строчку своего же кода, было правильно. а теперь бред написан

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andreykrasnodar пишет:

Kakmyc пишет:

int pressure=25;
char myStr[]={};
sprintf(myStr,"%d.%d", pressure/10,pressure%10);

 

некорректно работает, а что именно не так - не знаю, а

Вы не выделяете ни одноuj байта памяти под массив myStr во второй строке. Он у Вас нулевой длины. А потом Вы нагло в этот массив пишете. Напишите там вместо [], например, [12] и будет много счастья :-)

Гриша
Offline
Зарегистрирован: 27.04.2014

andreykrasnodar пишет:

1. Да, числа ограничены именно 0->90.

2. Да, точка именно для визуализации.

что то мне "кажется" что точку нужно добавлять в процедуре вывода т.к. она всегда будет в одной позиции без всяких вариантов.

не знаю куда вы выводите данные и почему задаете пустой массив... по мне так проще (в данном конкретном случае) использовать 2 локальные переменные под единицы и под десятые.

ИМХО пост по ловле вши на голове лысого человека...

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Гриша пишет:

andreykrasnodar пишет:

1. Да, числа ограничены именно 0->90.

2. Да, точка именно для визуализации.

что то мне "кажется" что точку нужно добавлять в процедуре вывода т.к. она всегда будет в одной позиции без всяких вариантов.

не знаю куда вы выводите данные и почему задаете пустой массив... по мне так проще (в данном конкретном случае) использовать 2 локальные переменные под единицы и под десятые.

ИМХО пост по ловле вши на голове лысого человека...

Вопрос уже решён выводом 1/10, точки и остатка от деления на 10. Именно в процедуре вывода это и происходит. Вывод идёт в Serial порт.