¿Hay una manera de dividir los números largos ("$100000000") en tríadas más legibles ("$100 000 000") con CSS?


Tengo una página con muchos valores numéricos grandes. Millones y miles de millones de dólares van a todas partes. Y es difícil leer estos números, así que mi cliente me pide que los divida en trozos más legibles de tres símbolos, "$100000000" => "$100 000 000".

Esta es una petición completamente razonable, pero el problema es que no quiero hacer esto en el lado del servidor, y no quiero hacer esto con javascript. Verás, tengo un montón de javascript realmente grande que ya se está ejecutando en esta página, haciendo cálculos complejos en estos números largos, y será realmente difícil insertar un parseReadableStringToInteger() en cada lugar que lee datos de la página y un writeIntegerAsReadableString() en cada lugar que escribe resultados de nuevo a la página.

Entonces, estoy pensando en usar CSS para hacer que la cadena larga se muestre como un conjunto de trozos cortos. Mi primer pensamiento fue de -moz-column y -webkit-column, pero desafortunadamente, funcionan solo con palabras que ya están separadas por el espacio.

Tal vez hay otra manera? Cualquier sugerencia es Bienvenidas.

P. S. La compatibilidad entre navegadores no es necesaria. Estoy bien con Gecko y / o Webkit.

Author: n1313, 2010-02-26

12 answers

Vas a tener que encontrar una forma de JavaScript para hacer esto, estoy bastante seguro. Cualquier técnica CSS, incluso si fuera posible, no sería cross-browser.

 2
Author: Skilldrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 11:24:13

No hay forma de hacerlo a través de CSS, pero puede extender el tipo de número de esta manera:

    Number.prototype.formatMoney = function(c, d, t){
    var n = this, c = isNaN(c = Math.abs(c)) ? 2 : c, d = d == undefined ? "," : d, t = t == undefined ? "." : t, s = n < 0 ? "-" : "", i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
       return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
    };

Entonces úsalo así:

var count = 10000000;
count.formatMoney(2, '.', ' ')
 15
Author: Skay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-28 16:17:16

Maldita sea, ya casi estoy allí!!

span {
    display: block;
    -moz-column-gap:5px;
    -moz-column-width:24px;
    word-wrap:break-word;
}

<span>100000</span>
<span>1000000</span>
<span>10000000</span>
<span>100000000</span>

Me da

100 000
100 000 0
100 000 00
100 000 000

Lo único que queda es de alguna manera comenzar la división desde la derecha. Ahora experimentando con direction: rtl y tales:)

 6
Author: n1313,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 12:17:23

Si no está dispuesto a usar JavaScript para cambiar el formato, debe cambiar su formato desde el server...ie, antes de renderizar la página.

 2
Author: Andreas Grech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 11:27:00

Aquí hay una sugerencia que funcionaría, aunque incluso admitiré que no es muy agradable...

Usando el framework jQuery, $("#myElement").text () devuelve solo el texto (no cualquier html anidado). Así que usted podría hacer esto:

<p>$<span id="myElement"><span class="triad">1</span><span class="triad">000</span><span class="triad">000</span></p>

Y aplicar algún relleno o margen para hacerlo más legible.

Cuando llamas:

$("#myElement").text();

Usted obtendría la llanura 1000000 de vuelta.

CSS:

.triad { padding-left: 5px; }
 1
Author: user75525,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 11:28:54

N1313, http://wiki.csswg.org/ideas/content-formatting ;) no es una solución, solo una idea

 1
Author: Skay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 12:37:02
function largeNumberToReadableNumber(number){
  var str = Math.floor(amount)+""; //make the integer a string
  var sub = str.substring(str.length-3, str.length); //the last three characters
  newstr = " "+sub;
  var i = 1;
  while (sub.length >= 3){
    sub = str.substring(str.length-((i+1)*3),str.length-(i*3)); //next three characters
    newstr = sub + " " + newstr; //append the characters
    i+=1;
  }
  return newstr;
}

largeNumberToReadable(120312381124124); //will output " 120 312 381 124  124"

Estoy seguro de que esto se puede escribir mejor y más corto, pero hace el trabajo.

 1
Author: Bassim Huis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-28 18:29:07

Encontré esta pieza de javascript que podría ayudarte si vas a hacerlo del lado del cliente: http://homepage.mac.com/ruske/ruske/C2127905073/E844527267/Media/FormatInteger.js

 0
Author: James B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 11:27:18

Ningún CSS manipula cadenas. Sry tendrás que hacerlo con JS

 0
Author: fmsf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 11:27:45

¿Qué tal tener el número dos veces: Una para mostrar y otra para manipular de esta manera:

<span class="money" data-value="1000000">$ 1 000 000</span>

Entonces puede usar fácilmente getAttribute('data-value') para obtener el valor de su JS y formatear el número de la manera que desee.

data-* los atributos son una nueva característica en HTML 5, pero casi todos los navegadores actuales ya lo soportan (modulu la propiedad .dataset en el DOM, por lo que tendrá que usar getAttribute() en navegadores actuales/antiguos).

 0
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 12:01:01

Desearía que esto fuera posible con CSS : (no se puede obtener valor del texto y utilizarlo en operaciones posteriores utilizando CSS.

 0
Author: Sarfraz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-26 12:03:35

Lo primero que viene a la mente es usar :after y :before con content:" "
Entonces solo necesitas algo que agregue dinámicamente una etiqueta alrededor de los números correctos y le dé estilo.

 0
Author: Knu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-27 19:15:55