Programowanie > Językoznawstwo

Format string

(1/6) > >>

Xender:
Jakie znacie fajne implementacje format stringów?
Szczególnie dla C++ (aczkolwiek nie tylko), jemu brakuje dobrego I/O w bibliotece standardowej (printf to C i w C++ da się to zrobić bezpieczniej/wygodniej, iostream jest niewygodne).


--- Cytat: Krzysiek K. w Maj 12, 2015, 12:34:49 ---Powiem szczerze, że cout/cin to ja chyba jeszcze nigdy nie użyłem. :) Zawsze był printf, a od dłuższego już czasu doszedł mi własny wrapper na vsnprintf w postaci format(fmt,...). :) Z coutem zawsze jest za dużo roboty żeby coś sformatowac dokładnie tak jak się chce, a scanf/cin do żadnego poważniejszego parsowania wejścia jak dla mnie się nie nadają (w sumie podobnie jak całe standardowe wejście - chyba że pisze się commandlinowe toole konkretnie do przetwarzania tekstu). :)

--- Koniec cytatu ---

Bardzo z kolei podobają mi się Pythonowe format stringi (te nowe, ze {}, nie te z %) - nawet znalazłem port do C++:
https://github.com/cppformat/cppformat
Używał ktoś tego lub czegoś podobnego i może podzielić się wrażeniami?

Szkoda, że na Pythonowych format stringach ciężej zrobić wejście chociaż w sumie jest moduł i od tego, parse.

Pozdrawiam. ^ ^

Kos:
Ja mam fajny przykład, ale dla format stringów dla daty i czasu. Wiadomo że flag strftime / strptime nie da się spamiętać (trzeba wytatuować na przedramieniu albo zapisać permanentnym cienkopisem na wewnętrznej stronie okularów).

Ucieszyłem się widząc że ludzie od Go nie poszli w tę stronę. U nich date format string wygląda np: "Mon, 02 Jan 2006" albo "2006-01-02". I działa!
Zasada działania jest prosta: bierzesz konkretną datę (unix time 1136239445 czyli "01/02 03:04:05PM '06 -0700") i zapisujesz ją w takim formacie jaki chcesz zobaczyć. Go rozpoznaje po liczbach która część jest która.

Może nawet się to nie posypie po 2099 :-)

Krzysiek K.:
Ja generalnie używam swoich wrapperków.

Do printowania (link):

--- Kod: ---std::string format(const char *fmt, ...);
--- Koniec kodu ---

Do parsowania (link):

--- Kod: ---void ParseWhitespace(const char *&s);
int         ParseHex(const char *&s);
int ParseInt(const char *&s);
float ParseFloat(const char *&s);
void ParseString(const char *&s,std::string &out);
std::string ParseString(const char *&s);
void ParseStringT(const char *&s,std::string &out,const char *terminators);
void        ParseHexBuffer(const char *&s,std::vector<byte> &buff);
--- Koniec kodu ---

Ale jeżeli chodzi o parsowanie rzeczy bardziej złożonych (pokroju własnego języka), to oczywiście compiler compiler (napisany samemu - nie używam żadnych żubrowatych).


--- Cytuj ---U nich date format string wygląda np: "Mon, 02 Jan 2006" albo "2006-01-02". I działa!
--- Koniec cytatu ---
Brzmi to nieco magicznie. Bałbym się że można się naciąć na jakiś format, jak przykładowo w C++ gdzie raz przez locale spodziewał mi się przy parsowaniu floatów przecinków zamiast kropek (oczywiście wypisywał też z przecinkami). I weź to potem podeślij do innego programu.

Xender:
@Kos - Ciekawe, chociaż średnio jestem przekonany do tego pomysłu.

Ale sam format referencyjny to jakiś pochlastany, winno być "2001-02-03 04:05:06 -0700", jeśli już.
Honor programisty nakazuje używać ISO, już szczególnie przy definiowaniu API (z poprawką na oddzielanie godziny od daty za pomocą spacji, to T jest debilne :P).

Aczkolwiek, jeśli to nie ma więcej pól, to czemu nie użyć po prostu jako znaczników YYYY-MM-DD hh:mm:ss i wariacji?

Xion:
@Kos: Taki myk posypie przy każdym niestandardowym/niepełnym formacie (np. mm:ss zamiast HH:mm), nie wspominając już o problemach jak:

* 4/5/2015 -- D/M/YYYY czy M/D/YYYY?
* 11:20 -- 12- czy 24-godzinny format?

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej