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.


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:




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;
}

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 ...


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.)


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?


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; 
}

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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.