Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.
(PHP 4, PHP 5, PHP 7)
printf — Output a formatted string
format
Șirul de formatare este compus din zero sau mai multe directive: caractere
obișnuite (în afară de %
), care sunt copiate direct
în rezultat și specificatori de conversie, fiecare
având parametrul său.
Un specificator de conversie e compus după următorul prototip:
%[argnum$][flags][width][.precision]specifier
.
Un întreg urmat de senmul dolar $
,
pentru a specifica ce argument de număr trebuie tratat în conversie.
Flag | Descriere |
---|---|
- |
Alinierea spre stânga în limitele lungimii câmpului; Implicit se efectuează alinierea spre dreapta |
+ |
Prefixează numerele pozitive cu semnul plus
+ ; implicit doar numerele negative sunt prefixate cu
semnul minus.
|
(spațiu) |
Completează rezultatul cu spații. Acesta este comportamentul implicit. |
0 |
Completează numerele cu zerouri în stânga.
Cu specificatorii s se poate de completat cu zerouri
și în dreapta.
|
' (char) |
Completează rezultatul cu caracterul (char). |
Un număr întreg ce indică câte caractere (minimum) trebuie să aibă rezultatul conversiei.
Un punct .
, urmat de un număr întreg, însemnătatea căruia
depinde de specificator:
e
, E
,
f
și F
: acesta este numărul de cifre
ce vor fi tipărite după punctul zecimal (implicit acesta este 6).
g
și G
:
acesta este numărul maxim de cifre semnificative ce va fi tipărit.
s
: acesta funcționează ca punct
de oprire, stabilind limita maximă a numărului de caractere din șir.
Notă: Dacă punctul este specificat fără o valoare explicită pentru precizie, se presupune că aceasta este 0.
Notă: Încercarea de a folosi un specificator de poziție mai mare decât
PHP_INT_MAX
va genera avertizări.
Specifier | Descriere |
---|---|
% |
Specifică caracterul procent. Nu este necesar vre-un argument. |
b |
Argumentul este tratat ca un întreg și prezentat ca număr binar. |
c |
Argumentul este tratat ca un întreg și prezentat ca caracter cu acest cod ASCII. |
d |
Argumentul este tratat ca un întreg și prezentat ca număr zecimal (cu semn). |
e |
Argumentul este tratat ca număr în notație exponențială (de ex. 1.2e+2). Specificatorul de precizie semnifică numărul de cifre după virgulă începând cu PHP 5.2.1. În versiuni anterioare el specifica numărul de cifre semnificative (cu una mai puțin). |
E |
La fel ca și specificatorul e , dar folosește
caracterul majuscul (de ex. 1.2E+2).
|
f |
Argumentul este tratat ca număr cu virgulă și prezentat ca atare (în dependență de setările de localizare). |
F |
Argumentul este tratat ca număr cu virgulă și prezentat ca atare (fără a se ține cont de setările de localizare). Disponibil începând cu PHP 5.0.3. |
g |
Format general. Fie că P este egal cu precizia, dacă nu este zero, 6 dacă precizia este omisă, sau 1 dacă precizia este zero. Atunci dacă o conversie cu stilul E ar avea un exponent X: Dacă P > X ≥ −4, atunci conversia este de stilul f și precizia P − (X + 1). În caz contrar, conversia este de stilul e și precizia P − 1. |
G |
La fel ca și specificatorul g , dar utilizează
E și f .
|
o |
Argumentul este tratat ca întreg și prezentat ca număr octal. |
s |
Argumentul este tratat și prezentat ca șir de caractere. |
u |
Argumentul este tratat ca întreg și prezentat ca număr zecimal fără semn. |
x |
Argumentul este tratat ca întreg și prezentat ca număr hexazecimal (cu caractere minuscule). |
X |
Argumentul este tratat ca întreg și prezentat ca număr hexazecimal (cu caractere majuscule). |
Specificatorul de tip c
ignoră completarea cu spații și lungimea
Încercarea de a folosi o combinație din specificatori de șiruri de caractere și lungime cu seturi de caractere ce necesită mai mult de un octet per caracter poate da rezultate imprevizibile
Variabilele vor fi aduse la un tip potrivit pentru specificatorul:
Tipul | Specificatorii |
---|---|
string |
s |
integer |
d ,
u ,
c ,
o ,
x ,
X ,
b
|
double |
g ,
G ,
e ,
E ,
f ,
F
|
values
Returns the length of the outputted string.
Example #1 printf(): various examples
<?php
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 is 'A'
// notice the double %%, this prints a literal '%' character
printf("%%b = '%b'\n", $n); // binary representation
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
?>
Exemplul de mai sus va afișa:
%b = '10100111101010011010101101' %c = 'A' %d = '43951789' %e = '4.39518e+7' %u = '43951789' %u = '4251015507' %f = '43951789.000000' %o = '247523255' %s = '43951789' %x = '29ea6ad' %X = '29EA6AD' %+d = '+43951789' %+d = '-43951789'
Example #2 printf(): string specifiers
<?php
$s = 'monkey';
$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.9s]\n", $t); // right-justification but with a cutoff of 8 characters
printf("[%-10.9s]\n", $t); // left-justification but with a cutoff of 8 characters
?>
Exemplul de mai sus va afișa:
[monkey] [ monkey] [monkey ] [0000monkey] [####monkey] [ many monk] [many monk ]
Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.
[Editor's Note: Or just use vprintf...]
If you want to do something like <?php printf('There is a difference between %s and %s', array('good', 'evil')); ?> (this doesn't work) instead of <?php printf('There is a difference between %s and %s', 'good', 'evil'); ?> you can use this function:
<?php
function printf_array($format, $arr)
{
return call_user_func_array('printf', array_merge((array)$format, $arr));
}
?>
Use it the following way:
<?php
$goodevil = array('good', 'evil');
printf_array('There is a difference between %s and %s', $goodevil);
?>
and it will print:
There is a difference between good and evil
You can use this function to format the decimal places in a number:
$num = 2.12;
printf("%.1f",$num);
prints:
2.1
see also: number_format()
To provide a more user-friendly interface, you can use colors when printing text in the terminal.
p('Ordinary text.');
p('Warning: Check this out...', 'info');
p('Ops! Something went wrong.', 'error');
p('Yeah... done!', 'success');
function p($text, $style = '', $newLine = true) {
$styles = array(
'success' => "\033[0;32m%s\033[0m",
'error' => "\033[31;31m%s\033[0m",
'info' => "\033[33;33m%s\033[0m",
'Black' => "\033[0;30m%s\033[0m",
'Red' => "\033[0;31m%s\033[0m",
'Green' => "\033[0;32m%s\033[0m",
'Yellow' => "\033[0;33m%s\033[0m",
'Blue' => "\033[0;34m%s\033[0m",
'Purple' => "\033[0;35m%s\033[0m",
'Cyan' => "\033[0;36m%s\033[0m",
'Gray' => "\033[0;37m%s\033[0m",
'Graphite' => "\033[1;30m%s\033[0m",
'Bold Red' => "\033[1;31m%s\033[0m",
'Bold Green' => "\033[1;32m%s\033[0m",
'Bold Yellow' => "\033[1;33m%s\033[0m",
'Bold Blue' => "\033[1;34m%s\033[0m",
'Bold Purple' => "\033[1;35m%s\033[0m",
'Bold Cyan' => "\033[1;36m%s\033[0m",
'Bold White' => "\033[1;37m%s\033[0m",
'Bg Black' => "\033[40;1;37m%s\033[0m",
'Bg Red' => "\033[41;1;37m%s\033[0m",
'Bg Green' => "\033[42;1;37m%s\033[0m",
'Bg Yellow' => "\033[43;1;37m%s\033[0m",
'Bg Blue' => "\033[44;1;37m%s\033[0m",
'Bg Purple' => "\033[45;1;37m%s\033[0m",
'Bg Cyan' => "\033[46;1;37m%s\033[0m",
'Bg Gray' => "\033[47;1;37m%s\033[0m",
'Underscore' => "\033[4;37m%s\033[0m",
'Inverted' => "\033[7;37m%s\033[0m",
'Blink' => "\033[5;37m%s\033[0m",
);
$format = '%s';
if (isset($styles[$style])) {
$format = $styles[$style];
}
if ($newLine) {
$format .= PHP_EOL;
}
printf($format, $text);
}
instead of writing a function to round off a float (let's call it 'x') accurately, it's much easier to add a small number to x and then truncate it...
For example: if you want to round off to the nearest integer, just add 0.5 to x and then truncate it. if x=12.6, then it would calculate 13.1, and truncate it to 13. If x=14.4, it would calculate 14.9 and truncate it to 14.
Be careful when relying on typecasting with printf(). For example,
printf("%d", "17,999")
returns "17".
Be sure that the output channel is available to write on before executing printf()! Some functions in classes available from various sources (in my case, DB_Sql::query() in PHPLIB) assume that printing will work, even after the default output stream has been closed.
For me the issue was most notable in PHP4 session management when I was creating my own sess_write() handler. Since I was unable to find any function that checks for the output stream that printf() uses, I just had to drop the crazy use of the printf(). (does some function already exist to check for the presence of an output stream?)
To format a dollar value as in $123.00 that may otherwise look like $123 use this
print ('$'); // the dollar sign in front of our answer
printf ('%.2f',$price);
If anyone is looking for writing a quine using printf(),
this is my example:
<?php $f='<?php $f=%c%s%c; printf($f,39,$f,39); ?>'; printf($f,39,$f,39); ?>
This also helps those who are new to printf() see one way of using the 'mixed args' part, rather than just a single argument as in most examples I've seen.
be careful with integers, they cant hold large values.
printf("%d",10023123553.45634663);
will print out: 1433188961
and
printf("%.0f",10023123553.45634663);
will print out: 10023123553
If your missing features such as "-"*100 to print a single character multiple times you can use the slightly longer and less readable PHP equivalent printf("%'-100s",""); and sprint("%'-100s","").
copypasted from msdn
A format specification, which consists of optional and required fields, has the following form:
%[flags] [width] [.precision] [{h | l | I64 | L}]type
Each field of the format specification is a single character or a number signifying a particular format option. The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign is followed by a character that has no meaning as a format field, the character is copied to stdout. For example, to print a percent-sign character, use %%.
The optional fields, which appear before the type character, control other aspects of the formatting, as follows:
type
Required character that determines whether the associated argument is interpreted as a character, a string, or a number (see the printf Type Field Characters table.
flags
Optional character or characters that control justification of output and printing of signs, blanks, decimal points, and octal and hexadecimal prefixes (see the Flag Characters table). More than one flag can appear in a format specification.
width
Optional number that specifies the minimum number of characters output (see printf Width Specification).
precision
Optional number that specifies the maximum number of characters printed for all or part of the output field, or the minimum number of digits printed for integer values (see the How Precision Values Affect Type table).
h | l | I64 | L
Optional prefixes to type-that specify the size of argument (see the Size Prefixes for printf and wprintf Format-Type Specifiers table).
Why rounding is not same as for round()?
Try this code:
<?php
printf("%.02lf\n", 1.035);
printf("%.02lf\n", round(1.035, 2));
?>
Result:
1.03
1.04
In my opion it should be:
1.04
1.04
Why is that?
I don't know if this is useful to anyone, but here goes! Example for using the printf function to output an object.
class person
{
var $name = "";
function name($newname = NULL)
{
if(! is_null($newname))
{
$this->name=$newname;
}
return $this->name;
}
var $surname = "";
function surname($newsurname = NULL)
{
if(! is_null($newsurname))
{
$this->surname=$newsurname;
}
return $this->surname;
}
var $age = "";
function age($newage = NULL)
{
if(! is_null($newage))
{
$this->age=$newage;
}
return $this->age;
}
}
$bob = new person;
$bob->name('Bob');
$bob->surname('Builder');
$bob->age('50');
printf("Hi %s, your surname is %s and you are %s years old", $bob->name, $bob->surname, $bob->age);
Outputs:
Hi Bob, your surname is Builder and you are 50 years old
Several people have commented about problems with aligning numbers. I just wanted to add a bit of clarification.
According to the spec all True Type Fonts (especially porpotional spaced fonts) use a fixed width for numeric digits. All digits have the same width which is equal to the width of "0".
Where things go haywire when trying to align numbers is that the space character does not have the same width as a digit when using a porportional spaced font.
Therefore if you want to line up a column of numbers, you can not use leading spaces to position them unless you use the same quantity of space characters for each row. e.g. your numbers have leading zeros etc.
The simplest solution is to switch to a monospaced font. Alternativly you can use positioning tags.
Summary: Your numbers will always line up properly regardless of the font used, if you get the starting position to be consistant.
//If you want to make many Hidden fields you can use the function
//You can pass the values as array value,This will help you, when you are going to post many hiddend fields:-
function MakeHidden($ArrValues)
{
global $dearvar;
echo $dearvar;
if(is_array($ArrValues)){
foreach($ArrValues as $key=>$values)
{
echo $MakeHTML = "<input type='hidden' name='$values' value='$values'>";
}
}
else {
echo $MakeHTML = "<input type='hidden' name='$ArrValues' value='$ArrValues'>";
}
return $MakeHTML;
}
//example:-
MakeHidden(array("value1","value2","value3"));
//OutPut :-
<input type="hidden" value="value1" name="value1"/>
<input type="hidden" value="value2" name="value2"/>
<input type="hidden" value="value3" name="value3"/>
In response to chris dot breen at accurate dot com :
This will work, but i didn't try:
<?php
$format = 'The %2$s contains %1$d monkeys.
That is a nice %2$s full of %1$d monkeys.';
printf($format, $num, $location);
?>
Your problem came from the fact that in the string "\$s", the $ is simply escaped by the \, but but you must not do that with single quoted strings. Try to echo your strings to test it, or just go to http://www.php.net/manual/en/language.types.string.php