Formatowanie Podstawy programowania Formatowaniem nazywamy proces przekształcenia danych z postaci binarnej do postaci tekstowej lub proces przekształcenia danych w odwrotnym kierunku. W przypadku wprowadzenia danych przekształcamy dane mające postać fragmentów tekstu do danych komputerowych. Tekst, do którego stosuje się formatowanie, można pobierać z pliku lub z tablicy tekstowej. W przypadku wyprowadzenia danych przekształcamy dane z postaci binarnej (komputerowej) do postaci tekstowej. Tekst jako wynik formatowania można zapisywać do pliku lub do tablicy tekstowej. Jednej z metod formatowania jest zastosowanie tzw. specyfikatorów formatu (ang. format specifications). Specyfikatory formatu są wpisywane do tzw. tekstu formatującego (ang. format string). Specyfikator formatu (ang. format specification) jest mocno skróconym opisem reguł przekształcenia fragmentu z postaci tekstowej do postaci binarnej (komputerowej) lub odwrotnie. Charakter korzystania ze specyfikatora formatu zależy od kierunku przekształcenia. W przypadku wprowadzenia danych specyfikator formatu zawiera reguły przekształcenia fragmentu tekstu z danymi w wartość obiektu programowego. W przypadku wyprowadzenia danych specyfikator formatu zawiera reguły przekształcenia wartości obiektu programowego we fragment tekstu. Druga metoda formatowania polega na przekształceniu wyodrębnionych fragmentów tekstu. 4. Formatowanie w języku Visual Basic.NET Wprowadzeniu danych W środowisku Visual Basic.NET przy wprowadzeniu danych jest stosowana metoda wyodrębnienia fragmentów tekstu, do których stosuje się przekształcenie. Po wydzieleniu fragmentu tekstu stosuje się funkcja, która konwertuje fragment do postaci binarnej. Przykłady takich funkcji: CInt do konwersji liczb całkowitych, CDbl do konwersji liczb zmiennoprzecinkowych. Lista funkcji konwercji w środowisku Visual Basic 2005:
CBool(expression) CByte(expression) CChar(expression) CDate(expression) CDbl(expression) CDec(expression) CInt(expression) CLng(expression) CObj(expression) CSByte(expression) CShort(expression) CSng(expression) CStr(expression) CUInt(expression) CULng(expression) CUShort(expression) W każdej klasie liczbowej i znakowej istnieje też metoda konwersji Parse, która konwertuje tekst do postaci binarnej (komputerowej). Na przykład dla liczb rzeczywistych metoda Parse ma następującą deklaracje: Overloads Public Shared Function Parse(ByVal s As String) As Double Metodę Parse można przepisywać na nowo przesłaniając metodę bazową. Przykład z metoda Parse: Public Class Temperature ' Analiza wiersza z temperaturą w formacie ' [znak biały][znak liczby]cyfry['f 'C][znak biały] Public Shared Function Parse(ByVal s As String) As Temperature Dim tt As New Temperature() If s.trimend(nothing).endswith("'f") Then tt.value = Double.Parse(s.Remove(s.LastIndexOf("'"c), 2)) Else If s.trimend(nothing).endswith("'c") Then tt.celsius = Double.Parse(s.Remove(s.LastIndexOf("'"c), 2)) Else tt.value = Double.Parse(s) End If End If Return tt End Function 'Parse ' Pole danych dla temperatury: Protected m_value As Double Public Property Value() As Double Get Return m_value
End Get Set(ByVal Value As Double) m_value = Value End Set End Property Public Property Celsius() As Double Get Return (m_value - 32) / 1.8 End Get Set(ByVal Value As Double) m_value = Value * 1.8 + 32 End Set End Property End Class W przykładzie jest wykorzystana grupa metod klasy String: TrimEnd do wyeliminowania białych znaków ( w przypadku argumentu Nothing) na końcu wiersza, EndsWith sprawdzająca, czy jest na końcu wiersza zadany fragment, LastIndexOf zwracająca indeks ostatniej pozycji w wierszu z szukanym symbolem, Remove kasująca zadaną liczbę znaków od zadanej pozycji.
Często stosowane właściwości i metody klasy String: właściwość Chars(ByVal indeks As Integer) - zwraca znak Unicode typu Char na pozycji indeks. Na przykład: Dim str As String = "Test" Dim symb As Char = str.chars(1) 'symb jest równy "e" właściwość Length - zwraca liczbe znaków w wierszu. Na przykład: Dim str As String = "Test" Dim leng As Integer = str.length 'leng jest równa "4" metoda IndexOf(różne argumenty) - zwraca pozycje znaku lub podwiersza w wierszu. Na przykład: Dim str As String = "Test" Dim r As Integer = str.indexof("s"c) 'r jest równa "2" metoda Split(różne argumenty) - zwraca listę podwierszy, na które jest podzielony wiersz przez separatory wskazane w argumencie. Na przykład: Dim str As String = "Test: a=1 b=2" Dim separators As Char() = New Char() {":"c, " "c} Dim temp As String() = str.split(separators) 'lista temp zawiera "Test", "", "a=1", "b=2" metoda Substring(ByVal pozycja As Integer, ByVal ilość As Integer) - zwraca wskazanego rozmiaru podwiersz od wskazanej pozycji. Na przykład: Dim str As String = "Test: a=1 b=2" Dim s As String = str.substring(0,4) 's jest równa "Test" metoda Trim() - eliminuje białe spacje (tj. spacja, tabulacja, "powrót", "nowy wiersz") na początku i końcu wierszu. Na przykład: Dim str As String = " Test: a=1 b=2 " str = str.trim() Dim s As String = str.substring(0,4) 's jest równa "Test"
Wyprowadzenie danych W środowisku Visual Basic.NET wyprowadzenie danych jest realizowane metoda łączenia fragmentów tekstu. Każda klasa zawiera metodę ToString. Metodę ToString można wywołać bez argumentów lub z argumentem - wierszem, który opisuje formatowanie. Wiersz formatujący może być standardowym lub niestandardowym. Standardowy wiersz formatujący dla danych liczbowych zawiera specyfikator formatu, który ma strukturę: Axx, gdzie A - litera opisująca typ konwersji (patrz tabelę), xx - liczba od 0 do 99, która opisuje ilość znaczących cyfr po przecinku lub zer z prawej strony dla liczb całkowitych. Typy konwersji dla danych liczbowych są przedstawione w następującej tabeli. Znak typu Pole w tekście wyjściowym konwersji c, C Liczba dziesiętna w formacie walutowym zdefiniowanym w obiekcie (walutowy) typu NumberFormatInfo 1) d, D Liczba całkowita dziesiętna w formacie zdefiniowanym w obiekcie (dziesiętny) typu NumberFormatInfo 1) e, E Liczba zmiennopozycyjna w formacie potęgowym "-d.ddd...e+ddd" lub "-d.ddd...e+ddd" (specyfikator precyzji zadaje liczbę cyfr po przecinku) f, F Liczba zmiennopozycyjna w formacie stałoprzecinkowym "- ddd.ddd..." (specyfikator precyzji zadaje liczbę cyfr po przecinku) g, G Liczba zmiennopozycyjna w formacie uniwersalnym, tj. potęgowym lub stałoprzecinkowym. Minimalna precyzja: 3 cyfry dla Byte lub SByte 5 cyfr dla Int16 lub UInt16 10 cyfr dla Int32 lub UInt32 19 cyfr dla Int64 lub UInt64 7 cyfr dla Single 15 cyfr dla Double 29 cyfr dla Decimal n, N Liczba zmiennopozycyjna w formacie stałoprzecinkowym z separatorami tysiąc (konwersja jest sterowana globalnymi zmiennymi) p, P Liczba zmiennopozycyjna w formacie procentowym r, R Liczba zmiennopozycyjna w formacie uniwersalnym i rewersyjnym, tj. jeżeli liczbę przekształcić w odwrotnym kierunku, to otrzymamy taką samą wartość x, X Liczba całkowita szesnastkowa 1) Obiekt typu NumberFormatInfo zawiera informację o warunkach konwersji. Obiekt typu NumberFormatInfo alokuje i rejestruje w systemie Windows obiekt klasy CultureInfo. Referencję do tego obiektu należy przekazać do klasy Thread.
Przykład: Imports System Imports System.Globalization Imports System.Threading Imports System.IO Imports System.IO.TextWriter Imports System.IO.StreamWriter Class Test Public Shared Sub Main() Thread.CurrentThread.CurrentCulture = New CultureInfo("enus") Dim doub As Double = 123456789 ' alokacja obiektu typu StreamWriter Dim sw As StreamWriter = New StreamWriter("Test.txt") sw.writeline("przykład w en-us środowisku:") sw.writeline(doub.tostring("c")) sw.writeline(doub.tostring("e")) sw.writeline(doub.tostring("p")) sw.writeline(doub.tostring("n")) sw.writeline(doub.tostring("f")) Thread.CurrentThread.CurrentCulture = New CultureInfo("de- -DE") sw.writeline("przykład w de-de środowisku:") sw.writeline(doub.tostring("c")) sw.writeline(doub.tostring("e")) sw.writeline(doub.tostring("p")) sw.writeline(doub.tostring("n")) sw.writeline(doub.tostring("f")) sw.close() End Sub End Class
Niestandardowy wiersz formatujący dla danych liczbowych zawiera znaki, które są przedstawione w niżej położonej tabeli. Znak Nazwa Przeznaczenie formatujący 0 Zero placeholder Do pozycji z tym znakiem jest wpisywana cyfra liczby # Digit placeholder Do pozycji z tym znakiem jest wpisywana cyfra liczby. Decimal point Pozycja przecinka, Thousand separator and number scaling Separator dla tysiąc (w języku angielskim) lub znak powodujący mnożenie o 1000 % Percentage placeholder Powoduje mnożenie liczby o 100 E0, E+0, E-0, e0, e+0, e-0 Scientific notation Powoduje zapisywanie liczby w formie potęgowej ; Section separator Separator do rozdzielenia wariantów przekształcenia dodatniej, ujemnej i zerowej wartości 'aaa', "aaa" Literal string Fragment, który przechodzi w wiersz wynikowy Inne znaki All other character Znaki, które przechodzą w wiersz wynikowy Przykład. Dim mydouble As Double = 1234567890 Dim mystring As String = mydouble.tostring( "(###) ### - ####" ) ' The value of mystring is "(123) 456 7890". Dim MyInt As Integer = 42 MyString = MyInt.ToString( "My Number " + Control- Chars.Lf + "= #" ) ' In the U.S. English culture, MyString has the value: ' "My Number ' = 42".