Tausender Trennzeichen einfügen



  • Hallo, ich bins wieder mal 🙂

    Ich steh grad irgendwie auf der Leitung bei dem Problem.
    Ich habe einen Double Wert, der in einen String konvertiert wird.
    Jetzt möchte ich, dass Trennzeichen eingefügt werden, wenn es notwendig ist.

    Hier mal die Codestelle an der der Double in String convertiert wird:

    std::stringstream output;
    ...
    output<<std::setprecision(2)<<std::fixed<<data;
    

    Und hier mal mein fehlgeschlagener Versuch das umzusetzten:

    std::string add_points(dezim data){
    	std::stringstream converter;
    	converter <<std::setprecision(2)<<std::fixed<< data;
    	std::string output(converter.str());
    
    	int var = 1;
    
    	for(std::string::iterator iter = output.begin(); iter != output.end() ; ){
    		if(*iter = '.'){
    			break;
    		}
    		else if(*iter != '.' && var != 3){
    			++var;
    			++iter;
    		}
    		else if(*iter != '.' && var == 3){
    			var = 1;
    			++iter;
    			output.insert(iter, '.');
    		};
    	};
    	return output;
    };
    

    dezim ist dabei ein

    typedef double dezim;
    

    Die Ausgabe ist dann anstatt zb. 12345.12 -> .2345.12

    Weis grad ned wie ich das lösen soll, vielleicht liegts auch an den 35°C die wir gerade haben 😃



  • Nur 'ne Anmwerkung: ich wuerde ' als Trennung benutzen wie in 1'000'000.



  • Welches Trennzeichen is ja eigentlich egal ^^ es soll nur Lesbarer werden, wenn da in der Tabelle die Ausgegeben wird (als html), zahlen wie -2436382080.00 stehen, und das in Hülle und fülle, nervt es die Stellen zu zählen.

    #Edit Muss jetz leider Arbeiten, kann also erst heute Nacht (wo es hoffentlich kühler ist 😃 ) an dem Problem weiterarbeiten.



  • hier ist ein funktionierendes Beispiel, allerdings für long statt für double



  • Trennen des Strings (vor dem Komma) in gleich grosse Bloecke der Laenge 3 mittels substr (der letzte/erste kann auch weniger als 3 lang sein): 123456789.37 -> vorkomma(123456789) , nachkomma(37); vorkomma(123456789) -> block3(123), block2(456),block1(789); Zusammensetzen: block1(123) + '^' + block2(456) + '^' + block3(789) + '.' + nachkomma(37);



  • knivil schrieb:

    Nur 'ne Anmwerkung: ich wuerde ' als Trennung benutzen wie in 1'000'000.

    Noch 'ne Anmerkung: wenn man es richtig machen will, nimmt man natürlich das landesübliche Trennzeichen/Gruppierung, siehe locale, facet, numpunct, etc. Dafür ist das Zeugs ja schliesslich da 😉



  • Was ist eigentlich gegen locales einzuwenden?

    std::stringstream s;
    
    s.imbue( std::locale("German_Germany") );
    
    s << 12345.23;
    


  • rean schrieb:

    Was ist eigentlich gegen locales einzuwenden?

    std::stringstream s;
    
    s.imbue( std::locale("German_Germany") );
    
    s << 12345.23;
    

    ach stimmt, gibts ja auch noch...

    so funktionierts:

    #include <iostream>
    #include <locale>
    using namespace std;
    
    int main()
    {
    	locale mylocale( "de_DE" );
    	cout.imbue( mylocale );
    	cout << fixed << 123465.123416 << endl;
    	return 0;
    }
    


  • Der übergebene String ist compilerabhängig.

    Mir gefällt dieses Format allerdings besser: 😉

    int main() 
    { 
        std::locale locale("German_Switzerland"); 
        std::cout.imbue(locale); 
        std::cout << std::fixed << 123465.123416 << std::endl; 
        // Ausgabe: 123'465.123416
    }
    


  • Supi, werd mir des ansehen, sieht auf alle fälle gut aus 🙂
    Hab nur leider grad ned die zeit es zu testen.

    MfG


Anmelden zum Antworten