PHP – 49. díl – formátování čísel a řetězců

V dnešním pokračování našeho seriálu o programování v jazyku PHP se podíváme na možnosti formátování čísel a řetězců v PHP.

Úvod

Ve všech minulých dílech jsme k výpisu textu, nebo čísel používali příkaz echo. Příkaz echo je vrcholně užitečný, ale selhává v případě, kdy máme detailnější požadavky na formátování výstupu, například chceme vypsat cenu zboží s přesností na dvě desetinná místa. V takovém případě se pak musíme obrátit na další funkce, které dokáží výstup lépe formátovat a jsou schopné vypisovat požadovaný výstup.

Funkce printf

Funkce printf je základní funkcí, která dokáže vytisknout formátovaný výstup, tedy výstup podle našeho požadavku. Funkce může mít libovolné množství parametrů, přičemž první parametr je tzv. formátovací řetězec. Formátovací řetězec určuje, v jakém tvaru se přesně vypíší následující parametry.

Abychom však s funkcí printf jenom neteoretizovali, ukážeme si praktický příklad:

<html>
<head>
<title>Příklad 1. z 49. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$cena = 123.1;
printf(`Cena je %01.2f Kč.`, $cena);
?>
</p>
</body>
</html>

Ve výše uvedeném příkladě je funkce printf použita ke korektnímu vypsání ceny. Funkce printf vypisuje všechno ve formátovacím řetězci beze změny na výstup, pokud ovšem nenarazí na znak %. Znak % značí začátek formátovací specifikace, ve které jsou uloženy informace o tom, jak má být vypsán další parametr. V našem příkladě je formátovací specifikace %01.2f, kterou můžeme přeložit asi takto:

  • protože celá formátovací specifikace končí znakem f, znamená to, že se vypíše číslo jako reálné číslo s desetinnou tečkou
  • za desetinnou tečkou je číslo 2, což znamená, že číslo bude vypsáno na dvě desetinná místa
  • před desetinnou tečkou je číslo 1, což znamená, že výstupem bude nejméně jeden znak
  • mezi znakem % a desetinnou tečkou je znak 0, což znamená, že číslo se bude doplňovat nulami, pokud by bylo moc krátké.

V našem příkladě se pak funkce printf podívá na další parametr, tedy zde je to proměnná $cena a zformátuje jej podle formátovací specifikace.

Zde je jiný příklad na printf, který vypisuje datum:

<html>
<head>
<title>Příklad 2. z 49. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$den = 12;
$mesic = 1;
$rok = 2005;
printf(`Datum je %02d-%02d-%04d.`, $den, $mesic, $rok);
?>
</p>
</body>
</html>

V tomto příkladě máme hned tři formátovací specifikace v jednom řetězci. Den a měsíc se vypisuje podle formátovací specifikace %02d, rok se vypisuje podle formátovací specifikace %04d. Tyto formátovací specifikace můžu vysvětlit takto:

  • protože formátovací specifikace končí na d, znamená to, že číslo se bude vypisovat jako celé číslo v desítkovém tvaru
  • číslo 2, případně 4 před znakem d znamená minimální počet znaků, které se musí vypsat
  • znak 0 ve formátovací specifikaci znamená, že znak 0 se použije pro doplnění na správnou minimální délku výstupu.

Složení formátovací specifikace

Každá formátovací specifikace se skládá z několika částí, z nichž některé jsou volitelné, a některé jsou povinné:

  • každá formátovací specifikace začíná znakem %
  • následuje volitelně znak, který se použije na zarovnání na správnou délku řetězce. Bývá to nejčastěji znak mezera, nebo znak 0. Pokud se tato část formátovací specifikace nepoužije, na zarovnání se použije znak 0.
  • následuje volitelně znak mínus -, pokud si přejeme zarovnat výsledek doleva. Pokud si přejeme zarovnat výsledek doleva, nedáváme nic.
  • volitelné číslo, které udává, kolik znaků má minimálně výsledek převodu obsahovat
  • následuje volitelně desetinná tečka a číslo, které udává kolik míst za desetinnou tečkou se má vypsat. Tato část se používá pouze u proměnných typu double.
  • poslední, ale povinná část, která určuje, v jakém formátu se má číslo, nebo řetězec vypsat. Určuje se to podle znaku, který se objeví na konci formátovací specifikace:
 Znak   Typ  Formát
 %  žádný  Znak %
 b  celé číslo  Binární číslo
 c  celé číslo  Znak s touto ASCII hodnotou
 d  celé číslo  Desítkové číslo
 f  reálné číslo   Číslo s desetinnou tečkou
 o  celé číslo  Osmičkové číslo
 s  řetězec  Řetězec
 x  celé číslo  Šestnáctkové číslo (malá písmena)
 X  celé číslo  Šestnáctkové číslo (velká písmena) 

Funkce sprintf

V PHP existuje funkce sprintf, která pracuje podobně jako printf. Jediným rozdílem je, že nevypisuje znaky na výstup, ale pouze vrátí řetězec s naformátovanými znaky:

<html>
<head>
<title>Příklad 3. z 49. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$f = sprintf(`%s je dobrý jazyk.`, `PHP`);
echo $f;
?>
</p>
</body>
</html>

Funkce number_format

Pro speciální případy se hodí funkce number_format určená zejména na formátování reálných čísel, ale lze ji použít i na celá čísla. Chová se podobně jako sprintf, tedy výsledek formátování nepíše na výstup, ale je k dispozici jako řetězec vrácený funkcí number_format.

Funkce number_format se volá takto:

number_format (číslo, počet_desetinných_míst, desetinná_tečka, oddělovač_tisíců)

Funkce number_format má tedy 4 parametry. Prvním parametrem je číslo, které se naformátuje, druhým parametrem je počet desetinných míst. Třetím parametrem je řetězec, který je použije jako desetinná tečka, a posledním čtvrtým parametrem je řetězec, který se použije jako oddělovač tisíců.

Zde je malý příklad na funkci number_format:

<html>
<head>
<title>Příklad 4. z 49. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
$cislo = 1234.56;
echo `Český formát: `, number_format($cislo,2,`,`,` `), `<br>`;
echo `Anglický formát: `,number_format($cislo,2,`.`,`,`), `<br>`;
?>
</p>
</body>
</html>

Diskuze (3) Další článek: Jak se chovat na internetu podle McAfee

Témata článku: , , , , , , , , , , , , , , , ,