Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame^] | 1 | SYNOPSIS |
| 2 | string sprintf(string fmt, ...) |
| 3 | |
| 4 | BESCHREIBUNG |
| 5 | Mit dieser Funktion kann man auf einfache Weise aus dem Inhalt |
| 6 | von Variablen einen String bauen; und dies effektiver als |
| 7 | mit der ueblichen "Du hast "+anzahl+" Punkt(e)"-Methode. |
| 8 | |
| 9 | Die Funktion bekommt als erstes Argument einen Formatstring fmt, |
| 10 | der Informationen darueber enthaelt, wie die weiteren beliebigen |
| 11 | Argumente in den Ergebnisstring eingebaut werden sollen. |
| 12 | Die meisten Zeichen gelangen vom Formatstring unveraendert in |
| 13 | den Ausgabestring. Die Regeln zum Einbau eines Arguments werden |
| 14 | immer mit '%' eingeleitet. Moechte man ein '%' in die Ausgabe |
| 15 | bringen, so muss man im Formatstring "%%" verwenden. |
| 16 | |
| 17 | Ein einfaches Beispiel ist erg=sprintf("%s %d", str, i); |
| 18 | '%' leitet einen Argumentformatstring (AFS) ein. Das 's' schliesst |
| 19 | ihn ab und besagt, dass ein String eingebaut werden soll. Das |
| 20 | folgende Leerzeichen wird unveraendert uebernommen. '%' leitet |
| 21 | wieder einen neuen Formatstring ein, wobei 'd' eine Ganzzahl |
| 22 | bezeichnet (eine Variable von Typ int). |
| 23 | Dies ist ein allerdings nur ein sehr einfaches Beispiel. |
| 24 | |
| 25 | Jeder Argumentformatstring kennzeichnet also, auf welche Art |
| 26 | ein Argument in das Ergebnis eingebaut werden soll. Der erste |
| 27 | AFS ist fuer das zweite Argument der Funktion, der zweite AFS |
| 28 | fuer das dritte Argument u.s.w. (das erste Argument der Funktion |
| 29 | ist ja der Formatstring selbst). |
| 30 | |
| 31 | Jeder AFS beginnt mit einem '%' und endet mit einem der |
| 32 | folgenden Zeichen (Argumenttyp-Kennzeichner): |
| 33 | Zeichen Argumenttyp Bemerkung |
| 34 | 's' string |
| 35 | 'c' integer als ASCII-Zeichen |
| 36 | 'd' 'i' integer Dezimalschreibweise |
| 37 | 'o' integer Oktalschreibweise |
| 38 | 'b' 'B' integer Binaerschreibweise |
| 39 | 'x' 'X' integer Hexadezimalschreibweise |
| 40 | 'e' 'E' float Exponentialschreibweise |
| 41 | 'f' 'F' float Gleitkommadarstellung |
| 42 | 'g' 'G' float Gleitkommadarstellung |
| 43 | 'O' mixed Gibt fuer Debugging alles irgendwie |
| 44 | lesbar aus, auch Arrays und Mappings |
| 45 | 'Q' mixed Wie 'O', gibt jedoch Sonderzeichen in |
| 46 | Strings in der LPC-Notation aus |
| 47 | |
| 48 | Zwischen dem '%' und dem Argumenttyp-Kennzeichner kann man |
| 49 | noch mehrere Modifikatoren setzen, die das Verhalten |
| 50 | beeinflussen. |
| 51 | Hier eine Uebersicht. n steht hier fuer eine Ganzzahl, also |
| 52 | zum Beispiel "12". |
| 53 | Modifikator Bedeutung |
| 54 | n Minimale Stringlaenge, die fuer dieses Argument |
| 55 | verwendet werden soll. Fehlende Zeichen werden mit |
| 56 | einem Fuellzeichen aufgefuellt. Beginnt n mit einer |
| 57 | '0' (etwa "08") so ist das Fuellzeichen '0' sonst |
| 58 | ist es per Default ' '. (sogenannte 'Feldbreite') |
| 59 | .n Bei Ganzzahlen die Maxanzahl der Stellen, bei Gleit- |
| 60 | kommazahlen die Maximalzahl der Nachkommastellen. |
| 61 | Bei (einfachen) Strings die Maximallaenge. |
| 62 | :n Ist dasselbe wie n.n - setzt also beide Werte auf |
| 63 | dieselbe Zahl. |
| 64 | 'X' Als Fuellzeichen wird X genutzt. X koennen dabei |
| 65 | auch mehrere Zeichen sein, etwa fuehrt '-=' zu |
| 66 | Fuellungen der Art "-=-=-=-=". Um mit Hochkommas |
| 67 | zu fuellen ist '\\'' anzugeben. Rueckwaerts- |
| 68 | schraegstrich entsprechend mit '\\\\'. |
| 69 | <Space> Vor positive Zahlen wird ein Leerzeichen gefuegt. |
| 70 | + Vor positive Zahlen wird ein '+' gefuegt. |
| 71 | - Der Wert wird linksbuendig in das fuer dieses Argument |
| 72 | vorgesehene Feld eingefuegt (Standard ist rechts- |
| 73 | buendig). Bei Strings wird meistens diese Ausrichtung |
| 74 | die sinnvollste sein. |
| 75 | | Der Wert wird zentriert in das Feld eingefuegt. |
| 76 | (Siehe Modifikator n, Feldbreite) |
| 77 | $ Blocksatz. Benoetigt eine Feldbreite, funktioniert nur |
| 78 | bei Strings (auch im Spaltenmodus). |
| 79 | = Spaltenmodus (siehe unten). |
| 80 | # Fuer Strings: Tabellenmodus (siehe unten). |
| 81 | Fuer '%O'/'%Q': kompakte Ausgabe. |
| 82 | @ Arraymodus (siehe unten). |
| 83 | * Ein Stern kann immer dort eingesetzt werden, wo |
| 84 | hier weiter oben ein n fuer eine Ganzzahl steht. |
| 85 | Der Wert der Zahl muss dann als weiterer Parameter |
| 86 | an die Funktion uebergeben werden. |
| 87 | |
| 88 | BEISPIELE |
| 89 | Mit den bis jetzt erwaehnten Moeglichkeiten kann man zB machen: |
| 90 | |
| 91 | sprintf("%d (dec) == %o (octal) == %x (hex)", 20, 20, 20); |
| 92 | => "20 (dec) == 24 (octal) == 14 (hex)" |
| 93 | |
| 94 | sprintf("Du drehst den Knopf um %.3f Umdrehungen", 12.3456); |
| 95 | => "Du drehst den Knopf um 12.345 Umdrehungen" |
| 96 | |
| 97 | sprintf("Du liest %|'*':9s", "Fiona"); |
| 98 | => "Du liest **Fiona**" |
| 99 | |
| 100 | sprintf("Auf dem Zettelstueck steht: %-.*s...", 7, "Hallo Du da"); |
| 101 | => "Auf dem Zettelstueck steht: Hallo D... |
| 102 | |
| 103 | ERWEITERTE MODI |
| 104 | Mit dem Modifikatoren = # und @ stehen maechtige Werkzeuge zur |
| 105 | Verfuegung. Mit ein wenig Ueberlegung kann man sich oft viele |
| 106 | Zeilen Code ersparen. |
| 107 | Arraymodus (@): |
| 108 | sprintf("%@s", arr_of_string); |
| 109 | Der Argumentformatstring (allerdings ohne das @) wird sooft |
| 110 | hintereinandergereiht, wieviele Elemente das Array hat. |
| 111 | Jeder AFS wird dann fuer ein Element des Arrays benutzt. |
| 112 | sprintf("%@s", ({"aaa","bbb"})) ist somit dasselbe wie |
| 113 | sprintf("%s%s", "aaa", "bbb"). Allerdings passt es sich |
| 114 | immer an die Elementzahl der uebergebenden Arrays an. |
| 115 | Dies ist nuetzlich um Ergebnisse von map() oder aehnlich |
| 116 | auszugeben. |
| 117 | sprintf("%@s", map_objects(all_inventory(), "short")); |
| 118 | Der Argumenttyp-Kennzeichner muss hierbei immer dem Typen |
| 119 | eines Elementes des Arrays entsprechen. |
| 120 | Spaltenmodus (=): |
| 121 | Diese Funktion bricht Text um. Die Feldbreite muss angegeben |
| 122 | werden. Wird neben der Feldbreite auch eine maximale String- |
| 123 | laenge angegeben, so wird die letztere fuer die Breite des |
| 124 | Umbrechens verwendet, die Feldbreite wird mit Fuellzeichen |
| 125 | aufgefuellt. |
| 126 | sprintf("%=-20s", str); bricht den String str 'wordwrap'end |
| 127 | auf 20 Zeichen Laenge um. sprintf("%=-*s", len, str); |
| 128 | ist schon eine einfache break_string() Variante. |
| 129 | Tabellenmodus (#): |
| 130 | Diese Funktion gibt Strings tabellenartig aus. Die Teilstrings |
| 131 | muessen mit \n getrennt als ein String als Argument uebergeben |
| 132 | werden. Die Feldbreite muss angegeben werden und bezeichnet |
| 133 | die (maximale) Gesamtbreite der Tabelle. |
| 134 | Die Anzahl der Spalten der Tabelle wird moeglichst optimal |
| 135 | bestimmt, und ist fuer alle Spalten gleich. Wird ein |
| 136 | Wert als 'Praezision' angegeben, so ist dies die Anzahl von |
| 137 | Spalten, die verwendet werden soll. |
| 138 | sprintf("%#30.4s", str) erzeugt eine Tabelle, die maximal |
| 139 | 30 Zeichen breit ist und 4 Spalten enthaelt. |
| 140 | sprintf("%#30s", str) legt die Spaltenzahl dynamisch anhand |
| 141 | der Einzelstringlaengen fest, so dass der laengste String |
| 142 | noch genau in die Tabelle passt. |
| 143 | Wenn string* worte die in die Tabelle einzubettenden Worte |
| 144 | enthaelt, so muss str=implode(worte,"\n") sein. |
| 145 | |
| 146 | SIEHE AUCH |
| 147 | printf(E) |