Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C++CLI / VB .Net / .Net-Framework » String^ variabler Länge nach double

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.08.2009, 16:50 Uhr
~JuliaZ
Gast


Hallo,

ich lese folgende Eingabedatei:

Auschnitt der Datei:
09.01.2007 13:15:59 4.904
09.01.2007 13:16:01 4.93
09.01.2007 13:16:03 4.904
09.01.2007 13:16:05 4.894
09.01.2007 13:16:07 4.92
09.01.2007 13:16:09 4.929
09.01.2007 13:16:11 4.852
09.01.2007 13:16:13 4.875
09.01.2007 13:30:15 4.888
09.01.2007 13:30:17 4.863
09.01.2007 13:30:19 4.86

Die Anzahl der Vorkomma- und Nachkommastellen kann von ein bis drei Stellen variieren. Nach dem Messwert kommt nichts mehr auch keine Leerzeichen. Die Datei hat somit eine variable Länge.

Ich muss also prüfen wie lang die Zahl eigentlich ist. Dazu verwende ich nun try und catch wie im Folgenden zu sehen. Das dauert aber recht lange (bei 4500 Sätzen 33 sec; wobei später 2.7 mio Sätze kommen ... dann wirds langsam inakzeptabel)

Wie bekomme ich den Messwert einfacher und vor allem schneller von String^ str in meine double variable messwerttmp? Bin für Hilfe sehr dankbar.

Zum Quellcode: Ich schneide mir hier mit Substring die Vorkommastellen und die Nachkommastellen extra raus und befülle danach die double variable. Dirket nach double geht nicht da er mir das komma verschluckt.


C++:
try
                      {
                          messwerttmp = Convert::ToDouble(str->Substring(20,3));
                          messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(24,3)) /1000);
                      }
                      catch(ArgumentOutOfRangeException^)
                      {
                          try
                          {
                              messwerttmp = Convert::ToDouble(str->Substring(20,2));
                              messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(23,3)) /1000);
                          }
                          catch(ArgumentOutOfRangeException^)
                          {
                              try
                              {
                                  messwerttmp = Convert::ToDouble(str->Substring(20,1));
                                  messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(22,3)) /1000);
                              }
                              catch(ArgumentOutOfRangeException^)
                              {
                                  try
                                  {
                                      messwerttmp = Convert::ToDouble(str->Substring(20,3));
                                      messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(24,2)) /100);
                                  }
                                  catch(ArgumentOutOfRangeException^)
                                  {
                                      try
                                      {
                                          messwerttmp = Convert::ToDouble(str->Substring(20,2));
                                          messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(23,2)) /100);
                                      }
                                      catch(ArgumentOutOfRangeException^)
                                      {
                                          try
                                          {
                                              messwerttmp = Convert::ToDouble(str->Substring(20,1));
                                              messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(22,2)) /100);
                                          }
                                          catch(ArgumentOutOfRangeException^)
                                          {
                                              try
                                              {
                                                  messwerttmp = Convert::ToDouble(str->Substring(20,3));
                                                  messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(24,1)) /10);
                                              }                            
                                              catch(ArgumentOutOfRangeException^)
                                              {
                                                  try
                                                  {
                                                      messwerttmp = Convert::ToDouble(str->Substring(20,2));
                                                      messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(23,1)) /10);
                                                  }
                                                  catch(ArgumentOutOfRangeException^)
                                                  {
                                                      try
                                                      {
                                                          messwerttmp = Convert::ToDouble(str->Substring(20,1));
                                                          messwerttmp = messwerttmp + (Convert::ToDouble(str->Substring(22,1)) /10);
                                                      }
                                                      catch(ArgumentOutOfRangeException^)
                                                      {
                                                          try
                                                          {
                                                              messwerttmp = Convert::ToDouble(str->Substring(20,3));
                                                          }
                                                          catch(ArgumentOutOfRangeException^)
                                                          {
                                                              try
                                                              {
                                                                  messwerttmp = Convert::ToDouble(str->Substring(20,2));
                                                              }
                                                              catch(ArgumentOutOfRangeException^)
                                                              {
                                                                  messwerttmp = Convert::ToDouble(str->Substring(20,1));
                                                              }
                                                          }
                                                        }
                                                    }
                                              }
                                          }
                                      }
                                  }
                              }
                          }
                      }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.08.2009, 17:24 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst mal: Es handelt sich hier nicht um C++, sondern um C++/CLI, also schiebe ich das ganze mal ins .net-Forum. --> C++/CLI macht eigentlich nur dann Sinn, wenn du C++-Code an bestehenden .net-Code anbinden willst (oder umgekehrt), weil du zwei Laufzeitumgebungen gleichzeitig bedienen musst.

Wie dem auch sei, die ersten Felder sind von konstanter Länge, und die Zahl steht am Ende. Die Länge der Zahl ist str->Length - 20. Allerdings würde ich mich an deiner Stelle nach etwas stringstream-ähnlichem (zur Not sscanf-ähnlichem) in der .net-Laufzeit umsehen, dann hält der Code auch Formatänderungen aus.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.08.2009, 17:30 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das da oben ist jetzt nicht dein Ernst?

Du must Substring keine Länge angeben. Wenn du nur den Startindex angibst bekommst du den String ab da bis zum Ende und der Startindex ist ja immer gleich und wenn nicht dann suchst du zum Beispiel mit LastIndexOf nach dem letzten Leerzeichen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.08.2009, 17:31 Uhr
~global
Gast


hi, der "schluck" das komma auch nur weil es eben keins ist, sondern ein punkt.
entweder die "locale" ändern, oder den punkt gegen ein komma tauschen und dann ganz normal die ToDouble() nutzen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.08.2009, 17:32 Uhr
~JuliaZ
Gast



Zitat von 0xdeadbeef:
Zunächst mal: Es handelt sich hier nicht um C++, sondern um C++/CLI, also schiebe ich das ganze mal ins .net-Forum. --> C++/CLI macht eigentlich nur dann Sinn, wenn du C++-Code an bestehenden .net-Code anbinden willst (oder umgekehrt), weil du zwei Laufzeitumgebungen gleichzeitig bedienen musst.

Wie dem auch sei, die ersten Felder sind von konstanter Länge, und die Zahl steht am Ende. Die Länge der Zahl ist str->Length - 20. Allerdings würde ich mich an deiner Stelle nach etwas stringstream-ähnlichem (zur Not sscanf-ähnlichem) in der .net-Laufzeit umsehen, dann hält der Code auch Formatänderungen aus.


Ja an der String^ mit dem Messwert drin komme ich ran, allerdings kann ich diesen nicht nach double konvertieren da das Komma verschluckt wird. Da die Vorkommastellen variabel sind kann ich also nicht erkennen ob es sich z.b um 12.24 oder um 1.224 handelt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.08.2009, 17:57 Uhr
0xdeadbeef
Gott
(Operator)



C++:
messwerttmp = Double.Parse(str->SubString(20));


tut's nicht? Das könnte mit der Locale zusammenhängen, lass mich das kurz nachschlagen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 25.08.2009 um 17:58 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.08.2009, 18:10 Uhr
0xdeadbeef
Gott
(Operator)


Okay, wenn ich das richtig lese, sollte

C++:
messwerttmp =
  Double.Parse(str->SubString(20), NumberFormatInfo::InvariantInfo);


die Zahl parsen können, unabhängig von der System-Locale. NumberFormatInfo befindet sich im namespace System::Globalization.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 25.08.2009 um 18:10 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C++CLI / VB .Net / .Net-Framework ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: