Formattazione di numeri (posizioni decimali, migliaia di separatori, ecc.) Con CSS


121

È possibile formattare i numeri con CSS? Ovvero: posizioni decimali, separatore decimale, separatore delle migliaia, ecc.


61
Non puoi ma dovresti davvero essere in grado di farlo. Dopotutto, 50.000 o 50000 o 50.000,00 sono tutti gli stessi "dati", vengono semplicemente presentati in modo diverso, a questo servono i CSS.
punkrockbuddyholly

4
@MrMisterMan: Ci sono alcune idee che vengono lanciate qui: wiki.csswg.org/ideas/content-formatting#numbers Probabilmente sarò molestato e accusato di aver citato "specifiche" e di aver fatto sperare tutti. E per me, sono curioso di sapere come verrebbe gestito il testo non numerico qui.
BoltClock

3
Anche se sono d'accordo sul fatto che sarebbe bello avere, il numero è incorporato in una pagina altrimenti localizzata. Cioè, il resto della pagina è inglese, cinese o qualunque altra lingua, e i numeri dovrebbero essere conformi a quella localizzazione. Perché dovrebbero essere localizzati separatamente dal resto della pagina ...?
inganno

@deceze: hai ragione. Dovrebbe essere possibile avere "CSS di localizzazione"
Don

1
aggiunta dell'opzione JS utilizzando Intl.NumberFormat mdn-ref:
Joshua Baboo

Risposte:




23

Bene, per qualsiasi numero in Javascript utilizzo il prossimo:

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();

e se è necessario utilizzare qualsiasi altro separatore come virgola, ad esempio:

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

o come funzione:

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
Grazie. Non è una pura soluzione CSS, ma fa il compito!
Don

Mi piace. Ma dovevo anche convertire il numero in una stringa prima della sostituzione. Non puoi sostituire un numero.
Mardok

prima di chiamare _number.replacedobbiamo assicurarci che sia una stringa come questa _number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";altrimenti riceverai un errore _number.replacenon definito o non una funzione
Shalkam

3
perché non usare semplicemente: (123456789) .toLocaleString ('en-GB') o simili?
Joehannes

16

Probabilmente il modo migliore per farlo è combinare l'impostazione di un intervallo con una classe che denota la formattazione, quindi utilizzare Jquery .each per eseguire la formattazione sugli intervalli quando viene caricato il DOM ...


9

No, devi usare javascript una volta che è nel DOM o formattarlo tramite il tuo linguaggio lato server (PHP / ruby ​​/ python ecc.)


5
Il formato dei numeri è una questione di contenuto, come il testo del contenuto o altre questioni notazionali (ad esempio, le annotazioni della data, che dipendono dalla lingua). Quindi la formattazione dei numeri è una localizzazione e dovrebbe essere gestita quando viene generato il contenuto. Farlo in JavaScript ha senso per la parte di contenuto generata da JavaScript.
Jukka K. Korpela

Sono pienamente d'accordo con quello. Ecco perché l'ho scritto nella mia risposta. Probabilmente avrei dovuto mettere più stress su di esso.
mreq

Può essere contenuto o presentazione. Prendi CSS rtl, che mostra lo stesso contenuto in un modo diverso: dovrebbe essere trattato anche lato server?
Don

6

Non una risposta, ma forse di interesse. Ho inviato una proposta al CSS WG alcuni anni fa. Tuttavia, non è successo niente. Se davvero loro (e i fornitori di browser) vedessero questo come una vera preoccupazione per gli sviluppatori, forse la palla potrebbe iniziare a rotolare?


2
Grazie per aver contribuito. Spero che un giorno prenda piede.
ADJenks

4

Se aiuta ...

Uso la funzione PHP number_format()e Narrow No-break Space (  ). Viene spesso utilizzato come separatore di migliaia non ambiguo.

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

Poiché IE8 ha alcuni problemi nel rendere lo spazio ristretto no-break, l'ho cambiato per uno SPAN

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

Sfortunatamente questo è lato server, c'è un leggero colpo alla CPU, abbiamo bisogno di una capacità di modifica della maschera html / css. L'abbigliamento e il rendering dovrebbero essere lato client a meno che non stiamo servendo un pdf?
mckenzm

2

Non è possibile utilizzare CSS per questo scopo. Consiglio di utilizzare JavaScript se applicabile. Dai un'occhiata a questo per ulteriori informazioni: JavaScript equivalente a printf / string.format

Inoltre, come ha detto Petr, puoi gestirlo sul lato server ma dipende totalmente dal tuo scenario.


2

Non credo che tu possa. Puoi usare number_format () se stai codificando in PHP. E anche altri linguaggi di programmazione hanno una funzione per la formattazione dei numeri.


CATTIVA pratica per alterare i dati per scopi di visualizzazione nel "backend".
Buffalo

1

È possibile utilizzare la libreria di tag Jstl per la formattazione delle pagine 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>

Risultato

Numero formattato (1): £ 120.000,23

Numero formattato (2): 000.231

Numero formattato (3): 120.000.231

Numero formattato (4): 120000.231

Numero formattato (5): 023%

Numero formattato (6): 12.000.023.0900000000%

Numero formattato (7): 023%

Numero formattato (8): 120E3

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.