![]() |
StringToDate Problem
Hallo
Ich habe eine Textdatei die so aufgebaut ist Name1 25.03.1986 Name2 12.05.2017 Name3 19.01.2000 Ich lade dieses Text File in eine TStringlist und muss nun alle Namen in eine Checklistbox übertragen. Ich habe das so versucht.
Delphi-Quellcode:
function IsDate(str: string): Boolean;
var dt: TDateTime; begin Result := True; try dt := StrToDate(str); except Result := False; end; end;
Delphi-Quellcode:
for I := 39 to 78 do
if isdate(server.Strings[i])=false then if server.Strings[i]='Nothing'=false then checklistbox1.items.add(server.Strings[i]); end; Bei mir und den meisten Leuten in Deutschland funktioniert das. Aber in gewissen anderen Sprachen/Ländern/Systemsprachen? funktioniert dieser Code nicht weil das Datum nicht als Datum erkannt wird und somit fälschlicherweise in die checklistbox Liste kommt. Ich dachte dann, ich kann ganz einfach die "." durch "/" ersetzen und dann wird es als Datum erkannt. Das funktioniert aber nur halbwegs. Ich vermute es liegt daran das TAG und Monat evt noch getauscht werden müssten. Weil sonst nur Datum bis zum 12.Tag/Monat korrekt erkannt werden? Es gibt doch bestimmt eine Möglichkeit wie ich mein "EUROPA Standart Datum" aus der Textdatei also zB 17.02.1990 auf jedem Computer system als gültiges Datum prüfen kann? |
AW: StringToDate Problem
RegEx ?
Warum fällt dir nicht auf, dass StrToDate und Co. noch einen weiteren Parameter besitzen? ![]() Und keine Ahnung, warum viele Entwickler fahrlässig Exceptions zur Steuerung missbrauchen. Vorallem beim Debuggen macht so ein Code absolut keinen Spaß. So könnte man fast auf die Idee kommen, dass Viele auch niemals den Debugger benutzen. :shock: ![]() |
AW: StringToDate Problem
Hmm..
Eine Frage: Wer erstellt diese Textdatei? Ich kenne das Problem mit String -> Date, gerade wenn die Dateien von irgendeiner Maschine kommen, welche eine andere Sprache eingestellt hat (z.B. EN) und der PC, welcher die Datei einließt z.B. auf DE steht. Wenn Du Einfluss auf das Erstellen der Textdatei hast, dann würde ich empfehlen entweder ein festes Format (FormatDate mit z.B. immer YYYY-MM-DD) oder direkt das ISO Format zu verwenden. Dann ist das Konvertieren immer gleich, egal welche Sprache auf dem System/User eingestellt ist. |
AW: StringToDate Problem
Zitat:
Zitat:
Aha... Ja ich glaube das klingt nach meinem Problem :) Ich mache diese Textdatei und kann das Format beliebig schreiben. Dann versuche ich mal mit FormatDate aber bis jetzt klappts nnoch nicht. |
AW: StringToDate Problem
Aus diesem Grund, haben fast alle Funktionen einen Format-Parameter.
XxxToStr/StrToXxx/Format/FormatDateTime Da gibt man die "Landesspezifikationen" dieses Strings an. . oder , : oder / usw. Außerdem hat FormatDateTime ein paar Formatspezifische Steuerzeichen.
Delphi-Quellcode:
is nicht das Selbe, wie
'jjjj.mm.dd'
Delphi-Quellcode:
, außer man gibt in den FormatSettings vor, dass das Steuerzeichen
'jjjj"."mm"."dd'
Delphi-Quellcode:
auch ein
.
Delphi-Quellcode:
ist.
.
Und gerade "externe" Werte sollten "immer" in einem fest definierten Format gespeichert werden. extern = Dateien und Datenübertragungen aus der EXE heraus (IPC, Netzerk usw.) |
AW: StringToDate Problem
Danke für die Hilfe. Hab mal was versucht.
Wäre es so ungefähr korrekt? Bei mir gehts zumindest. Aber bei mir gings ja bis jetzt auch immer. Kann es schlecht testen, oder?
Delphi-Quellcode:
function IsDate(str: string): Boolean;
var dt: TDateTime; DateOne: TDate; LocalFormatSettings: TFormatSettings; s: string; begin Result := True; try GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, LocalFormatSettings); LocalFormatSettings.DateSeparator := '.'; s := FormatDateTime('dd.mm.yyyy', strtodate(str), LocalFormatSettings); dt := StrToDate(s); except Result := False; end; end;
Delphi-Quellcode:
for I := 39 to 78 do begin
s := server.Strings[i]; //Datum zB: 17.03.2017 aus der textdatei if isdate(s)=false then begin if server.Strings[i]='Nothing'=false then cat1.add(server.Strings[i]); end; end; |
AW: StringToDate Problem
Hi,
mal ein anderer Ansatz: Wenn jede zweite Zeile ein Datum ist, dann kann man z.B. auch auf un-/geraden Index prüfen. ... if odd(i) then ... oder gleich eine while-Schleife und einen Index mit Schrittweite 2 |
AW: StringToDate Problem
Zitat:
Lol. Ja ich machs einfach so ;) Danke dir :) |
AW: StringToDate Problem
Noch ein anderer Ansatz: Wenn du die Textdatei eh selbst schreibst und das Format selbst definieren kannst, dann setze Datum und Name in dieselbe Zeile, getrennt durch ein Zeichen deiner Wahl - z.B. die Pipe | oder Sternchen * oder sowas, irgendetwas, das garantiert nicht im Namen und Datum vorkommen kann.
Der Ansatz geht natürlich davon aus, dass Datum und Name zueinander gehören. Grüße Dalai |
AW: StringToDate Problem
Zitat:
Da gibt den US-Raum der "Monat/Tag/Jahr" verwendet und den "Restraum" der Welt der Tag/Monat/Jahr" verwendet. Zitat:
![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz