Định dạng số (vị trí thập phân, dấu phân cách hàng nghìn, v.v.) bằng CSS


121

Có thể định dạng số bằng CSS không? Đó là: chữ số thập phân, dấu phân cách thập phân, dấu phân cách hàng nghìn, v.v.


61
Bạn không thể nhưng bạn thực sự nên có thể. Xét cho cùng, 50.000 hoặc 50000 hoặc 50.000.00 đều là 'dữ liệu' giống nhau, chúng chỉ được trình bày khác nhau, đó là CSS dùng để làm gì.
punkrockbuddyholly

4
@MrMisterMan: Có một số ý tưởng đang được đưa ra xung quanh đây: wiki.csswg.org/ideas/content-formatting#numbers Tôi có lẽ sẽ bị quấy rối và bị buộc tội trích dẫn "thông số kỹ thuật" và hy vọng của mọi người. Và đối với tôi, tôi tò mò muốn biết văn bản không phải số sẽ được xử lý như thế nào ở đây.
BoltClock

3
Mặc dù tôi đồng ý rằng điều này sẽ rất tuyệt nếu có, nhưng con số được nhúng bên trong một trang được bản địa hóa khác. Tức là, phần còn lại của trang là tiếng Anh, tiếng Trung hoặc bất kỳ ngôn ngữ nào khác và các số IMO phải tuân theo bản địa hóa đó. Tại sao chúng phải được bản địa hóa riêng biệt với phần còn lại của trang ...?
lừa dối

@deceze: Bạn nói đúng. Có thể có "CSS bản địa hóa"
Don

1
thêm tùy chọn JS bằng Intl.NumberFormat mdn-ref:
Joshua Baboo,

Câu trả lời:




23

Đối với bất kỳ số nào trong Javascript, tôi sử dụng số tiếp theo:

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

và nếu bạn cần sử dụng bất kỳ dấu phân tách nào khác dưới dạng dấu phẩy, ví dụ:

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

hoặc như một chức năng:

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
Cảm ơn. Không phải là một giải pháp CSS thuần túy, nhưng thực hiện nhiệm vụ!
Don

Tôi thích nó. Nhưng tôi cũng cần chuyển đổi số thành chuỗi trước khi thay thế. Bạn không thể thay thế một số.
Mardok

trước khi gọi _number.replacechúng ta phải chắc chắn rằng nó là một chuỗi như thế này _number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";hoặc nếu không bạn sẽ nhận được một lỗi _number.replacekhông được xác định hoặc không phải là một chức năng
Shalkam

3
tại sao không đơn giản sử dụng: (123456789) .toLocaleString ('en-GB') hoặc tương tự?
Joehannes

16

Có lẽ cách tốt nhất để làm như vậy là kết hợp đặt một khoảng với một lớp biểu thị định dạng của bạn, sau đó sử dụng Jquery .each để thực hiện định dạng trên các khoảng khi DOM được tải ...


9

Không, bạn phải sử dụng javascript khi nó ở trong DOM hoặc định dạng nó qua phía máy chủ ngôn ngữ của bạn (PHP / ruby ​​/ python, v.v.)


5
Định dạng của các con số là một vấn đề nội dung, như văn bản của nội dung hoặc các vấn đề ký hiệu khác (ví dụ: ký hiệu ngày tháng, phụ thuộc vào ngôn ngữ). Vì vậy, định dạng số là bản địa hóa và cần được xử lý khi nội dung được tạo. Làm điều đó bằng JavaScript có ý nghĩa đối với phần nội dung do JavaScript tạo.
Jukka K. Korpela

Tôi hoàn toàn đồng ý với điều đó. Đó là lý do tại sao tôi đã viết nó trong câu trả lời của mình. Có lẽ nên gây căng thẳng hơn cho nó.
mreq

Nó có thể là nội dung hoặc trình bày. Lấy CSS rtl, hiển thị cùng một nội dung theo một cách khác: nó cũng nên được xử lý ở phía máy chủ?
Don

6

Không phải là một câu trả lời, nhưng perhpas quan tâm. Tôi đã gửi một đề xuất đến CSS WG một vài năm trước. Tuy nhiên, vẫn chưa có gì xảy ra. Nếu thực sự họ (và các nhà cung cấp trình duyệt) sẽ coi đây là mối quan tâm thực sự của nhà phát triển, có lẽ quả bóng có thể bắt đầu lăn?


2
Cảm ơn vì đã đóng góp. Tôi hy vọng một ngày nào đó nó sẽ bắt đầu.
ADJenks

4

Nếu nó giúp ...

Tôi sử dụng hàm PHP number_format()Dấu cách hẹp không ngắt (  ). Nó thường được sử dụng như một dấu phân cách hàng nghìn rõ ràng.

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

Vì IE8 gặp một số vấn đề để hiển thị Không gian ngắt quãng hẹp, tôi đã thay đổi nó thành SPAN

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

Thật không may, đây là phía máy chủ, có một sự cố CPU nhẹ, chúng tôi cần một khả năng mặt nạ chỉnh sửa html / css. Trang phục và kết xuất nên ở phía khách hàng trừ khi chúng tôi đang cung cấp một bản pdf?
mckenzm

2

Bạn không thể sử dụng CSS cho mục đích này. Tôi khuyên bạn nên sử dụng JavaScript nếu nó có thể áp dụng. Hãy xem cái này để biết thêm thông tin: JavaScript tương đương với printf / string.format

Cũng như Petr đã đề cập, bạn có thể xử lý nó ở phía máy chủ nhưng nó hoàn toàn phụ thuộc vào tình huống của bạn.


2

Tôi không nghĩ bạn có thể. Bạn có thể sử dụng number_format () nếu bạn đang viết mã bằng PHP. Và các ngôn ngữ lập trình khác cũng có chức năng định dạng số.


BAD thực hành để thay đổi dữ liệu cho mục đích hiển thị trong "phụ trợ".
Buffalo

1

Bạn có thể sử dụng Thư viện thẻ Jstl để định dạng cho các Trang 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>

Kết quả

Số được định dạng (1): £ 120.000,23

Số được định dạng (2): 000.231

Số được định dạng (3): 120.000.231

Số được định dạng (4): 120000.231

Số được định dạng (5): 023%

Số được định dạng (6): 12.000.023.0900000000%

Số được định dạng (7): 023%

Số định dạng (8): 120E3

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.