Formatar números (casas decimais, separadores de milhares, etc.) com CSS

121

É possível formatar números com CSS? Ou seja: casas decimais, separador decimal, separador de milhares, etc.

Don
fonte
61
Você não pode, mas realmente deve ser capaz. Afinal, 50.000 ou 50000 ou 50.000,00 são todos os mesmos 'dados', são apresentados de forma diferente, e é para isso que serve o CSS.
punkrockbuddyholly
4
@MrMisterMan: Há algumas idéias sendo lançadas por aqui: wiki.csswg.org/ideas/content-formatting#numbers Eu provavelmente vou ser assediado e acusado de citar "especificações" e aumentar as esperanças de todos. E, para mim, estou curioso para saber como o texto não numérico seria tratado aqui.
BoltClock
3
Embora eu concorde que isso seria bom, o número é incorporado em uma página localizada. Ou seja, o restante da página é inglês, chinês ou qualquer outro idioma, e os números devem IMO estar em conformidade com essa localização. Por que eles devem ser localizados separadamente do restante da página ...?
Deceze
@ deceze: Você está certo. Deveria ser possível ter "localização CSS" s
Don
1
adicionando a opção JS usando Intl.NumberFormat mdn-ref:
Joshua Baboo

Respostas:

26

O grupo de trabalho CSS publicou um rascunho sobre formatação de conteúdo em 2008. Mas nada de novo no momento.

Yoann
fonte
23

Bem, para qualquer número em Javascript eu uso o próximo:

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 você precisar usar outro separador como vírgula, por exemplo:

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

ou como uma função:

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
fonte
1
Obrigado. Não é uma solução CSS pura, mas faz a tarefa!
Don
Eu gosto disso. Mas eu também precisava converter o número em uma string antes da substituição. Você não pode substituir um número.
Mardok 27/05
antes de chamar _number.replacetemos que ter certeza que é uma string como esta _number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";, ou então você obterá um erro _number.replacenão está definido ou não uma função
Shalkam
3
por que não usar simplesmente: (123456789) .toLocaleString ('en-GB') ou algo semelhante?
21417 Joehannes
16

Provavelmente, a melhor maneira de fazer isso é definir uma extensão com uma classe que denota sua formatação e, em seguida, usar Jquery .each para formatar as extensões quando o DOM for carregado ...

Ross
fonte
9

Não, você precisa usar o javascript quando ele estiver no DOM ou formatá-lo no lado do servidor de idiomas (PHP / ruby ​​/ python etc.)

mreq
fonte
5
O formato dos números é uma questão de conteúdo, como o texto do conteúdo ou outras questões notacionais (por exemplo, anotações de data, que dependem do idioma). Portanto, formatar números é localização e deve ser tratado quando o conteúdo é gerado. Fazê-lo em JavaScript faz sentido para a parte do conteúdo que é gerado por JavaScript.
Jukka K. Korpela
Concordo plenamente com isso. Foi por isso que escrevi na minha resposta. Provavelmente deveria ter colocado mais estresse nisso.
mreq
Pode ser conteúdo ou apresentação. Veja o CSS rtl, que mostra o mesmo conteúdo de uma maneira diferente: ele também deve ser tratado no lado do servidor?
Don
6

Não é uma resposta, mas perhpas de interesse. Enviei uma proposta ao GT CSS alguns anos atrás. No entanto, nada aconteceu. Se, de fato, eles (e os fornecedores de navegadores) veriam isso como uma verdadeira preocupação do desenvolvedor, talvez a bola pudesse começar a rolar?

itpastorn
fonte
2
Obrigado por contribuir. Espero que um dia isso aconteça.
precisa saber é o seguinte
4

Se ajudar ...

Eu uso a função PHP number_format()e o Narrow No-break Space (  ). É frequentemente usado como um separador inequívoco de milhares.

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

Como o IE8 tem alguns problemas para renderizar o Narrow No-Break Space, mudei para um SPAN

echo "<span class='number'>".number_format(200000, 0, "", "<span></span>")."</span>";
.number SPAN{
    padding: 0 1px; 
}
DanielBlazquez
fonte
Infelizmente, este é o lado do servidor, há um pequeno impacto na CPU, precisamos de uma capacidade de máscara de edição html / css. Vestir e renderizar deve estar do lado do cliente, a menos que estejamos servindo um pdf?
Mckenzm
2

Você não pode usar CSS para esse fim. Eu recomendo usar JavaScript, se aplicável. Dê uma olhada nisto para obter mais informações: JavaScript equivalente a printf / string.format

Também, como Petr mencionou, você pode lidar com isso no lado do servidor, mas depende totalmente do seu cenário.

Qorbani
fonte
2

Eu acho que você não pode. Você pode usar number_format () se estiver codificando em PHP. E outras linguagens de programação também têm uma função para formatar números.

Florin Frătică
fonte
MAU prática para alterar dados para fins de exibição no "back-end".
Buffalo
1

Você pode usar a biblioteca de tags Jstl para formatar páginas 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>

Resultado

Número formatado (1): £ 120.000,23

Número formatado (2): 000.231

Número formatado (3): 120.000.231

Número formatado (4): 120000.231

Número formatado (5): 023%

Número formatado (6): 12.000.023,0900000000%

Número formatado (7): 023%

Número formatado (8): 120E3

Mohammad Javed
fonte