string zerlegen nach double



  • Heiho

    ich hole aus einer liste ein string, der sieht zb so aus

    "12.13 - 14.4"
    
    //das moechte ich zerlegen zu
    
    double a = 12;
    double b = 13;
    double c = 14.4
    

    wie mach ich das am besten - geholt wird es als TCHAR

    das hab ich bisher:

    TCHAR str[13] = {'\0'};
    TCHAR a[3] = {'\0'};
    TCHAR b[3] = {'\0'};
    TCHAR c[5] = {'\0'};
    ListView_GetItemText(m_list, 1, 0, str, 100);
    a[0] = str[0];
    a[1] = str[1];
    b[0] = str[3];
    b[1] = str[4];
    c[0] = str[8];
    c[1] = str[9];
    c[2] = str[10];
    c[3] = str[11];
    

    anders wuesste ichs bisher nicht

    ich kann nu entweder versuchen das TCHAR nach double zu wandeln oder

    std::wstring wstr(a);
    

    und dann das wstring nach double - so oder so bekomm ich des nicht hin ?!

    also die frage

    1. wie kann ich eleganter zerteilen ? die positionen sind immer fest, auch die maximale groesse

    (immer "2.2 - 2.1")

    2. wie kann ich TCHAR oder wstring nach double wandeln ?

    danke schonmal



  • Na such halt nach dem "-" und pack die beiden enden jeweils in nen string. Dann schieb alles in nen stringstream und hol dir nen double raus 🙂



  • (D)Evil schrieb:

    stringstream und hol dir nen double raus

    und wie geht das ?

    das hab ich bisher und es funktioniert:

    TCHAR str[13] = {'\0'};
    TCHAR a[3] = {'\0'};
    double da = 0;
    TCHAR b[3] = {'\0'};
    double db = 0;
    TCHAR ab[6] = {'\0'};
    double dab = 0;
    TCHAR c[5] = {'\0'};
    double dc = 0;
    SecureZeroMemory(str, 20);
    SecureZeroMemory(a, 3);
    SecureZeroMemory(b, 3);
    SecureZeroMemory(c, 5);
    SecureZeroMemory(ab, 6);
    for(int i=0; i<ListView_GetItemCount(m_List); ++i){
        ListView_GetItemText(m_List, i, 0, str, 13);
        if(str[0] == _T(''))
            break;
        else{
            ab[0] = a[0] = str[0];
            ab[1] = a[1] = str[1];
            ab[2] = str[2];
            ab[3] = b[0] = str[3];
            ab[4] = b[1] = str[4];
            c[0] = str[8];
            c[1] = str[9];
            c[2] = str[10];
            c[3] = str[11];
            std::wstring wstr(a);
            da= _wtof(wstr.data());
            wstr=b;
            db= _wtof(wstr.data());
            wstr=ab;
            dab= _wtof(wstr.data());
            wstr=c;
            dc= _wtof(wstr.data());
            // da  = WW
            // db  = XX
            // dab = WW.XX
            // dc  = YY.Z
            // weitere operationen mit den double zahlen
        }
    }
    


  • bool show_data(std::string sData)
    {
        if (pData == NULL)
            return false;
        std::string::size_type pos = sData.find(" - ", 0);
        if (pos == string::npos)
            return false;
    
        std::string::size_type pos2 = sData.find_first_of(".");
        if (pos2 == std::string::npos)
            return false;
    
        std::stringstream ss;
        double dData3 = 0.0;
        double dData1 = 0.0;
        double dData2 = 0.0;
        ss << sData.substr(pos);
        ss >> dData3; // 14.4
        ss.clear();
        ss << sData.substr(0, pos2);
        ss >> dData1; // 12
        ss.clear();
        ss << sData.substr(pos2, pos - pos2);
        ss >> dData2; // 13
        return true;
    }
    

    So habs net getestet sondern einfach kurz nach www.cppreference.com zusammengesetzt ... wo ist das Problem?



  • .. ich finde Ihr denkt zu kompliziert 😉

    einfach auslesen:

    TCHAR src[] = TEXT("12.13 - 14.4");
        double a,b,c;
        {
            int aInt;
            TCHAR z;
            std::basic_istringstream< TCHAR > buf( src );
            buf >> aInt >> z >> b >> z >> c;
            a = aInt;
        }
    

    Gruß
    Werner


Anmelden zum Antworten