PHP – matematický formát čísla

Aktualizováno: 20. 5. 2020, datum vydání: 30. 7. 2013

Potřebovala jsem funkci, která mi vrátí číslo v matematickém formátu vhodném například pro zápis do matematických vzorců ve formátu HTML.

Vytvořila jsem si pro tento účel funkci, která přidá oddělovače tisíců, desetinnou tečku čísla float nahradí desetinnou čárkou a dále ponechá příslušná desetinná místa aniž by stanovila či měnila jejich počet.

Pro tento účel mi nestačila PHP funkce number_format, protože vyžaduje určitý počet desetinných míst, pokud mají být vyplněny další parametry. Navíc i kdych ve funkci number_format použila určitý pevný počet míst a přebytečné nuly zprava „vyhodila“, tak bych mohla mít například problém s malými čísly, které by mohly díky této úpravě vyjít 0. A kdyby to bylo ve jmenovateli, tak 0 ve jmenovateli být nesmí a byl by to problém.

Matematický formát čísla do vzorců v HTML

function mathFormat($number) {	
	if (is_numeric($number)) {
		if (strpos($number, '.') !== FALSE) {
			list($celaCast, $desetinnaCast) = explode('.', $number);
			$celaCast = number_format($celaCast, 0, ',', ' ');
			$number = $celaCast.','.$desetinnaCast;
		} else {
			$number = number_format($number, 0, ',', ' ');
		}
		$number = str_replace(' ', ' ', $number);
		$number = '<span style="white-space: nowrap;">'.$number.'</span>';
		return $number;			
	} else {
		return FALSE;
	}			
}

Příklad použití

$a = 1234567.234567; 
$b = 1.2e3; 
$c = 1.7E+10;
$d = 7E-10;
$e = 3.14;
$f = -3.14;
$g = 0;
$h = 4556;
$i = 10/3;

// výtisk čísla v HTML má podobu: 1234567.234567 matematicky format: <span style="white-space: nowrap;">1&thinsp;234&thinsp;567,234567</span>

echo $a.' matematicky format: '.mathFormat($a).'
'; // 1234567.234567 matematicky format: 1 234 567,234567 echo $b.' matematicky format: '.mathFormat($b).'
'; // 1200 matematicky format: 1 200 echo $c.' matematicky format: '.mathFormat($c).'
'; // 17000000000 matematicky format: 17 000 000 000 echo $d.' matematicky format: '.mathFormat($d).'
'; // 7.0E-10 matematicky format: 7,0E-10 echo $e.' matematicky format: '.mathFormat($e).'
'; // 3.14 matematicky format: 3,14 echo $f.' matematicky format: '.mathFormat($f).'
'; // -3.14 matematicky format: -3,14 echo $g.' matematicky format: '.mathFormat($g).'
'; // 0 matematicky format: 0 echo $h.' matematicky format: '.mathFormat($h).'
'; // 4556 matematicky format: 4 556 echo $i.' matematicky format: '.mathFormat($i).'
'; // 3.3333333333333 matematicky format: 3,3333333333333

Zúžená mezera

Funkce vkládá matematické mezery &thinsp; místo častěji používané tvrdé mezery &nbsp;.

&thinsp; je zúžená mezera, která by se měla správně používat pro oddělovače tisíců. Dříve nebyla správně podporována v prohlížečích. Nyní je již její podpora větší. Vzhledem k tomu, že tato mezera je ale zalomitelná, tak jsem výsledný vrácený text obalila tagem <span style="white-space: nowrap">, který zabrání zalomení čísla.

Funkce očekává celé číslo či číslo float. Funguje však i na float zadané v plovoucí desetinné čárce pomocí exponentu E či e. I když koukám, že číslo v tomto formátu by se správně mělo zobrazovat jinak a ještě by měly být udělány i oddělovače za desetinnou čárkou. Možná časem ještě funkci doupravím…

Další zdroje

Další články