[2.1-dev] Zarovnávání čísel

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Mysteria
Člen | 797
+
0
-

Zdravím, do jedné aplikace řeším zarovnávání čísel (různě dlouhá, můžou i nemusí mít desetinná čísla).
Výsledek musí být takový aby byly pod sebou řády.

125 265
 25 658.25
     58.60

Vytvořil jsem si na to helper:

public static function fixedNumber($number, $numCount = 0, $decCount = 0) {
    	if ($decCount !== 0) $numCount += $decCount + 1;
    	echo str_replace(' ', ' ', Strings::padLeft(number_format($number, $decCount, '.', ' '), $numCount, ' '));
    }

Tohle je funkční, ale…
Za prvé, protože mezera nejde použít pro vyplnění znaků před číslem, tak používám nějakou ‚číselnou mezeru‘ (je stejně široká jako číslo, tzn. entita:

 

Pokud ale dám rovnou tuhle entitu do Strings::padLeft, tak to dopadne špatně, například takto:

33.87% (+&0.02%) HTML: 33.87% (+&0.02%)

Pokud tam ale dám normální mezeru a nahradím ji entitou, tak je to v pohodě (z toho mi vychází, že ‚problém‘ je v padLeft funkci, nebere entitu jako jeden znak, ale jako posloupnost několika znaků):

33.87% (+ 0.02%) HTML: 33.87% (+ 0.02%)

Tady mi jde čistě jenom o to, jestli by to nešlo udělat nějak, abych nemusel používat ten replace…

Druhá věc: Aby se mi správně vypsala ta entita, tak buď musím vypisovat přímo v helperu místo returnu nebo pak u všech proměnných, kde používám tenhle helper vypnout escapování, protože pokud to neudělám, tak se mi místo

 
 

Co se týká samotných dat, tak ty jsou bezpečná, takže ve vypnutí escapování bych neviděl takovej problém, spíš bych se chtěl ujistit jestli je to správná cesta nebo jestli to jde udělat nějak jinak.

Dík za názory.

David Matějka
Moderator | 6445
+
0
-
  1. asi budes muset pouzivat ten replace
  2. vracej:
return \Nette\Utils\Html::el()->setHtml($data);

pak neni potreba escapovat v sablone

voda
Člen | 561
+
0
-

Zkus místo html entity použít hexadecimální zápis: "\xe2\x80\x87".

Mysteria
Člen | 797
+
0
-
return \Nette\Utils\Html::el()->setHtml(Strings::padLeft(number_format($number, $decCount, '.', ' '), $numCount, "\xe2\x80\x87"));

Díky Vám oběma, funguje perfektně a já jsem zase o něco chytřejší.

h4kuna
Backer | 740
+
0
-

Tady je k dispozici třída kterou si zaregistruj jako helper (metodu render) a ta to umí.