[Qt] Validator daty i korekta dni

0

Witam.

Piszę sobie validator daty. Chcę, żeby w wypadku, gdy użytkownik poprawia datę, dzień był odpowiednio poprawiany.
Przykładowo mamy datę: 31.08.2009 user zmienia miesiąc na wrzesień, więc ponieważ nie ma 31 dnia września to automatycznie dzień powinien zostać poprawiony na 30.09.2009. Podobnie z innymi miesiącami w szczególności lutym i latami przestępnymi.

W czym problem?
QDateTime ma pareser: QDateTime::fromString ( const QString & string, const QString & format ) . Ale jeśli user wprowadzi zmieni miesiąc/rok dla którego nie ma tego dnia, parser zwraca datę, która zwraca pustą datę (isValid zwraca false), która nie zawiera żadnych informacji o dniu miesiącu czy nawet roku.
Jest metoda statyczna bool QDate::isValid ( int year, int month, int day ), ale ona wymaga ręcznego parsowania napisu.

Czy istnieje sposób bym mógł uniknąć ręcznego parsowania daty (prawdopodobnie duplikowałbym kod z Qt) i być wstanie pobrać nieprawidłową datę, by móc ją potem samemu poprawić?

0

Ja taki trochę ot zrobię. Jeśli użytkownik wpisze powiedzmy 28.02.2009 i potem będzie chciał poprawić na 30.03.2009 to go chyba pokręci że najpierw musi zmienić miesiąc a dopiero potem dzień.

0

cóż poradzić nie ja to wymyśliłem, ja to tylko koduję.
Poza tym ten fix up ma być robiony jedynie w wypadku, gdy edytowane jest inne pole (dzień lub miesiąc), ale pewnie zrobię po swojemu i fix up będzie robiony po opuszczeniu pola edycyjnego.
Tak czy siak problem pozostaje.

0

Ok na razie wymyśliłem i zaimplementowałem coś takiego.
Biorę string formatujący (drugi argument dla QDateTime::fromString), wyszukuje w nim symbole: mm, yyyy, dd, itp i zapamiętuje ich pozycję. Następnie zastępuje każdy z tych symboli odpowiednim wyrażeniem regularnym posiadającym capture (komplet nawiasów okrągłych), w ten sposób tworząc wyrażenie regularne dla całej daty. Sortuje dzień miesiąc i rok ze względu na kolejność występowania. Następnie w momencie gdy trzeba naprawić datę, analizuje napis tak przygotowanym wyrażeniem regularnym, a na podstawie sortowania, wiem jaka część daty została złapana przez capture (). Dalej wyciągnięcie potrzebnych danych jest proste.
Rozwiązanie nie za długie (zajęło mi około 40 linijek ze wstępną obsługą błędów), dostatecznie uniwersalne (na razie olałem miesiące w postaci wyrazu itp). Wada jest taka, że nie za bardzo efektywne, ale taki overhead można przeboleć.

Jeśli ktoś ma lepszy pomysł niech da znać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0