Formatage des nombres (décimales, séparateurs de milliers, etc.) avec CSS


121

Est-il possible de formater des nombres avec CSS? C'est-à-dire: décimales, séparateur décimal, séparateur de milliers, etc.


61
Vous ne pouvez pas mais vous devriez vraiment pouvoir le faire. Après tout, 50 000 ou 50000 ou 50 000,00 sont toutes les mêmes «données», elles sont simplement présentées différemment, c'est à cela que sert le CSS.
punkrockbuddyholly

4
@MrMisterMan: Il y a quelques idées qui sont lancées ici: wiki.csswg.org/ideas/content-formatting#numbers Je vais probablement être harcelé et accusé d'avoir cité des "spécifications" et d'avoir suscité l'espoir de tout le monde. Et pour moi, je suis curieux de savoir comment le texte non numérique serait traité ici.
BoltClock

3
Bien que je sois d'accord que ce serait bien d'avoir, le numéro est intégré à l'intérieur d'une page autrement localisée. C'est-à-dire que le reste de la page est en anglais, en chinois ou dans toute autre langue, et les chiffres doivent être conformes à cette localisation. Pourquoi devraient-ils être localisés séparément du reste de la page ...?
deceze

@deceze: Vous avez raison. Il devrait être possible d'avoir des "CSS de localisation"
Don

1
ajout de l'option JS en utilisant Intl.NumberFormat mdn-ref:
Joshua Baboo

Réponses:




23

Eh bien, pour tous les nombres en Javascript, j'utilise le suivant:

var a = "1222333444555666777888999";
a = a.replace(new RegExp("^(\\d{" + (a.length%3?a.length%3:0) + "})(\\d{3})", "g"), "$1 $2").replace(/(\d{3})+?/gi, "$1 ").trim();

et si vous devez utiliser un autre séparateur comme virgule, par exemple:

var sep = ",";
a = a.replace(/\s/g, sep);

ou en fonction:

function numberFormat(_number, _sep) {
    _number = typeof _number != "undefined" && _number > 0 ? _number : "";
    _number = _number.replace(new RegExp("^(\\d{" + (_number.length%3? _number.length%3:0) + "})(\\d{3})", "g"), "$1 $2").replace(/(\d{3})+?/gi, "$1 ").trim();
    if(typeof _sep != "undefined" && _sep != " ") {
        _number = _number.replace(/\s/g, _sep);
    }
    return _number;
}

1
Merci. Pas une pure solution CSS, mais fait la tâche!
Don

Je l'aime. Mais j'avais également besoin de convertir le nombre en une chaîne avant le remplacement. Vous ne pouvez pas remplacer un numéro.
Mardok

avant d'appeler, _number.replacenous devons nous assurer qu'il s'agit d'une chaîne comme celle _number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";-ci, sinon vous obtiendrez une erreur _number.replacen'est pas définie ou pas une fonction
Shalkam

3
pourquoi ne pas simplement utiliser: (123456789) .toLocaleString ('en-GB') ou similaire?
Joehannes

16

La meilleure façon de le faire est probablement de définir une étendue avec une classe indiquant votre mise en forme, puis d'utiliser Jquery .each pour faire la mise en forme sur les étendues lorsque le DOM est chargé ...


9

Non, vous devez utiliser javascript une fois qu'il est dans le DOM ou le formater via votre langage côté serveur (PHP / ruby ​​/ python etc.)


5
Le format des nombres est une question de contenu, comme le texte du contenu ou d'autres problèmes de notation (par exemple, les notations de date, qui dépendent de la langue). Le formatage des nombres est donc une localisation et doit être géré lors de la génération du contenu. Le faire en JavaScript est logique pour la partie du contenu qui est générée par JavaScript.
Jukka K. Korpela

Je suis complètement d'accord avec ça. C'est pourquoi je l'ai écrit dans ma réponse. J'aurais probablement dû y mettre plus de stress.
mreq

Il peut s'agir de contenu ou de présentation. Prenez CSS rtl, qui montre le même contenu d'une manière différente: doit-il également être traité côté serveur?
Don

6

Pas une réponse, mais peut-être intéressant. J'ai envoyé une proposition au CSS WG il y a quelques années. Cependant, rien ne s'est passé. Si en effet ils (et les fournisseurs de navigateurs) voyaient cela comme une véritable préoccupation des développeurs, peut-être que la balle pourrait commencer à tourner?


2
Merci pour votre contribution. J'espère qu'un jour ça va se faire.
ADJenks

4

Si ça aide ...

J'utilise la fonction PHP number_format()et le Narrow No-break Space (  ). Il est souvent utilisé comme séparateur de milliers sans ambiguïté.

echo number_format(200000, 0, "", " ");

Parce que IE8 a quelques problèmes pour rendre l'espace sans coupure étroit, je l'ai changé pour un SPAN

echo "<span class='number'>".number_format(200000, 0, "", "<span></span>")."</span>";
.number SPAN{
    padding: 0 1px; 
}

Malheureusement, c'est côté serveur, il y a un léger coup de CPU, nous avons besoin d'une capacité de masque d'édition html / css. L'habillage et le rendu devraient être côté client à moins que nous ne servions un pdf?
mckenzm

2

Vous ne pouvez pas utiliser CSS à cette fin. Je recommande d'utiliser JavaScript si cela est applicable. Jetez un œil à ceci pour plus d'informations: JavaScript équivalent à printf / string.format

De plus, comme Petr l'a mentionné, vous pouvez le gérer côté serveur, mais cela dépend totalement de votre scénario.


2

Je ne pense pas que vous puissiez. Vous pouvez utiliser number_format () si vous codez en PHP. Et d'autres langages de programmation ont également une fonction de formatage des nombres.


MAUVAISE pratique de modifier les données à des fins d'affichage dans le "backend".
Buffalo

1

Vous pouvez utiliser la bibliothèque de balises Jstl pour le formatage des pages JSP

JSP Page
//import the jstl lib
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>

<c:set var="balance" value="120000.2309" />
<p>Formatted Number (1): <fmt:formatNumber value="${balance}" 
        type="currency"/></p>
<p>Formatted Number (2): <fmt:formatNumber type="number" 
        maxIntegerDigits="3" value="${balance}" /></p>
<p>Formatted Number (3): <fmt:formatNumber type="number" 
        maxFractionDigits="3" value="${balance}" /></p>
<p>Formatted Number (4): <fmt:formatNumber type="number" 
        groupingUsed="false" value="${balance}" /></p>
<p>Formatted Number (5): <fmt:formatNumber type="percent" 
        maxIntegerDigits="3" value="${balance}" /></p>
<p>Formatted Number (6): <fmt:formatNumber type="percent" 
        minFractionDigits="10" value="${balance}" /></p>
<p>Formatted Number (7): <fmt:formatNumber type="percent" 
        maxIntegerDigits="3" value="${balance}" /></p>
<p>Formatted Number (8): <fmt:formatNumber type="number" 
        pattern="###.###E0" value="${balance}" /></p>

Résultat

Numéro formaté (1): 120 000,23 £

Numéro formaté (2): 000.231

Numéro formaté (3): 120,000.231

Numéro formaté (4): 120000.231

Numéro formaté (5): 023%

Numéro formaté (6): 12,000,023.0900000000%

Numéro formaté (7): 023%

Numéro formaté (8): 120E3

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.