Memformat angka (tempat desimal, ribuan pemisah, dll) dengan CSS

121

Apakah mungkin untuk memformat angka dengan CSS? Yaitu: tempat desimal, pemisah desimal, pemisah ribuan, dll.

Mengenakan
sumber
61
Anda tidak bisa tetapi Anda benar-benar harus bisa. Bagaimanapun, 50.000 atau 50000 atau 50.000.00 adalah 'data' yang sama, mereka hanya disajikan secara berbeda untuk apa CSS itu.
punkrockbuddyholly
4
@MrMisterMan: Ada beberapa ide yang dilontarkan di sini: wiki.csswg.org/ideas/content-formatting#numbers Saya mungkin akan diganggu dan dituduh mengutip "spesifikasi" dan membuat semua orang berharap. Dan bagi saya, saya ingin tahu bagaimana teks non-numerik ditangani di sini.
BoltClock
3
Meskipun saya setuju bahwa ini akan menyenangkan untuk dimiliki, nomor tersebut disematkan di dalam halaman yang dilokalkan. Yaitu, sisa halaman adalah bahasa Inggris, Cina atau bahasa lain apa pun, dan nomornya harus IMO sesuai dengan lokalisasi itu. Mengapa harus dilokalkan secara terpisah dari halaman lainnya ...?
menipu
@ Deceze: Anda benar. Seharusnya mungkin untuk memiliki "CSS pelokalan"
Don
1
menambahkan opsi JS menggunakan Intl.NumberFormat mdn-ref:
Joshua Baboo

Jawaban:

26

Kelompok kerja CSS telah menerbitkan Draf tentang Pemformatan Konten pada tahun 2008. Tapi tidak ada yang baru saat ini.

Yoann
sumber
23

Nah, untuk setiap nomor di Javascript saya menggunakan yang berikutnya:

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

dan jika Anda perlu menggunakan pemisah lain sebagai koma misalnya:

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

atau sebagai fungsi:

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
sumber
1
Terima kasih. Bukan solusi CSS murni, tetapi melakukan tugasnya!
Don
Saya suka itu. Tetapi saya juga perlu mengonversi angka menjadi string sebelum mengganti. Anda tidak dapat mengganti nomor.
Mardok
sebelum memanggil _number.replacekita harus memastikan itu adalah string seperti ini _number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";atau Anda akan mendapatkan kesalahan _number.replacetidak didefinisikan atau tidak berfungsi
Shalkam
3
mengapa tidak menggunakan: (123456789) .toLocaleString ('en-GB') atau sejenisnya?
Joehannes
16

Mungkin cara terbaik untuk melakukannya adalah kombinasi pengaturan span dengan kelas yang menunjukkan pemformatan Anda, lalu gunakan Jquery .each untuk melakukan pemformatan pada span saat DOM dimuat ...

Ross
sumber
9

Tidak, Anda harus menggunakan javascript setelah berada di DOM atau memformatnya melalui sisi server bahasa Anda (PHP / ruby ​​/ python dll.)

mreq
sumber
5
Format angka adalah materi konten, seperti teks konten atau masalah notasi lainnya (misalnya, notasi tanggal, yang bergantung pada bahasa). Jadi pemformatan angka adalah pelokalan dan harus ditangani saat konten dibuat. Melakukannya dalam JavaScript masuk akal untuk bagian konten yang dihasilkan JavaScript.
Jukka K. Korpela
Saya setuju sepenuhnya dengan itu. Itu sebabnya saya menuliskannya dalam jawaban saya. Mungkin seharusnya lebih menekankan hal itu.
mreq
Ini bisa berupa konten atau presentasi. Misalnya CSS rtl, yang menunjukkan konten yang sama dengan cara berbeda: haruskah itu juga diperlakukan di sisi server?
Don
6

Bukan jawaban, tapi perhpas yang menarik. Saya memang mengirim proposal ke CSS WG beberapa tahun yang lalu. Namun, tidak ada yang terjadi. Jika memang mereka (dan vendor browser) akan melihat ini sebagai masalah pengembang asli, mungkin bola bisa mulai bergulir?

itpastorn
sumber
2
Terima kasih telah berkontribusi. Saya berharap suatu hari nanti itu akan menjadi populer.
ADJenks
4

Jika itu membantu ...

Saya menggunakan fungsi PHP number_format()dan Narrow No-break Space (  ). Ini sering digunakan sebagai pemisah ribuan yang tidak ambigu.

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

Karena IE8 memiliki beberapa masalah untuk merender Narrow No-break Space, saya mengubahnya menjadi SPAN

echo "<span class='number'>".number_format(200000, 0, "", "<span></span>")."</span>";
.number SPAN{
    padding: 0 1px; 
}
DanielBlazquez
sumber
Sayangnya ini adalah sisi server, ada sedikit CPU yang terkena, kami membutuhkan kemampuan edit mask html / css. Dressing dan rendering harus dari sisi klien kecuali kita menyajikan pdf?
mckenzm
2

Anda tidak dapat menggunakan CSS untuk tujuan ini. Saya merekomendasikan menggunakan JavaScript jika itu berlaku. Lihatlah ini untuk informasi lebih lanjut: JavaScript setara dengan printf / string.format

Juga Seperti yang disebutkan Petr, Anda dapat menanganinya di sisi server tetapi itu sepenuhnya tergantung pada skenario Anda.

Qorbani
sumber
2

Saya tidak berpikir Anda bisa. Anda bisa menggunakan number_format () jika Anda membuat kode dalam PHP. Dan bahasa pemrograman lainnya memiliki fungsi untuk memformat angka juga.

Florin Frătică
sumber
Praktik yang buruk untuk mengubah data untuk tujuan tampilan di "backend".
Buffalo
1

Anda dapat menggunakan Pustaka tag Jstl untuk memformat Halaman 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>

Hasil

Nomor Format (1): £ 120,000.23

Nomor Format (2): 000.231

Format Nomor (3): 120,000.231

Nomor Format (4): 120000.231

Nomor Diformat (5): 023%

Nomor Diformat (6): 12,000.023.0900000000%

Nomor Diformat (7): 023%

Nomor Diformat (8): 120E3

Mohammad Javed
sumber