пятница, 6 января 2012 г.

С/С++ Конвертирование из int / double в CString.

Так и не обнаружил готовой в применение функции конвертирования int в CString. На скорую руку накропал велосипед. Может кому-то будет полезно. (На самом деле пойдет и для string и для всяких-там QString...). Далее будет чуть-чуть кода.

Принимает два параметра (второй не обязательный) - целочисленную переменную, которую необходимо конвертировать и размер буфера под цифру (кол-во символов, минимально необходимых для отображения числа), он по умолчанию равен 10. Если буфер указать некорректным (отрицательным или нулевым), то функция вернет пустую строку. Если все хорошо, то результирующую строку.

Конвертируем целое (int):

CString iToCStr(int i,int BufSize = 10)
{
    CString str;
    if (BufSize > 0)
    {
        char *Buf = new char[BufSize+1];
        _itoa_s(i,Buf,BufSize+1,10);
        str = (CString)Buf;
        delete [] Buf;
        return str;
    }
    else return (CString)"";
    }

Пример для int:

int i = 2;
CString str;
str = iToCStr(i,1);

Теперь double:

#include<cmath> //!!! for POW() and ABS() functions in  doubleToCStr()

CString doubleToCStr(double Num, int RoundRange = 2)
{
    if(RoundRange <= 0)
        RoundRange = 2;
    CString result;
    result += iToCStr((int)Num); // Целая часть
    result += ",";
    int PostDot = (Num - (int)Num) * pow(10.0,(double)RoundRange);
    PostDot = abs(PostDot);
    result += iToCStr(PostDot); // Обращаю ваше внимание на эту строчку (объявление ОБЕИХ функций здесь обязательно)
    return result;
    } 

Пример для double:

double d = 2.25;
CString str2;
str2 = doubleToCStr(d);
Справедливости ради годы и опыт спустя... стоит заметить, что вышеприведенные методы не должны оказаться в серьезных проектах, ведь есть более адекватные способы: старая-добрая sprintf() и ее новая интерпретация в современном стандарте C++11 - std::to_string().

Еще вспомнился колхоз-колхоз с вычитанием ANSII-кода нуля ('0') с первого курса в ту же лесостепь =) *в отрицательные эта версия не умеет*


#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;

long int ctoi(const char* str) {
 long int ival = 0;
 unsigned int size = strlen(str);
 for (int i=0; i<size; i++) {
  ival += (str[i] -'0') * std::pow(10,size-1 - i);
 }
 return ival;
 }

int main() {
 char input[255];
 cin >> input;
 cout << ctoi(input);
 return 0;
 }

Комментариев нет:

Отправить комментарий