使用CSS格式化数字(小数位数,数千个分隔符等)


121

是否可以使用CSS格式化数字?即:小数位,小数点分隔符,千位分隔符等。


61
您不能,但您确实应该能够。毕竟,50,000、50000或50,000.00都是相同的“数据”,它们只是以不同的方式呈现,这就是CSS的用途。
punkrockbuddyholly

4
@MrMisterMan:有些想法在这里被抛弃:wiki.csswg.org/ideas/content-formatting#numbers我可能会受到骚扰,并被指控引用“规格”并引起所有人的希望。对于我来说,我很好奇,我想知道如何在这里处理非数字文本。
BoltClock

3
虽然我确实同意这样做会很不错,但是数字已嵌入在其他本地化页面中。即,页面的其余部分为英语,中文或任何其他语言,并且IMO的编号应符合该本地化要求。为什么将它们与页面的其余部分分开本地化?
deceze

@ deceze:你是对的。应该有可能使用“本地化CSS”

1
使用Intl.NumberFormat mdn-ref
约书亚·巴布

Answers:




23

好吧,对于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;
}

1
谢谢。不是纯粹的CSS解决方案,而是可以完成任务!

我喜欢。但是我还需要在替换之前将数字转换为字符串。您不能对数字进行替换。
马多克

在调用之前,_number.replace我们必须确保它是一个像这样的字符串_number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";,否则您将得到_number.replace未定义的错误或不是函数的信息
Shalkam

3
为什么不简单使用:(123456789).toLocaleString('en-GB')之类的?
约翰内斯(Joehannes)'17

16

这样做的最好方法可能是将一个span设置为一个表示格式的类,然后使用Jquery .each在加载DOM时对span进行格式化。


9

不,您必须在DOM中使用javascript或通过您的语言服务器端(PHP / ruby​​ / python等)对其进行格式化。


5
数字的格式是一个内容问题,例如内容的文本或其他符号问题(例如,与语言有关的日期符号)。因此,格式化数字是本地化,应在生成内容时进行处理。对于使用JavaScript生成的部分内容,使用JavaScript进行处理是有意义的。
Jukka K. Korpela

我完全同意这一点。这就是为什么我在答案中写它的原因。应该给它施加更多的压力。
mreq

它可以是内容或演示文稿。以CSS为例rtl,它以不同的方式显示相同的内容:是否也应在服务器端对待它?

6

不是答案,而是令人感兴趣的观点。几年前,我确实向CSS WG发送了提案。但是,什么也没发生。如果确实他们(和浏览器供应商)将这视为真正的开发人员关注,那么可能会开始滚滚球吗?


2
感谢您的贡献。我希望有一天能流行起来。
ADJenks '17

4

如果有帮助...

我使用PHP函数number_format()Narrow No-break Space )。它通常用作明确的千位分隔符。

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

由于IE8在渲染窄的不间断空间方面存在一些问题,因此我将其更改为SPAN

echo "<span class='number'>".number_format(200000, 0, "", "<span></span>")."</span>";
.number SPAN{
    padding: 0 1px; 
}

不幸的是,这是服务器端,对CPU的影响很小,我们需要html / css编辑掩码功能。除非我们提供pdf文件,否则外观和渲染应该是客户端的。
mckenzm '16



1

您可以使用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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.