Skip to content

Définir un format pour les nombres — N°11/XXX

24/03/2010

Souvenez-vous ! Dans le billet 7, je produisais une série de pourcentages : la proportion des inscrits sur l’ensemble de la population de chaque ville.

Et j’énonçais 3 problèmes à résoudre successivement :

  • le tri
  • la définition de groupes
  • les décimales interminables

Le problème des décimales

Chaque division me donnait des nombres avec une dizaine de décimales

ce qui ne facilite pas la lecture de ces résultats.

Le pourcentage de 2005 est obtenu, pour chaque ville, par l’opération :

<xsl:value-of select="(an2005/inscrits div an2005/population)*100"/>

Et pour 2008 :

<xsl:value-of select="(an2008/inscrits div an2008/population)*100"/>

La solution : format-number()

Il est possible d’utiliser une fonction XSL, à laquelle on indique :

  • le nombre à traiter
  • le format de données. Si on veut des nombres à deux décimales, on indiquera : 0,00.

Voilà ce que ça donne : on intègre la division dans la fonction :

<xsl:value-of select="format-number((an2005/inscrits div an2005/population)*100, '#.##')"/>

On voit donc ce qui était déjà plus ou moins pressenti précédemment : une fonction XSL est placée dans un attribut (ici : select=""). Ses différents paramètres sont entre parenthèses, quand il y en a plusieurs ils sont séparés par une virgule.

  • La fonction not() n’a qu’un seul paramètre : la valeur à inverser
  • La fonction position() n’a aucun paramètre : elle renvoie le rang du nœud en cours
  • La fonction format-number() a deux paramètres : le premier est le nombre à formater, le second est le format attendu.
    • Si j’écris : <xsl:value-of select="format-number(1 div 3, '#.##')"/>, le résultat affiché sera : 0,33.
    • Si j’écris <xsl:value-of select= »format-number(inscrits/population, ‘#.##‘) »/>
    • Le # sert de joker, à remplacer par 1 chiffre
    • On n’a pas le choix : la décimale est un point (!). Pour indiquer combien de chiffres viennent après la virgule (donc le point), il est impossible d’utiliser une virgule. Donc, forcément, les résultats contiendront des points (méthode anglo-saxonne) au lieu de virgules
    • La virgule permet d’indiquer une séparation dans les milliers : si pour des questions de lisibilité dans les gros chiffres, on veut séparer les milliers des millions, les Français mettent des espaces — et les Américains des virgules.
      • Pour afficher proprement 10000000, il faudra indiquer : #,###,###
      • et on obtiendra : 1,000,000.
    • notez que le format attendu est entre guillemets simples : si je mettais des guillemets doubles, le processeur XSL ne saurait plus ou s’arrête la valeur de l’attribut select="".
    • Pour indiquer que je veux deux décimales après la virgule, j’ai le choix entre : #.## et #.00.
      • Dans le premier cas (#.##)
        • 1,33333 deviendra 1.33
        • 1,1 deviendra 1.1
      • Dans le deuxième cas (#.00)
        • 1,33333 deviendra 1.33
        • 1,1 deviendra 1.10

Voici le fichier XML contenant ces données

Voici le fichier XSL qui génère un tableau à 4 colonnes :

  • le rang
  • le nom de la ville
  • le pourcentage d’inscrits en 2005 (avec deux décimales)
  • le pourcentage d’inscrits en 2008 (avec deux décimales)

L’ensemble est trié sur le pourcentage d’inscrits en 2008 (c’est le fichier du billet 9, formaté)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Stats DLL : Pourcentage d'inscrits dans la population</title>
</head>
<body>
<h3>Pourcentage d'inscrits en bibliothèque publique pour chaque ville, en 2005 et 2008</h3>
<table border="1">
<tbody>
<tr><th>Rang</th><th>Ville</th><th>% en 2005</th><th>% en 2008</th></tr>
<xsl:for-each select="dll/ville[an2008/inscrits &gt; 0]">
<xsl:sort select="an2008/inscrits div an2008/population" order="descending"/>
<tr>
<td><xsl:value-of select="position()"/></td>
<td><xsl:value-of select="@nom"/></td>
<td><xsl:value-of select="format-number((an2005/inscrits div an2005/population)*100, '#.00')"/></td>
<td><xsl:value-of select="format-number((an2008/inscrits div an2008/population)*100, '#.00')"/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Et la combinaison du fichier XML ci-dessus avec la feuille XSL donne cette page HTML.

Exercice simple

Reprenez le fichier XSL ci-dessus, pour faire en sorte que le rang dans la première colonne soit indiqué sur 4 chiffres, de 0001 à 2230.

Publicités
%d blogueurs aiment cette page :