Форматирование чисел (десятичные разряды, разделители тысяч и т. д.) с помощью CSS

Можно ли форматировать числа с помощью CSS? То есть: десятичные знаки, десятичный разделитель, разделитель тысяч и т. д.


person Don    schedule 30.12.2011    source источник
comment
Вы не можете, но вы действительно должны быть в состоянии. В конце концов, 50 000, 50 000 или 50 000,00 — это одни и те же «данные», они просто представлены по-разному, для чего и предназначен CSS.   -  person punkrockbuddyholly    schedule 30.12.2011
comment
@MrMisterMan: Здесь есть несколько идей: wiki.csswg.org/ideas/ content-formatting#numbers Меня, вероятно, будут преследовать и обвинять в том, что я цитирую спецификации и вселяю надежду. И мне любопытно узнать, как здесь будет обрабатываться нечисловой текст.   -  person BoltClock    schedule 30.12.2011
comment
Хотя я согласен, что это было бы неплохо иметь, номер встроен в локализованную страницу. То есть остальная часть страницы написана на английском, китайском или любом другом языке, и номера должны соответствовать IMO этой локализации. Почему они должны быть локализованы отдельно от остальной части страницы...?   -  person deceze♦    schedule 07.02.2012
comment
@deceze: ты прав. Должна быть возможность иметь CSS для локализации   -  person Don    schedule 07.02.2012
comment
добавление параметра JS с использованием Intl.NumberFormat mdn-ref:   -  person Joshua Baboo    schedule 31.05.2017


Ответы (11)


К сожалению, в настоящее время это невозможно с помощью CSS, но вы можете использовать Number.prototype.toLocaleString(). Он также может форматировать для других числовых форматов, например. латинский, арабский и т.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString

person CascadiaJS    schedule 09.10.2018
comment
Самый современный и элегантный подход, и поскольку на данный момент его невозможно реализовать с помощью CSS, должен быть ответом номер 1! - person FMA; 12.01.2019

Рабочая группа CSS опубликовала черновик по форматированию контента в 2008 году. Но сейчас ничего нового.

person Yoann    schedule 10.07.2012

Что ж, для любых чисел в Javascript я использую следующее:

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

и если вам нужно использовать любой другой разделитель в качестве запятой, например:

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

или как функция:

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;
}
person Anton Y. Reuchenko    schedule 25.02.2015
comment
Спасибо. Не чистое решение CSS, но выполняет задачу! - person Don; 25.02.2015
comment
Мне это нравится. Но мне нужно было также преобразовать число в строку перед заменой. Вы не можете сделать замену на номер. - person Mardok; 27.05.2016
comment
перед вызовом _number.replace мы должны убедиться, что это строка, подобная этой _number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";, иначе вы получите сообщение об ошибке _number.replace не определено или не является функцией - person Shalkam; 01.07.2017
comment
почему бы просто не использовать: (123456789).toLocaleString('en-GB') или тому подобное? - person Joehannes; 23.11.2017

Вероятно, лучший способ сделать это - это комбинация установки диапазона с классом, обозначающим ваше форматирование, а затем использование Jquery .each для форматирования диапазонов при загрузке DOM...

person Ross    schedule 06.08.2012

Нет, вы должны использовать javascript, как только он появится в DOM, или отформатировать его на стороне вашего языка (PHP/ рубин/питон и т. д.)

person mreq    schedule 30.12.2011
comment
Формат чисел зависит от содержания, как и текст содержания или другие проблемы с обозначениями (например, обозначения даты, которые зависят от языка). Таким образом, форматирование чисел является локализацией и должно обрабатываться при создании контента. Выполнение этого в JavaScript имеет смысл для той части контента, которая генерируется с помощью JavaScript. - person Jukka K. Korpela; 30.12.2011
comment
Я полностью согласен с этим. Вот почему я написал это в своем ответе. Наверное, надо было больше напрягаться. - person mreq; 31.12.2011
comment
Это может быть как контент, так и презентация. Возьмите CSS rtl, который показывает один и тот же контент по-другому: должен ли он также обрабатываться на стороне сервера? - person Don; 01.02.2018

Не ответ, но, возможно, интересно. Несколько лет назад я отправил предложение в рабочую группу CSS. Однако ничего не произошло. Если они (и поставщики браузеров) действительно увидят в этом серьезную проблему для разработчиков, может быть, дело сдвинется с мертвой точки?

person itpastorn    schedule 14.08.2012
comment
Спасибо за участие. Я надеюсь, что однажды это приживется. - person ADJenks; 03.08.2017

Если это поможет...

Я использую функцию PHP number_format() и Узкий неразрывный пробел ( ). Он часто используется как однозначный разделитель тысяч.

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

Поскольку у IE8 есть некоторые проблемы с отображением узкого неразрывного пространства, я заменил его на SPAN.

echo "<span class='number'>".number_format(200000, 0, "", "<span></span>")."</span>";
.number SPAN{
    padding: 0 1px; 
}
person DanielBlazquez    schedule 26.06.2013
comment
К сожалению, это на стороне сервера, есть небольшая нагрузка на ЦП, нам нужна возможность редактирования маски html/css. Одевание и рендеринг должны быть на стороне клиента, если мы не обслуживаем pdf? - person mckenzm; 30.12.2016

Я не думаю, что вы можете. Вы можете использовать number_format(), если вы пишете код на PHP. И в других языках программирования тоже есть функция форматирования чисел.

person Florin Frătică    schedule 30.12.2011
comment
ПЛОХАЯ практика изменения данных для отображения в бэкэнде. - person Buffalo; 28.01.2019
comment
В чем проблема с обслуживанием страницы на испанском (или другом языке) с номерами, отформатированными на этом языке? Я не думаю, что это плохая практика. - person DanielBlazquez; 07.05.2021

Вы не можете использовать CSS для этой цели. Я рекомендую использовать JavaScript, если он применим. Взгляните на это для получения дополнительной информации: JavaScript-эквивалент printf/string.format

Также, как упомянул Петр, вы можете справиться с этим на стороне сервера, но это полностью зависит от вашего сценария.

person Qorbani    schedule 30.12.2011

Вы можете использовать библиотеку тегов Jstl для форматирования страниц 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>

Результат

Форматированный номер (1): 120 000,23 фунтов стерлингов.

Форматированный номер (2): 000.231

Форматированное число (3): 120 000,231

Форматированный номер (4): 120000.231

Форматированное число (5): 023%

Форматированное число (6): 12 000 023,0900000000%

Форматированное число (7): 023%

Форматированный номер (8): 120E3

person Mohammad Javed    schedule 16.08.2016

Еще одно решение с чистым CSS+HTML и псевдоклассом :lang().

Используйте немного HTML, чтобы разметить число классами thousands-separator и decimal-separator:

<html lang="es">
  Spanish: 1<span class="thousands-separator">200</span><span class="thousands-separator">000</span><span class="decimal-separator">.</span>50
</html>

Используйте псевдокласс lang для форматирования числа.

/* Spanish */
.thousands-separator:lang(es):before{
  content: ".";
}
.decimal-separator:lang(es){
  visibility: hidden;
  position: relative;
}
.decimal-separator:lang(es):before{
  position: absolute;
  visibility: visible;
  content: ",";
}

/* English and Mexican Spanish */
.thousands-separator:lang(en):before, .thousands-separator:lang(es-MX):before{
  content: ",";
}

Codepen: https://codepen.io/danielblazquez/pen/qBqVjGy

person DanielBlazquez    schedule 23.02.2021