Jason. Cała informatyka w jednym miejscu!

Dzisiejszy materiał będzie sięgał wstecz do przedstawionej już tematyki jaką było formatowanie łańcuchów znaków. Rozbierzemy na czynniki pierwsze jeden element dotyczący formatowania złożonego, również przedstawionego wcześniej. Dowiecie się jak naprawdę wygląda formatowanie danych w języku C#, a także jakie różne zwariowane kombinacje możecie wykonać, aby wpłynąć na wygląd danych na strumieniu wyjściowym przy użyciu specyfikatorów formatu. Polecam gorąco! Warto wiedzieć w jaki sposób można pięknie ułożyć dane w formie tabelarycznej :D.

FORMATOWANIE DANYCH W JĘZYKU C# JEST ŁATWE DO ZROZUMIENIA, ALE TRUDNE DO ZAPAMIĘTANIA

Specyfikatorów znajdziecie od groma. Kłopot może sprawić nie tylko liczba kombinacji, ale także wzór, który obowiązuje. Najpierw ustalmy o co chodzi. Kojarzycie te indeksy w klamerkach pozwalające na wypisywanie na strumień wyjściowy ala "printf" z języka C? Kryptonim: formatowanie złożone ;):

Console.WriteLine("{0}*{1} = {2}", 2, 2, 4);

Tak, to jest właśnie to. Pojedynczy taki "cosik":

{0}

może posiadać specyfikator formatu. I co ważne, jest on bardzo uproszczony. To nie jest jego pełna wersja jaką może dysponować. Pełny wzór jakim może się kierować indeks wygląda w taki sposób:

{numer[,[-]wypełnienie]:specyfikator[precyzja]}

Formatowanie danych w języku C# przypomina sposób znany z języka C i funkcji "printf". Zważywszy, że większość jest opcjonalna, przedstawiam tłumaczenia w formie listy numerowanej. Po kolei:

  1. Na początku jest numer jako liczba dodatnia liczona od zera, która reprezentuje kolejność przetwarzania, ustaloną przez kolejne wprowadzane parametry aktualne do metody "WriteLine" (nie jest to jedyna metoda bowiem możecie z tego korzystać także w stosunku na przykład do metody "Format" z klasy "System.String", a jeszcze prościej z aliasu "string"),
  2. Zaraz po numerze jest opcjonalne ustawienie wypełnienia dla specyfikatora, to znaczy ile znaków długości ma być przeznaczone na przedstawienie wartości, dlatego też wprowadzana jest liczba całkowita (wtedy musimy postawić po numerze przecinek!!!). BARDZO przydatne kiedy dane mają być sformatowane na kształt tabelki (kiedy liczy się wyrównywanie łańcuchów, żeby wszystkie trzymały się jednolitych pozycji); pomiędzy przecinkiem, a wypełnieniem, może się znaleźć znak "plusa" (jest domyślny, więc jego brak da taki same efekt) lub "minusa". Określa on do której strony łańcuch ma zostać wyrównany. Jeżeli jest wstawiony "plus" albo w ogóle nie ma znaku, wtedy jest wyrównanie do prawej strony. Jeśli wstawimy "minus", wtedy literał zostanie wyrównany do lewej.
  3. Po ustaleniu opcjonalnego wypełnienia, możemy wstawić dwukropek i zaraz po nim, jeden ze specyfikatorów formatu mających duży związek z tematem. Pełna ich lista razem ze znaczeniem została przedstawiona na końcu artykułu,
  4. Istnieje możliwość wprowadzenia dodatkowej liczby całkowitej pełniącej rolę precyzji wartości, czyli konkretnie ile miejsc po przecinku ma zostać uwzględnionych podczas formatowania liczby zmiennoprzecinkowej. Dla liczb całkowitych TAKŻE ma znaczenie - wtedy wypełnia wszystkie puste pola zerami, jeśli liczba potrzebuje ich mniej niż wyznaczono.

PRZYKŁADY KODÓW ŹRÓDŁOWYCH

Aby zwiększyć szanse na zrozumienie tego tematu jak działa formatowanie danych w języku C#, podam teraz kilka przykładów dotyczących formatowania złożonego z użyciem wszystkich powyższych bajerów :), plus krótki komentarz pod każdym z nich.

LICZBA CAŁKOWITA WYRÓWNANA DO LEWEJ STRONY O DŁUGOŚCI DZIESIĘCIU ZNAKÓW
int x = 5000;

Console.WriteLine("[{0,-10}]", x);

Na strumieniu wyjściowym ukaże się liczba 5000 wyrównana do lewej strony, ale długość przeznaczonego dla niej pola będzie równa 10 znaków (domyślnie byłyby cztery, bo zawsze wyznacza tyle, ile jest cyfr).

LICZBA CAŁKOWITA W SYSTEMIE SZESNASTKOWYM O DŁUGOŚCI OŚMIU ZNAKÓW
int x = 12000;

Console.WriteLine("[{0,8:X}]", x);

Na strumieniu wyjściowym zostanie zaprezentowana liczba 12000 w systemie heksadecymalnym (szesnastkowym). Odpowiada za to specyfikator "X" (może to być też mała litera 'x'). Przeznaczono dla tej wartości osiem znaków, zatem i w tym przypadku będzie wolne miejsce. Formatowanie danych w języku C# pozwala na elastyczne kontrolowanie wyniku wyjściowego.

LICZBA ZMIENNOPRZECINKOWA W POSTACI NOTACJI WYKŁADNICZEJ (NAUKOWEJ) Z DOKŁADNOŚCIĄ DO DWÓCH MIEJSC PO PRZECINKU
double x = 150.67;
	
Console.WriteLine("[{0:E2}]", x);

Wyświetli się liczba w formacie "1,51E+002". To jest notacja wykładnicza, zwana też naukową. W tym przypadku czynnik precyzji wchodzi w grę i ma wpływ na formatowanie. Ponieważ wstawiliśmy dwójkę, dokładność jest do dwóch miejsc po przecinku, stąd to 1,51.

Dla ciekawskich (i dwójkowych z matematyki, tak jak ja :)):

1,51E+002 = 1,51*102

Ten "plus" zaraz po literze 'E' oznacza znak wykładnika potęgi. Jeśli kiedykolwiek zauważycie znak minusa, oznacza to ujemny wykładnik.

LICZBA ZMIENNOPRZECINKOWA ZE SPECYFIKATOREM WALUTOWYM
decimal x = 83.9875M;

Console.WriteLine("[{0:C2}]", x);

Wartość na wyjściu: "83,99 zł". Ustaliliśmy dwa miejsca po przecinku i tak, a nie inaczej, wynik został zaokrąglony. Zwracam Waszą uwagę na dopisek waluty PLN! Prawdopodobnie C# ustala walutę w zależności od ustawionego języka w systemie operacyjnym. Ponieważ ja mam po polsku, to wstawił PLN-y :D.

LISTA SPECYFIKATORÓW

Dobrze. Oto pełne zestawienie dostępnych specyfikatorów, które mogą Wam umilić formatowanie danych w języku C# w pełnej oprawie:

SPECYFIKATOR ZNACZENIE OBSŁUGIWANE TYPY DANYCH
C Wartość walutowa wszystkie numeryczne
D Wartość dziesiętna całkowite numeryczne
E Wartość w formie notacji naukowej wszystkie numeryczne
F Wartość rzeczywista z separatorem dziesiętnym
G Wartość rzeczywista lub w formie notacji naukowej (w zależności od tego, która z nich będzie krótsza)
N Wartość numeryczna z separatorami dziesiętnymi
P Wartość w formie procentu
R "Round-trip" ("zapewnienie", żeby wartość liczbowa po przekonwertowaniu na łańcuch znaków, została taką samą wartością po ponownym przekonwertowaniu na liczbę) float, double, BigInteger
X Wartość w systemie szesnastkowym (heksadecymalnym) całkowite numeryczne

Formatowanie danych w języku C# przy użyciu specyfikatorów

Formatowanie danych w języku C# przy użyciu specyfikatorów nawiązuje do języka C, w którym dzięki odpowiedniej kombinacji znaków nadaje się danej zupełnie nowy wygląd!


To tyle co mam w zanadrzu na ten temat. Zdecydowanie więcej czasu zabierze Wam ewentualne zapamiętanie tych specyfikatorów, natomiast postarajcie się skoncentrować tylko na kilku z nich i wpierw opanować na pamięć powyższy wzór.

PODOBNE ARTYKUŁY