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.

Don
la source
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:

26

Le groupe de travail CSS a publié un brouillon sur la mise en forme du contenu en 2008. Mais rien de nouveau pour le moment.

Yoann
la source
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;
}
Anton Y. Reuchenko
la source
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é ...

Ross
la source
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.)

mreq
la source
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?

itpastorn
la source
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; 
}
DanielBlazquez
la source
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.

Qorbani
la source
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.

Florin Frătică
la source
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

Mohammad Javed
la source