Formateo de números (lugares decimales, separadores de miles, etc.) con CSS

121

¿Es posible formatear números con CSS? Es decir: lugares decimales, separador decimal, separador de miles, etc.

Don
fuente
61
No puedes, pero deberías poder hacerlo. Después de todo, 50,000 o 50000 o 50,000.00 son todos los mismos 'datos', simplemente se presentan de manera diferente, para eso es CSS.
punkrockbuddyholly
4
@MrMisterMan: Hay algunas ideas que se están lanzando aquí: wiki.csswg.org/ideas/content-formatting#numbers Probablemente voy a ser acosado y acusado de citar "especificaciones" y hacer ilusiones a todos. Y para mí, tengo curiosidad por saber cómo se manejaría el texto no numérico aquí.
BoltClock
3
Si bien estoy de acuerdo en que sería bueno tener esto, el número está incrustado dentro de una página localizada. Es decir, el resto de la página está en inglés, chino o cualquier otro idioma, y ​​los números deben ajustarse en mi opinión a esa localización. ¿Por qué deberían localizarse por separado del resto de la página ...?
diciembre
@deceze: Tienes razón. Debería ser posible tener "CSS de localización"
Don
1
agregando la opción JS usando Intl.NumberFormat mdn-ref:
Joshua Baboo

Respuestas:

26

El grupo de trabajo de CSS ha publicado un borrador sobre formato de contenido en 2008. Pero nada nuevo en este momento.

Yoann
fuente
23

Bueno, para cualquier número en Javascript, uso el siguiente:

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

y si necesita usar cualquier otro separador como coma, por ejemplo:

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

o en función:

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
fuente
1
Gracias. No es una solución CSS pura, ¡pero cumple la tarea!
Don
Me gusta. Pero también necesitaba convertir el número en una cadena antes del reemplazo. No se puede reemplazar un número.
Mardok
antes de llamar _number.replace, tenemos que asegurarnos de que sea una cadena como esta _number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";o, de lo contrario, obtendrá un error _number.replaceque no está definido o no es una función
Shalkam
3
¿Por qué no usar simplemente: (123456789) .toLocaleString ('en-GB') o similar?
Joehannes
16

Probablemente la mejor manera de hacerlo es una combinación de establecer un intervalo con una clase que denota su formateo y luego usar Jquery .each para formatear en los intervalos cuando se carga el DOM ...

Ross
fuente
9

No, debe usar javascript una vez que esté en el DOM o formatearlo a través de su idioma del lado del servidor (PHP / ruby ​​/ python, etc.)

mreq
fuente
5
El formato de los números es una cuestión de contenido, como el texto del contenido u otras cuestiones de notación (por ejemplo, anotaciones de fecha, que dependen del idioma). Por lo tanto, formatear números es una localización y debe manejarse cuando se genera contenido. Hacerlo en JavaScript tiene sentido para la parte del contenido que se genera en JavaScript.
Jukka K. Korpela
Estoy totalmente de acuerdo con eso. Por eso lo escribí en mi respuesta. Probablemente debería haberle puesto más estrés.
mreq
Puede ser contenido o presentación. Tome CSS rtl, que muestra el mismo contenido de una manera diferente: ¿debería tratarse también del lado del servidor?
Don
6

No es una respuesta, pero perhpas de interés. Envié una propuesta al CSS WG hace unos años. Sin embargo, no ha pasado nada. Si realmente ellos (y los proveedores de navegadores) vieran esto como una preocupación genuina de los desarrolladores, ¿quizás la pelota podría comenzar a rodar?

itpastorn
fuente
2
Gracias por contribuir. Espero que algún día se dé cuenta.
ADJenks
4

Si ayuda ...

Utilizo la función PHP number_format()y el espacio estrecho sin interrupciones (  ). A menudo se utiliza como un separador de miles inequívoco.

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

Debido a que IE8 tiene algunos problemas para representar el espacio estrecho sin interrupciones, lo cambié por un SPAN

echo "<span class='number'>".number_format(200000, 0, "", "<span></span>")."</span>";
.number SPAN{
    padding: 0 1px; 
}
DanielBlazquez
fuente
Desafortunadamente, esto es del lado del servidor, hay un ligero golpe de CPU, necesitamos una capacidad de máscara de edición html / css. El vestuario y el renderizado deberían ser del lado del cliente a menos que estemos entregando un pdf.
mckenzm
2

No puede usar CSS para este propósito. Recomiendo usar JavaScript si es aplicable. Eche un vistazo a esto para obtener más información: JavaScript equivalente a printf / string.format

Además, como mencionó Petr, puede manejarlo en el lado del servidor, pero depende totalmente de su escenario.

Qorbani
fuente
2

No creo que puedas. Puede usar number_format () si está codificando en PHP. Y otros lenguajes de programación también tienen una función para formatear números.

Florin Frătică
fuente
Una mala práctica para alterar los datos con fines de visualización en el "backend".
Buffalo
1

Puede usar la biblioteca de etiquetas Jstl para formatear 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 formateado (1): £ 120,000.23

Número formateado (2): 000.231

Número formateado (3): 120,000.231

Número formateado (4): 120000.231

Número formateado (5): 023%

Número formateado (6): 12,000,023.0900000000%

Número formateado (7): 023%

Número formateado (8): 120E3

Mohammad Javed
fuente