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.022Im 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.