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.