Problem bei Umwandlung von double nach ^String mit Convert::ToDouble()



  • Hallo, habe in meinem Programmcode irgendwie ein "Ei". Ich lese eine Datei Zeilenweise ein und schneide Text und Zahlen separat raus und schiebe jedes in ein Array. Zum späteren Rechnen brauche ich aber die Zahlen, die als Text eingelesen wurden. Ich durchsuche den Text also bis zum "=", verwerfe den vorderen String-Teil und wandle das folgende in eine DOUBLE-Zahl mit Convert::ToDouble().

    Wenn ich dann die Double-Werte ausgebe, sind diese alle um den Faktor 10 größer. Wo liegt das Problem? Hier der Code, habe bei der betreffenden Zeile / 10 gemacht, damit ich erst mal weiterarbeiten kann.

    #include "stdafx.h"
    
    using namespace System;
    using namespace System::IO;
    using namespace System::Collections::Generic;
    
    int main(array<System::String ^> ^args)
    {
    	// Datei öffnen
    	StreamReader ^dat_ein = gcnew StreamReader("C:\\Documents and Settings\\jn3985\\My Documents\\Visual Studio 2008\\Projects\\Konsolenprogramme\\DateiÖffnen\\DateiÖffnen\\Debug\\ParaList.ini");
    
    	// List-Array erzeugen
    	List<String^> ^A_Variablen = gcnew List <String^>();
    	List<double> ^B_Variablen = gcnew List <double>();					// Array für die Ablage der Daten als double
    
    	// Array in .Net für Bezeichnungen einlesen
    	array <String^> ^Bezeichner;;
    	String ^strZeile, ^s;
    	int zahl = 0;
    	double tmp;
    
    	// Zeilenweise einlesen und auf Konsole ausgeben und in List-Array einlagern
    
    	while((dat_ein->Peek()) != -1)
    	{
    		strZeile = dat_ein->ReadLine(); 
    		A_Variablen->Add(strZeile);
    		Console::WriteLine(" "  + strZeile);
    	}
    
    	// Datei schließen
    	dat_ein->Close();
    //	s = nullptr;
    
    // ****************************** neue Datei für Datenaustausch in Array einlesen
    
    	int iLaenge, iLaengeEnd = 0;
    	zahl = A_Variablen->Count;
    	double dArray[]={zahl};
    
    	// neue Datei öffnen um die Zahlenwerte in dArray zu übernehmen
    	StreamReader ^dat_zahlen = gcnew StreamReader("C:\\Documents and Settings\\jn3985\\My Documents\\Visual Studio 2008\\Projects\\Konsolenprogramme\\DateiÖffnen\\DateiÖffnen\\Debug\\Abr test.txt");
    
    	// Zeilenweise auslesen der neuen Datei
    	while((dat_zahlen->Peek()) != -1)
    	{
    		strZeile = dat_zahlen->ReadLine(); 
    		if((iLaengeEnd = strZeile->LastIndexOf("=")) != -1)		// prüfen, ob es sich um Aufführungsparamter handelt [xxxx]
    		{
    			iLaengeEnd +=1;
    			s = strZeile->Substring(iLaengeEnd);
    			s = s->Trim();
    			if(s != "")											// Wenn nach dem = keine Zahl folgt, die tmp-Variable = 0 setzen
    			{
    
    				tmp = (Convert::ToDouble(s)) / 10;				// ******** Wenn hier nicht mit 10 dividiert wird, gehts schief
    				B_Variablen->Add(tmp);							// double-Wert in Array einfügen
    
    			}
    			else
    			{
    				tmp = 0;
    				B_Variablen->Add(tmp);
    			}
    		}
    		else
    		{
    			iLaengeEnd = 0;
    			B_Variablen->Add(iLaengeEnd);
    		}
    		Console::WriteLine(strZeile + " " + iLaengeEnd +  "\t\t" + strZeile->Substring(iLaengeEnd));
    //		s = strZeile->Substring(iLaengeEnd);
    //		tmp = Convert::ToDouble(s);
    		iLaengeEnd = 0;
    	}
    
    	// Datei schließen
    	dat_zahlen->Close();
    
    	Console::WriteLine(L"Es gibt " + zahl + " Einträge aus dem Array A_Variablen");
    
    	for(int i=0; i < zahl ; i++)
    	{
    		s = Convert::ToString(B_Variablen[i]);						//= Convert::ToString(B_Variablen[i]);
    		Console::WriteLine("Name der Variablen:	{0}={1}	",A_Variablen[i],B_Variablen[i]);
    	}
    
        Console::WriteLine(L"Mit Retun bestätigen, um Programm zu beenden");
    	String ^test = Console::ReadLine();
    
    	return 0;
    
    }
    


  • Wie sind die Doubles in STring Form?
    Mit Komma oder Punkt?

    Könnte ev. etwas ausmachen.

    Ansonsten zeig doch mal ein Input File.
    Simon



  • Die Daten sind ursprünglich mit . als Trennzeichen. Hier ein kleiner Dateiausschnitt:

    [Abr]
    CutPartDiameter=16.0
    CutPartDiameterMin=-0.022

    Im Debugmodus steht die Variable korrekt als "16.0". Bei der Umwandlung von ^String nach Convert::ToDouble steht dann plötzlich "160.0000".

    Komisch, oder?



  • Das hängt mit der Lokalisierung zusammen. (Wie schon im ersten Post angedeutet.)
    Ich vermute bei Dir ist de-DE eingestellt.

    Bei de-DE muss das Komma verwendet werden um die Nachkommstellen zu trennen.
    Bei de-CH muss der Punkt verwendet werden um die Nachkommastellen zu trennen.

    Folgendes Bsp. veranschaulicht die Problematik:

    using namespace System;
    using namespace System::Threading;
    using namespace System::Globalization;
    
    int main(array<System::String ^> ^args)
    {
    	Thread::CurrentThread->CurrentCulture = gcnew CultureInfo("de-DE");
    	//Thread::CurrentThread->CurrentCulture = gcnew CultureInfo("de-CH");
    
    	String^ s = L"16.0"; // sollte eigentlich 16,0 heissen.
    	double d = Convert::ToDouble(s);
    
        return 0;
    }
    

    Edit:
    Bei de-DE bedeutet der Punkt etwas anderes als Du erwartest hast. Das ist das eigentliche Problem.

    Simon



  • Das hat sich rausgezögert, funktioniert.

    Danke für die Hilfe.


Anmelden zum Antworten