sscanf »
« soundex
- PHP-Handbuch
- Funktionsreferenz
- Textverarbeitung
- Zeichenketten
- String-Funktionen
(PHP 4, PHP 5, PHP 7, PHP 8)
sprintf — Gibt einen formatierten String zurück
Beschreibung
sprintf(string $format
, mixed ...$values
): string
Gibt eine anhand des Formatierungs-Strings format
gebildete Zeichenkette zurück.
Parameter-Liste
format
-
Der Formatstring setzt sich aus keiner oder mehreren Anweisungen zusammen: Normale Zeichen (abgesehen von
%
), die direkt in das Ergebnis kopiert werden und Konvertierungsanweisungen, die jeweils ihre eigenen Parameter abrufen.Eine Konvertierungsanweisung folgt diesem Prototypen:
%[ArgNum$][Flags][Weite][.Präzision]Spezifizierer
.ArgNum
Eine Ganzzahl gefolgt von einem Dollarzeichen
$
, die die Nummer des Arguments angibt, das für die Konversion verwendet werden soll.Flags Flag Beschreibung -
Linksbündig innerhalb der angegebenen Feldbreite; Rechtsbündig ist der Standard +
Positive Zahlen mit einem Pluszeichen +
; Standardmäßig werden nur negative Zahlen mit negativen Vorzeichen ausgegebenFüllt das Ergebnis mit Leerzeichen auf. Dies ist der Standard. 0
Füllt nach Links mit Nullen auf. Mit dem s
-Spezifizierer kann dies auch nach rechts mit Nullen auffüllen.'
(Zeichen)Füllt das Ergebnis mit dem angegebenen Zeichen auf. Breite
Entweder eine Ganzzahl die angibt, wie viele Zeichen (Minimum) das Konvertierungsergebnis haben soll oder
*
. Wenn*
verwendet wird, wird die Breite als zusätzlicher ganzzahliger Wert angegeben, der bestimmt, wie viele Zeichen vor dem durch den Spezifizierer formatierten Wert stehen sollen.Genauigkeit
Ein Punkt
.
, optional gefolgt von einer Ganzzahl oder*
, dessen Bedeutung vom Spezifizierer abhängt:- Für die Spezifizierer
e
,E
,f
undF
: Dies stellt die Anzahl der Nachkommastellen an, die nach dem Dezimaltrennzeichen ausgegeben werden soll (Standardmäßig ist dies 6). - Für die Spezifizierer
g
,G
,h
undH
: Die maximale Anzahl der auszugebenenden signifikanten Nachkommastellen. - Für den
s
Spezifizierer: Verhält sich wie ein Abschneidepunkt, der eine maximale Anzahl an Zeichen in der Zeichenkette angibt.
Hinweis: Wenn der Punkt ohne einen expliziten Wert für die Genauigkeit angegeben wird, wird 0 angenommen. Wenn
*
verwendet wird, wird die Genauigkeit als zusätzliche Ganzzahl vor dem durch den Bezeichner formatierten Wert angegeben.Spezifizierer Spezifizierer Beschreibung %
Ein Prozentzeichen. Kein Parameter nötig. b
Der Parameter wird als Ganzzahl behandelt und als Binärzahl ausgegeben. c
Der Parameter wird als Ganzzahl behandelt und als Zeichen aus dem ASCII-Zeichensatz ausgegeben. d
Der Parameter wird als Ganzzahl behandelt und als (vorzeichenbehaftete) Dezimalzahl ausgegeben. e
Der Parameter wird als Zahl in wissenschaftlicher Schreibweise (z.B. 1.2e+2) behandelt. E
Wie der Spezifizierer e
, aber schreibt einen Großbuchstaben (z.B. 1.2E+2).f
Der Parameter wird als Gleitkommazahl betrachtet und als Gleitkommazahl ausgegeben (abhängig von der Locale). F
Der Parameter wird als Gleitkommazahl betrachtet und als Gleitkommazahl (unabhängig von der Locale) ausgegeben. g
Generelles Format.
Sei P gleich der Genauigkeit, wenn nicht Null, 6, wenn die Genauigkeit nicht angegeben ist, oder 1 wenn die Genauigkeit Null ist. Dann, wenn eine Konvertierung mittels E einen Exponenten von X hätte:
Wenn P > X ≥ −4, erfolgt die Konvertierung mit Spezifizierer f und Genauigkeit P - (X + 1), andernfalls mit Spezifizierer e und Genauigkeit P - 1.
G
Wie der Spezifizierer g
, aber es wirdE
undf
verwendet.h
Wie der Spezifizierer g
, aber es werdenF
verwendet. Verfügbar ab PHP 8.0.0.H
Wie der Spezifizierer g
, aber es werdenE
undF
verwendet. Verfügbar ab PHP 8.0.0.o
Der Parameter wird als Ganzzahl betrachtet und als Oktalzahl ausgegeben. s
Der Parameter wird als Zeichenkette betrachtet und ausgegeben. u
Der Parameter wird als Ganzzahl betrachtet und als vorzeichenlose Dezimalzahl ausgegeben. x
Der Parameter wird als Ganzzahl betrachtet und als Hexadezimalzahl (mit Kleinbuchstaben) ausgegeben. X
Der Parameter wird als Ganzzahl betrachtet und als Hexadezimalzahl (mit Großbuchstaben) ausgegeben. Warnung
Der Spezifizierer
c
ignoriert Auffüllung und Weite.Warnung
Der Versuch, die Kombination aus Zeichenketten mit Weite-Spezifizierern und Zeichensätzen die mehr als ein Byte pro zeichen erwarten zu verwenden, führt zu unvorhersehbaren Ergebnissen.
Variablen werden auf einen für den Spezifizier passenden Typen umgewandelt:
Typ-Behandlung Typ Spezifizierer string s
int d
,u
,c
,o
,x
,X
,b
float e
,E
,f
,F
,g
,G
,h
,H
- Für die Spezifizierer
values
Rückgabewerte
Gibt eine anhand des Formatierungs-Strings format
gebildete Zeichenkette zurück.
Fehler/Exceptions
Wenn die Anzahl der Argumente Null ist, wird seit PHP 8.0.0 ein ValueError ausgelöst. Vor PHP 8.0.0 wurde stattdessen eine E_WARNING
ausgegeben.
Wenn [width]
kleiner als Null oder größer als PHP_INT_MAX
ist, wird seit PHP 8.0.0 ein ValueError ausgelöst. Vor PHP 8.0.0 wurde stattdessen eine E_WARNING
ausgegeben.
Wenn [precision]
kleiner als Null oder größer als PHP_INT_MAX
ist, wird seit PHP 8.0.0 ein ValueError ausgelöst. Vor PHP 8.0.0 wurde stattdessen eine E_WARNING
ausgegeben.
Wenn weniger Argumente angegeben werden als nötig, wird seit PHP 8.0.0 ein ArgumentCountError ausgelöst. Vor PHP 8.0.0 wurde stattdessen false
zurückgegeben und eine E_WARNING
ausgegeben.
Changelog
Version | Beschreibung |
---|---|
8.0.0 | Diese Funktion gibt bei Auftreten eines Fehlers nicht mehr false zurück. |
8.0.0 | Wenn die Anzahl der Argumente Null ist, löst diese Funktion einen ValueError aus; vorher gab sie stattdessen eine E_WARNING aus. |
8.0.0 | Wenn [width] kleiner als Null oder größer als PHP_INT_MAX ist, löst diese Funktion einen ValueError aus; vorher gab sie stattdessen einen E_WARNING aus. |
8.0.0 | Wenn [precision] kleiner als Null oder größer als PHP_INT_MAX ist, löst diese Funktion einen ValueError aus; vorher gab sie stattdessen eine E_WARNING aus. |
8.0.0 | Wenn weniger Argumente angegeben werden als nötig, löst diese Funktion einen ArgumentCountError aus; vorher gab sie stattdessen eine E_WARNING aus. |
Beispiele
Beispiel #1 Argumente tauschen
Der Formatstring unterstützt nummerierte Argumente und kann daher auch ihre Position bestimmen (argument numbering/swapping).
<?php
$anzahl = 5;
$ort = 'Baum';$format = 'Es sind %d Affen auf dem %s';
echo sprintf($format, $anzahl, $ort);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Es sind 5 Affen auf dem Baum
Aber nehmen wir einmal an, dass wir den Formatstring in einer separaten Datei erstellen, da wir ihn internationalisieren wollen und deshalb wie folgt umschreiben:
<?php
$format = 'Der %s enthält %d Affen';
echo sprintf($format, $anzahl, $ort);
?>
Nun haben wir ein Problem. Die Reihenfolge der Platzhalter im Formatstrings entspricht nicht mehr der Reihenfolge der Argumente im Code. Wir würden gern den Code belassen wie er ist und einfach im Formatstring angeben, welche Argumenten welchen Platzhaltern entsprechen. Wir würden dann den Formatstring wie folgt schreiben:
<?php
$format = 'Der %2$s enthält %1$d Affen';
echo sprintf($format, $anzahl, $ort);
?>
Ein weiterer Vorteil ist, dass die Platzhalter wiederholt werden können, ohne mehr Argumente im Code hinzufügen zu müssen.
<?php
$format = 'Der %2$s enthält %1$d Affen.
%1$d Affen sind ziemlich viel für einen %2$s.';
echo sprintf($format, $anzahl, $ort);
?>
Wenn Argumenttausch verwendet wird, muss die n$
-Positionsangabe direkt nach dem Prozentzeichen (%
) folgen, vor jeglichen anderen Angaben, wie unten zu sehen ist.
Beispiel #2 Angabe von Füllzeichen
<?php
echo sprintf("%'.9d\n", 123);
echo sprintf("%'.09d\n", 123);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
......123000000123
Beispiel #3 Positionstausch mit weiteren Spezifikatoren
<?php
$format= 'Der %2$s enthält %1$04d Affen';
echo sprintf($format, $anzahl, $ort);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Der Baum enthält 0005 Affen.
Beispiel #4 sprintf(): Mit Nullen aufgefüllte Integer
<?php
$isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
?>
Beispiel #5 sprintf(): Währungsformatierung
<?php
$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
echo $money;
echo "\n";
$formatted = sprintf("%01.2f", $money);
echo $formatted;
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
123.1123.10
Beispiel #6 sprintf(): Wissenschaftliche Notation
echo <?php
$number = 362525200;
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
3.625e+8
Siehe auch
- printf() - Liefert einen formatierten String
- fprintf() - Schreibt einen formatierten String in einen Stream
- vprintf() - Gibt einen formatierten String aus
- vsprintf() - Gibt einen formatierten String zurück
- vfprintf() - Schreibt einen formatierten String in einen Stream
- sscanf() - Überträgt einen String in ein angegebenes Format
- fscanf() - Interpretiert den Input einer Datei entsprechend einem angegebenen Format
- number_format() - Formatiert eine Zahl mit Tausender-Trennzeichen
- date() - Formatiert einen Unix-Zeitstempel
Improve This Page
+add a note
User Contributed Notes 36 notes
up
down
103
remy dot damour at -please-no-spam-laposte dot net ¶
15 years ago
Ie. to print '%' character you need to escape it with itself:With printf() and sprintf() functions, escape character is not backslash '\' but rather '%'.
<?php
printf('%%%s%%', 'koko'); #output: '%koko%'
?>
up
down
72
Alex R. Gibbs ¶
11 years ago
<?php | +1| -1| 2. Padding with a '0' is different than padding with other characters. Zeros will only be added at the front of a number, after any sign. Other characters will be added before the sign, or after the number: <?php |-002|1. A plus sign ('+') means put a '+' before positive numbers while a minus sign ('-') means left justify. The documentation incorrectly states that they are interchangeable. They produce unique results that can be combined:
echo sprintf ("|%+4d|%+4d|\n", 1, -1);
echo sprintf ("|%-4d|%-4d|\n", 1, -1);
echo sprintf ("|%+-4d|%+-4d|\n", 1, -1);
?>
outputs:
|1 |-1 |
|+1 |-1 |
echo sprintf ("|%04d|\n", -2);
echo sprintf ("|%':4d|\n", -2);
echo sprintf ("|%-':4d|\n", -2);// Specifying both "-" and "0" creates a conflict with unexpected results:
echo sprintf ("|%-04d|\n", -2);// Padding with other digits behaves like other non-zero characters:
echo sprintf ("|%-'14d|\n", -2);
echo sprintf ("|%-'04d|\n", -2);
?>
outputs:
|::-2|
|-2::|
|-2 |
|-211|
|-2 |
up
down
20
timo dot frenay at gmail dot com ¶
13 years ago
<?phpHere is how to print a floating point number with 16 significant digits regardless of magnitude:
$result = sprintf(sprintf('%%.%dF', max(15 - floor(log10($value)), 0)), $value);
?>
This works more reliably than doing something like sprintf('%.15F', $value) as the latter may cut off significant digits for very small numbers, or prints bogus digits (meaning extra digits beyond what can reliably be represented in a floating point number) for very large numbers.
up
down
23
kontakt at myseosolution dot de ¶
9 years ago
Example: <?php This threw me a little off. To get the desired result, one needs to add the precision (2) and the length of the decimal seperator "." (1). So the correct pattern would be <?php Please see http://stackoverflow.com/a/28739819/413531 for a more detailed explanation.There are already some comments on using sprintf to force leading leading zeros but the examples only include integers. I needed leading zeros on floating point numbers and was surprised that it didn't work as expected.
<?php
sprintf('%02d', 1);
?>
This will result in 01. However, trying the same for a float with precision doesn't work:
sprintf('%02.2f', 1);
?>
Yields 1.00.
sprintf('%05.2f', 1);
?>
Output: 01.00
up
down
9
nate at frickenate dot com ¶
14 years ago
<?php/** return return Here's a clean, working version of functions to allow using named arguments instead of numeric ones. ex: instead of sprintf('%1$s', 'Joe');, we can use sprintf('%name$s', array('name' => 'Joe'));. I've provided 2 different versions: the first uses the php-like syntax (ex: %name$s), while the second uses the python syntax (ex: %(name)s).
* version of sprintf for cases where named arguments are desired (php syntax)
*
* with sprintf: sprintf('second: %2$s ; first: %1$s', '1st', '2nd');
*
* with sprintfn: sprintfn('second: %second$s ; first: %first$s', array(
* 'first' => '1st',
* 'second'=> '2nd'
* ));
*
* @param string $format sprintf format string, with any number of named arguments
* @param array $args array of [ 'arg_name' => 'arg value', ... ] replacements to be made
* @return string|false result of sprintf call, or bool false on error
*/
function sprintfn ($format, array $args = array()) {
// map of argument names to their corresponding sprintf numeric argument value
$arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);// find the next named argument. each search starts at the end of the previous replacement.
for ($pos = 0; preg_match('/(?<=%)([a-zA-Z_]\w*)(?=\$)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) {
$arg_pos = $match[0][1];
$arg_len = strlen($match[0][0]);
$arg_key = $match[1][0];// programmer did not supply a value for the named argument found in the format string
if (! array_key_exists($arg_key, $arg_nums)) {
user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING);
return false;
}// replace the named argument with the corresponding numeric one
$format = substr_replace($format, $replace = $arg_nums[$arg_key], $arg_pos, $arg_len);
$pos = $arg_pos + strlen($replace); // skip to end of replacement for next iteration
}
}/**
* version of sprintf for cases where named arguments are desired (python syntax)
*
* with sprintf: sprintf('second: %2$s ; first: %1$s', '1st', '2nd');
*
* with sprintfn: sprintfn('second: %(second)s ; first: %(first)s', array(
* 'first' => '1st',
* 'second'=> '2nd'
* ));
*
* @param string $format sprintf format string, with any number of named arguments
* @param array $args array of [ 'arg_name' => 'arg value', ... ] replacements to be made
* @return string|false result of sprintf call, or bool false on error
*/
function sprintfn ($format, array $args = array()) {
// map of argument names to their corresponding sprintf numeric argument value
$arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);// find the next named argument. each search starts at the end of the previous replacement.
for ($pos = 0; preg_match('/(?<=%)\(([a-zA-Z_]\w*)\)/', $format, $match, PREG_OFFSET_CAPTURE, $pos);) {
$arg_pos = $match[0][1];
$arg_len = strlen($match[0][0]);
$arg_key = $match[1][0];// programmer did not supply a value for the named argument found in the format string
if (! array_key_exists($arg_key, $arg_nums)) {
user_error("sprintfn(): Missing argument '${arg_key}'", E_USER_WARNING);
return false;
}// replace the named argument with the corresponding numeric one
$format = substr_replace($format, $replace = $arg_nums[$arg_key] . '$', $arg_pos, $arg_len);
$pos = $arg_pos + strlen($replace); // skip to end of replacement for next iteration
}
}?>
up
down
5
Anonymous ¶
7 years ago
sprintf("Hi %s. Your name is %s", $name, $name); to use argument numbering: sprintf("Hi %1$s. Your name is %1$s", $name); This will nuke you at **runtime**, because of `$s` thing being handled as variable. If you got no $s for substitution, notice will be thrown. The solution is to use single quotes to prevent variable substitution in string: sprintf('Hi %1$s. Your name is %1$s', $name); If you need variable substitution, then you'd need to split your string to keep it in single quotes: sprintf("Hi " . '%1$s' . ". Your {$variable} is " . '%1$s', $name);Be cafeful while trying to refactor longer strings with repeated placeholders like
up
down
10
jfgrissom at gmail dot com ¶
14 years ago
I got this from http://www.webmasterworld.com/forum88/13334.htm (credit where credit is due... =P ) Quote: ...find out the 2's complement of any number, which is -(pow(2, n) - N) where n is the number of bits and N is the number for which to find out its 2's complement. This worked magic for me... previously I was trying to use sprintf ("%b",$32BitDecimal); This -(pow(2, n) - N) Hope this helps someone fighting with two's complement in PHP.I had a nightmare trying to find the two's complement of a 32 bit number.
But it always returned 10000000000000000000000 when the $32BitDecimal value got above 2,000,000,000.
Worked remarkably well and was very accurate.
up
down
5
ian dot w dot davis at gmail dot com ¶
18 years ago
Just to elaborate on downright's point about different meanings for %f, it appears the behavior changed significantly as of 4.3.7, rather than just being different on different platforms. Previously, the width specifier gave the number of characters allowed BEFORE the decimal. Now, the width specifier gives the TOTAL number of characters. (This is in line with the semantics of printf() in other languages.) See bugs #28633 and #29286 for more details.
up
down
5
Anderson ¶
4 years ago
I'll Re-post it in comment as a memory. <?php // notice the double %%, this prints a literal '%' character /* /*The old "monkey" example which helped me a lot has sadly disappeared.
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 is 'A'
printf("%%c = '%c'\n", $c); // print the ascii character, same as chr() function
printf("%%d = '%d'\n", $n); // standard integer representation
printf("%%e = '%e'\n", $n); // scientific notation
printf("%%u = '%u'\n", $n); // unsigned integer representation of a positive integer
printf("%%u = '%u'\n", $u); // unsigned integer representation of a negative integer
printf("%%f = '%f'\n", $n); // floating point representation
printf("%%o = '%o'\n", $n); // octal representation
printf("%%s = '%s'\n", $n); // string representation
printf("%%x = '%x'\n", $n); // hexadecimal representation (lower-case)
printf("%%X = '%X'\n", $n); // hexadecimal representation (upper-case)printf("%%+d = '%+d'\n", $n); // sign specifier on a positive integer
printf("%%+d = '%+d'\n", $u); // sign specifier on a negative integer
%b = '10100111101010011010101101'
%c = 'A'
%d = '43951789'
%e = '4.395179e+7'
%u = '43951789'
%u = '18446744073665599827'
%f = '43951789.000000'
%o = '247523255'
%s = '43951789'
%x = '29ea6ad'
%X = '29EA6AD'
%+d = '+43951789'
%+d = '-43951789'
*/
$t = 'many monkeys';printf("[%s]\n", $s); // standard string output
printf("[%10s]\n", $s); // right-justification with spaces
printf("[%-10s]\n", $s); // left-justification with spaces
printf("[%010s]\n", $s); // zero-padding works on strings too
printf("[%'#10s]\n", $s); // use the custom padding character '#'
printf("[%10.10s]\n", $t); // left-justification but with a cutoff of 10 characters
[monkey]
[ monkey]
[monkey ]
[0000monkey]
[####monkey]
[many monke]
*/
up
down
9
viktor at textalk dot com ¶
15 years ago
<?php if (A more complete and working version of mb_sprintf and mb_vsprintf. It should work with any "ASCII preserving" encoding such as UTF-8 and all the ISO-8859 charsets. It handles sign, padding, alignment, width and precision. Argument swapping is not handled.
if (!function_exists('mb_sprintf')) {
function mb_sprintf($format) {
$argv = func_get_args() ;
array_shift($argv) ;
return mb_vsprintf($format, $argv) ;
}
}
if (!function_exists('mb_vsprintf')) {
/**
* Works with all encodings in format and arguments.
* Supported: Sign, padding, alignment, width and precision.
* Not supported: Argument swapping.
*/
function mb_vsprintf($format, $argv, $encoding=null) {
if (is_null($encoding))
$encoding = mb_internal_encoding();// Use UTF-8 in the format so we can use the u flag in preg_split
$format = mb_convert_encoding($format, 'UTF-8', $encoding);$newformat = ""; // build a new format in UTF-8
$newargv = array(); // unhandled args in unchanged encodingwhile ($format !== "") {// Split the format in two parts: $pre and $post by the first %-directive
// We get also the matched groups
list ($pre, $sign, $filler, $align, $size, $precision, $type, $post) =
preg_split("!\%(\+?)('.|[0 ]|)(-?)([1-9][0-9]*|)(\.[1-9][0-9]*|)([%a-zA-Z])!u",
$format, 2, PREG_SPLIT_DELIM_CAPTURE) ;$newformat .= mb_convert_encoding($pre, $encoding, 'UTF-8');
// didn't match. do nothing. this is the last iteration.
}
elseif ($type == '%') {
// an escaped %
$newformat .= '%%';
}
elseif ($type == 's') {
$arg = array_shift($argv);
$arg = mb_convert_encoding($arg, 'UTF-8', $encoding);
$padding_pre = '';
$padding_post = '';// truncate $arg
if ($precision !== '') {
$precision = intval(substr($precision,1));
if ($precision > 0 && mb_strlen($arg,$encoding) > $precision)
$arg = mb_substr($precision,0,$precision,$encoding);
}// define padding
if ($size > 0) {
$arglen = mb_strlen($arg, $encoding);
if ($arglen < $size) {
if($filler==='')
$filler = ' ';
if ($align == '-')
$padding_post = str_repeat($filler, $size - $arglen);
else
$padding_pre = str_repeat($filler, $size - $arglen);
}
}// escape % and pass it forward
$newformat .= $padding_pre . str_replace('%', '%%', $arg) . $padding_post;
}
else {
// another type, pass forward
$newformat .= "%$sign$filler$align$size$precision$type";
$newargv[] = array_shift($argv);
}
$format = strval($post);
}
// Convert new format back from UTF-8 to the original encoding
$newformat = mb_convert_encoding($newformat, $encoding, 'UTF-8');
return vsprintf($newformat, $newargv);
}
}
?>
up
down
8
dwieeb at gmail dot com ¶
13 years ago
To overcome this, I wrote a simple function that replaces all the spaces in the string returned by sprintf() with the character entity reference " " to achieve non-breaking space in strings returned by sprintf() <?php <?phpIf you use the default padding specifier (a space) and then print it to HTML, you will notice that HTML does not display the multiple spaces correctly. This is because any sequence of white-space is treated as a single space.
//Here is the function:
function sprintf_nbsp() {
$args = func_get_args();
return str_replace(' ', ' ', vsprintf(array_shift($args), array_values($args)));
}//Usage (exactly like sprintf):
$format = 'The %d monkeys are attacking the [%10s]!';
$str = sprintf_nbsp($format, 15, 'zoo');
echo $str;
?>
The above example will output:
The 15 monkeys are attacking the [ zoo]!
//The variation that prints the string instead of returning it:
function printf_nbsp() {
$args = func_get_args();
echo str_replace(' ', ' ', vsprintf(array_shift($args), array_values($args)));
}
?>
up
down
4
abiltcliffe at bigfoot.com ¶
21 years ago
To jrust at rustyparts.com, note that if you're using a double-quoted string and *don't* escape the dollar sign with a backslash, $s and $d will be interpreted as variable references. The backslash isn't part of the format specifier itself but you do need to include it when you write the format string (unless you use single quotes).
up
down
4
carmageddon at gmail dot com ¶
13 years ago
$binary = sprintf('%08b', $number ); for example: I know the leading zeros are useful to me, perhaps they are to someone else too.If you want to convert a decimal (integer) number into constant length binary number in lets say 9 bits, use this:
<?php
$bin = sprintf('%08b',511 );
echo $bin."\n";
?>
would output 111111111
And 2 would output 00000010
up
down
8
Pacogliss ¶
19 years ago
Just a reminder for beginners : example 6 'printf("[%10s]\n", $s);' only works (that is, shows out the spaces) if you put the html '<pre></pre>' tags ( head-scraping time saver ;-).
up
down
6
no dot email dot address at example dot com ¶
21 years ago
<?php #: file.php:9 Notice how an extra backslash has been added by xgettext. Once you've translated the string, you must remove all backslashes from the ID string as well as the translation, so the po file will look like this: #: file.php:9 Now run msgfmt to generate the .mo file, restart Apache to remove the gettext cache if necessary, and you're off.Using argument swapping in sprintf() with gettext: Let's say you've written the following script:
$var = sprintf(gettext("The %2\$s contains %1\$d monkeys"), 2, "cage");
?>
Now you run xgettext in order to generate a .po file. The .po file will then look like this:
#, ycp-format
msgid "The %2\\$s contains %1\\$d monkeys"
msgstr ""
#, ycp-format
msgid "The %2$s contains %1$d monkeys"
msgstr "Der er %1$d aber i %2$s"
up
down
5
Hayley Watson ¶
11 years ago
<?php $pattern If you use argument numbering, then format specifications with the same number get the same argument; this can save repeating the argument in the function call.
?>
up
down
5
splogamurugan at gmail dot com ¶
15 years ago
Expecting to output But, this will output Because, the second and Third specifiers takes 1rst and 2nd arguments. Because it is not assigned with any arguments.$format = 'There are %1$d monkeys in the %s and %s ';
printf($format, 100, 'Chennai', 'Bangalore');
"There are 100 monkeys in the Chennai and bangalore"
"There are 100 monkeys in the 100 and Chennai"
up
down
2
php at mikeboers dot com ¶
15 years ago
I'm roughly (I can see a couple cases where it comes out wierd) copying the syntax of Python's string formatting with a dictionary. The improvement over the several past attempts is that this one still respects all of the formating options, as you can see in my example. And the error handling is really crappy (just an echo). I just threw this together so do with it what you will. =] <?phpfunction sprintf_array($string, $array) while ( echo And continuing on the same theme of a key-based sprintf...
{
$keys = array_keys($array);
$keysmap = array_flip($keys);
$values = array_values($array);
{
if (!isset($keysmap[$m[1]]))
{
echo "No key $m[1]\n";
return false;
}$string = str_replace($m[0], '%' . ($keysmap[$m[1]] + 1) . '$', $string);
}array_unshift($values, $string);
var_dump($values);
return call_user_func_array('sprintf', $values);
}
Cheers!
up
down
4
krzysiek dot 333 at gmail dot com - zryty dot hekko dot pl ¶
12 years ago
<?php function Encoding and decoding IP adress to format: 1A2B3C4D (mysql column: char(8) )
function encode_ip($dotquad_ip)
{
$ip_sep = explode('.', $dotquad_ip);
return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
}
{
$hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]);
}
?>
up
down
4
john at jbwalker dot com ¶
9 years ago
I couldn't find what should be a WARNING in the documentation above, that if you have more specifiers than variables to match them sprintf returns NOTHING. This fact, IMHO, should also be noted under return values.
up
down
6
php at sharpdreams dot com ¶
20 years ago
<?phpNote that when using the argument swapping, you MUST number every argument, otherwise sprintf gets confused. This only happens if you use number arguments first, then switch to a non-numbered, and then back to a numbered one.
$sql = sprintf( "select * from %1\$s left join %2\$s on( %1\$s.id = %2\$s.midpoint ) where %1\$s.name like '%%%s%%' and %2\$s.tagname is not null", "table1", "table2", "bob" );
// Wont work:
// Sprintf will complain about not enough arguments.
$sql = sprintf( "select * from %1\$s left join %2\$s on( %1\$s.id = %2\$s.midpoint ) where %1\$s.name like '%%%3\$s%%' and %2\$s.tagname is not null", "table1", "table2", "bob" );
// Will work: note the %3\$s
?>
up
down
2
geertdd at gmail dot com ¶
13 years ago
<?phpNote that when using a sign specifier, the number zero is considered positive and a "+" sign will be prepended to it.
printf('%+d', 0); // +0
?>
up
down
1
Nathan Alan ¶
7 years ago
%[ -~] Example: sscanf($sql, "[%d,%d]%[ -~]", $sheet_id, $column, $remaining_sql);Just wanted to add that to get the remaining text from the string, you need to add the following as a variable in your scanf
up
down
2
ignat dot scheglovskiy at gmail dot com ¶
11 years ago
<?php $out Here is an example how alignment, padding and precision specifier can be used to print formatted list of items:
$books = array("Book 1", "Book 2", "Book 3");
$pages = array("123 pages ", "234 pages", "345 pages");
for ($i = 0; $i < count($books); $i++) {
$out .= sprintf("%'.-20s%'.7.4s\n", $books[$i], $pages[$i]);
}
echo $out;// Outputs:
//
// The Books
// Book 1.................123
// Book 2.................234
// Book 3.................345
?>
up
down
2
jrpozo at conclase dot net ¶
19 years ago
setlocale(LC_ALL, 'es_ES'); gives 27 instead of 27.78, so use %F instead.Be careful if you use the %f modifier to round decimal numbers as it (starting from 4.3.10) will no longer produce a float number if you set certain locales, so you can't accumulate the result. For example:
echo(sprintf("%.2f", 13.332) + sprintf("%.2f", 14.446))
up
down
1
hdimac at gmail dot com ¶
10 years ago
In the examples, is being shown printf, but it should say sprintf, which is the function being explained... just a simple edition mistake.
up
down
1
nmmm at nmmm dot nu ¶
9 years ago
here is an example: printf("%*d\n",3,5); this will print just "d" instead of "<two spaces>5"php printf and sprintf not seems to support star "*" formatting.
up
down
1
scott dot gardner at mac dot com ¶
16 years ago
printf("[%10.10s]\n", $t); // left-justification but with a cutoff of 10 characters This outputs right-justified. In order to output left-justified: printf("[%-10.10s]\n", $t);In the last example of Example#6, there is an error regarding the output.
up
down
1
John Walker ¶
14 years ago
In my case, the input (from MySQL) was a string with 15 digits of precision that was displayed with 6. Likely what happens is that the rounding occurs in the conversion to a float before it is displayed. Displaying it as 1.15f (or in my case, %s) shows the correct number.To add to other notes below about floating point problems, I noted that %f and %F will apparently output a maximum precision of 6 as a default so you have to specify 1.15f (eg) if you need more.
up
down
1
Anonymous ¶
2 years ago
<?phpIf the format string is enclosed in double-quotes (""), you need to escape the dollar sign after argnum with a backslash character (\), like this %1\$s, so that the PHP doesn't try to interpret them as variable. Using a backslash like this is called an escape sequence.
// Sample string
$number = 499;
$format = "The number without decimal points: %1\$d, and the number with two decimal points: %1\$.2f";// Formatting and print the string
printf($format, $number);
?>
up
down
1
Andrew dot Wright at spamsux dot atnf dot csiro dot au ¶
21 years ago
My method of centering fixed text in a 72 character width space is: $a = "Some string here";An error in my last example:
$b = sprintf("%30.s", $a);
will only add enough spaces before $a to pad the spaces + strlen($a) to 30 places.
$lwidth = 36; // 72/2
$b = sprintf("%".($lwidth + round(strlen($a)/2)).".s", $a);
up
down
ivan at php dot net ¶
10 years ago
In "truncate $arg" section the following line:There is a minor issue in a code of mb_vsprintf function from viktor at textalk dot com.
$arg = mb_substr($precision,0,$precision,$encoding);
needs to be replaced with:
$arg = mb_substr($arg,0,$precision,$encoding);
up
down
Astone ¶
14 years ago
Like this: <?phpfunction getGoogleTranslation($sString, $bEscapeParams = true)When you're using Google translator, you have to 'escape' the 'conversion specifications' by putting <span class="notranslate"></span> around them.
{
// "escape" sprintf paramerters
if ($bEscapeParams)
{
$sPatern = '/(?:%%|%(?:[0-9]+\$)?[+-]?(?:[ 0]|\'.)?-?[0-9]*(?:\.[0-9]+)?[bcdeufFosxX])/';
$sEscapeString = '<span class="notranslate">$0</span>';
$sString = preg_replace($sPatern, $sEscapeString, $sString);
}// Compose data array (English to Dutch)
$aData = array(
'v' => '1.0',
'q' => $sString,
'langpair' => 'en|nl',
);// Initialize connection
$rService = curl_init();// Connection settings
curl_setopt($rService, CURLOPT_URL, 'http://ajax.googleapis.com/ajax/services/language/translate');
curl_setopt($rService, CURLOPT_RETURNTRANSFER, true);
curl_setopt($rService, CURLOPT_POSTFIELDS, $aData);// Execute request
$sResponse = curl_exec($rService);// Close connection
curl_close($rService);// Extract text from JSON response
$oResponse = json_decode($sResponse);
if (isset($oResponse->responseData->translatedText))
{
$sTranslation = $oResponse->responseData->translatedText;
}
else
{
// If some error occured, use the original string
$sTranslation = $sString;
}// Replace "notranslate" tags
if ($bEscapeParams)
{
$sEscapePatern = '/<span class="notranslate">([^<]*)<\/span>/';
$sTranslation = preg_replace($sEscapePatern, '$1', $sTranslation);
}// Return result
return $sTranslation;
}?>
Thanks to MelTraX for defining the RegExp!
up
down
-1
Sam Bull ¶
8 years ago
Change the first line from:Fix for sprintfn function for named arguments (http://php.net/manual/en/function.sprintf.php#94608):
$arg_nums = array_slice(array_flip(array_keys(array(0 => 0) + $args)), 1);
to:
$arg_nums = array_keys($args);
array_unshift($arg_nums, 0);
$arg_nums = array_flip(array_slice($arg_nums, 1, NULL, true));
up
down
-3
Mirek Z... ¶
4 years ago
I run this several times and what I've noted that string concatenation took about 2.9 seconds, sprintf took 4.3 seconds. Here's the code: echo 'Start' . PHP_EOL;I've performed a simple speed test. sprintf against PHP string concatenation operator. Test was performed on PHP 7.3 for 1 million interations.
I was thinking about what is faster, what is better to do when we're going to format our string (for example, the message to the user or for log purposes) containing some variables values. Is it better to concatenate string with variables using operator (dot ".") or to use sprintf. The answer is: when you do not plan to implement any multilanguage mechanisms and feel good with hardcoding some texts, the "dot" is almost 1.5 times faster!
$vS_text = 'some text';
$vS = '';
$vf = microtime(true);
for ($vI = 0; $vI < 1000000; $vI++) {
$vS = 'Start ' . $vI . ' ' . $vS_text . ' ' . $vf . ' end';
}
$vf = microtime(true) - $vf;
echo 'Concat:' . $vf . PHP_EOL;
$vS = '';
$vf = microtime(true);
for ($vI = 0; $vI < 1000000; $vI++) {
$vS = sprintf('Start %d %s %f end', $vI, $vS_text, $vf);
}
$vf = microtime(true) - $vf;
echo 'Spritf:' . $vf . PHP_EOL;
up
down
-4
2838132019 at qq dot com ¶
2 years ago
echo sprintf("%.2f", "123456789012345.85"); echo sprintf("%.2f", "123456789012345.87"); echo sprintf("%.2f", "123456789012345.820"); echo sprintf("%.2f", "123456789012345.821"); echo sprintf("%.2f", "123456789012345.828"); echo sprintf("%.2f", "123456789012345.8209"); echo sprintf("%.2f", "1234567890123456.82"); echo sprintf("%.2f", "123456789012345.82002"); echo sprintf("%.2f", "123456789012345.820001"); echo sprintf("%.2f", "123456789012345.820101"); echo sprintf("%.2f", "123456789012345.820201"); echo sprintf("%.2f", "123456789012345.820301"); echo sprintf("%.2f", "123456789012345.820401");echo sprintf("%.2f", "123456789012345.82");
// result: 123456789012345.81
// result: 123456789012345.84
//result: 123456789012345.88
//result: 123456789012345.81
//result: 123456789012345.83
//result: 123456789012345.83
//result : 123456789012345.83
//result: 1234567890123456.75
//result: 123456789012345.81
//result: 123456789012345.81
//result: 123456789012345.81
//result: 123456789012345.81
//result: 123456789012345.81
//result: 123456789012345.83
+add a note