การจัดรูปแบบตัวเลข (ตำแหน่งทศนิยมตัวคั่นหลักพัน ฯลฯ ) ด้วย CSS


122

เป็นไปได้ไหมที่จะจัดรูปแบบตัวเลขด้วย CSS นั่นคือตำแหน่งทศนิยมตัวคั่นทศนิยมตัวคั่นหลักพัน ฯลฯ


62
คุณทำไม่ได้ แต่คุณควรจะทำได้จริงๆ ท้ายที่สุด 50,000 หรือ 50000 หรือ 50,000.00 ล้วนเป็น 'ข้อมูล' ที่เหมือนกันซึ่งนำเสนอแตกต่างกันซึ่งเป็นสิ่งที่ CSS มีไว้สำหรับ
punkrockbuddyholly

4
@MrMisterMan: มีแนวคิดบางอย่างที่ถูกโยนทิ้งไว้ที่นี่: wiki.csswg.org/ideas/content-formatting#numbersฉันอาจจะถูกคุกคามและถูกกล่าวหาว่าอ้าง "ข้อกำหนด" และทำให้ทุกคนมีความหวัง และสำหรับฉันฉันอยากรู้ว่าข้อความที่ไม่ใช่ตัวเลขจะจัดการอย่างไรที่นี่
BoltClock

3
แม้ว่าฉันจะยอมรับว่าสิ่งนี้จะดี แต่หมายเลขดังกล่าวจะฝังอยู่ในหน้าที่แปลเป็นภาษาอื่น กล่าวคือส่วนที่เหลือของหน้าเป็นภาษาอังกฤษภาษาจีนหรือภาษาอื่นใดและ IMO ควรสอดคล้องกับการแปลนั้น เหตุใดจึงควรแปลแยกต่างหากจากส่วนที่เหลือของหน้า ... ?
หลอกลวง

@deceze: คุณพูดถูก ควรเป็นไปได้ที่จะมี "Localization CSS"
Don

1
เพิ่มตัวเลือก JS โดยใช้ Intl.NumberFormat mdn -ref:
Joshua Baboo

คำตอบ:


12

คุณสามารถใช้Number.prototype.toLocaleString(). นอกจากนี้ยังสามารถจัดรูปแบบสำหรับรูปแบบตัวเลขอื่น ๆ เช่นละตินอารบิกเป็นต้น

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


2
แนวทางที่ทันสมัยและสง่างามที่สุดและเนื่องจากยังไม่สามารถทำได้ด้วย CSS ณ ตอนนี้จึงควรเป็นคำตอบอันดับ 1!
FMA


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 ที่บริสุทธิ์ แต่ทำงานได้!
ดอน

ฉันชอบมัน. แต่ฉันต้องแปลงตัวเลขเป็นสตริงก่อนที่จะแทนที่ คุณไม่สามารถแทนที่ตัวเลขได้
Mardok

ก่อนที่จะโทร_number.replaceเราต้องตรวจสอบให้แน่ใจว่ามันเป็นสตริงแบบนี้_number = typeof _number != "undefined" && _number > 0 ? String(_number) : "";มิฉะนั้นคุณจะได้รับข้อผิดพลาด_number.replaceไม่ได้กำหนดไว้หรือไม่ใช่ฟังก์ชัน
Shalkam

3
ทำไมไม่ใช้: (123456789) .toLocaleString ('en-GB') หรือสิ่งที่คล้ายกัน?
Joehannes

16

วิธีที่ดีที่สุดในการทำเช่นนั้นคือคำสั่งผสมของการตั้งค่าช่วงกับคลาสที่แสดงถึงการจัดรูปแบบของคุณจากนั้นใช้ Jquery .each ทำการจัดรูปแบบในช่วงเวลาที่โหลด DOM ...


9

ไม่คุณต้องใช้จาวาสคริปต์เมื่ออยู่ใน DOM หรือฟอร์แมตผ่านฝั่งเซิร์ฟเวอร์ภาษาของคุณ (PHP / ruby ​​/ python เป็นต้น)


5
รูปแบบของตัวเลขเป็นเรื่องของเนื้อหาเช่นเดียวกับข้อความของเนื้อหาหรือปัญหาเชิงสัญกรณ์อื่น ๆ (เช่นสัญกรณ์วันที่ซึ่งขึ้นอยู่กับภาษา) ดังนั้นการจัดรูปแบบตัวเลขจึงเป็นภาษาท้องถิ่นและควรจัดการเมื่อสร้างเนื้อหา การทำใน JavaScript เหมาะสมกับส่วนของเนื้อหาที่สร้างโดย JavaScript
Jukka K. Korpela

ฉันเห็นด้วยอย่างยิ่งกับสิ่งนั้น นั่นเป็นเหตุผลที่ฉันเขียนไว้ในคำตอบของฉัน น่าจะทำให้เครียดมากกว่านี้
mreq

อาจเป็นได้ทั้งเนื้อหาหรืองานนำเสนอ ใช้ CSS rtlที่แสดงเนื้อหาเดียวกันในลักษณะที่แตกต่างกัน: ควรปฏิบัติกับฝั่งเซิร์ฟเวอร์ด้วยหรือไม่?
Don

6

ไม่ใช่คำตอบ แต่เป็นที่สนใจ ฉันได้ส่งข้อเสนอไปยัง CSS WGเมื่อสองสามปีก่อน อย่างไรก็ตามไม่มีอะไรเกิดขึ้น หากพวกเขา (และผู้ขายเบราว์เซอร์) เห็นว่านี่เป็นปัญหาของนักพัฒนาอย่างแท้จริงบางทีลูกบอลอาจเริ่มกลิ้ง?


2
ขอบคุณที่ร่วมให้ข้อมูล ฉันหวังว่าวันหนึ่งมันจะจับได้
ADJenks

4

ถ้าจะช่วย ...

ฉันใช้ฟังก์ชัน PHP number_format()และNarrow No-break Space (  ) มักใช้เป็นตัวคั่นหลักพันที่ชัดเจน

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

เนื่องจาก IE8 มีปัญหาในการเรนเดอร์ Narrow No-break Space ฉันจึงเปลี่ยนเป็น SPAN

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

น่าเสียดายที่นี่เป็นฝั่งเซิร์ฟเวอร์มีการโจมตีของ CPU เล็กน้อยเราต้องการความสามารถในการแก้ไข html / css การแต่งกายและการแสดงผลควรเป็นฝั่งไคลเอ็นต์เว้นแต่เราจะให้บริการ pdf?
mckenzm

2

คุณไม่สามารถใช้ CSS เพื่อจุดประสงค์นี้ ฉันขอแนะนำให้ใช้ JavaScript หากสามารถใช้ได้ ดูข้อมูลเพิ่มเติมได้ที่: JavaScript เทียบเท่ากับ printf / string.format

เช่นเดียวกับที่ Petr กล่าวถึงคุณสามารถจัดการได้บนฝั่งเซิร์ฟเวอร์ แต่ทั้งหมดขึ้นอยู่กับสถานการณ์ของคุณ


2

ฉันไม่คิดว่าคุณจะทำได้ คุณสามารถใช้number_format ()หากคุณกำลังเข้ารหัสด้วย PHP และภาษาโปรแกรมอื่น ๆ ก็มีฟังก์ชันสำหรับการจัดรูปแบบตัวเลขเช่นกัน


แนวทางปฏิบัติที่ไม่ดีในการแก้ไขข้อมูลเพื่อวัตถุประสงค์ในการแสดงผลใน "แบ็กเอนด์"
ควาย

1

คุณสามารถใช้ Jstl tag Library สำหรับการจัดรูปแบบสำหรับ JSP Pages

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>

ผลลัพธ์

Formatted Number (1): 120,000.23 ปอนด์

หมายเลขที่จัดรูปแบบ (2): 000.231

Formatted Number (3): 120,000.231

หมายเลขรูปแบบ (4): 120000.231

หมายเลขรูปแบบ (5): 023%

หมายเลขที่จัดรูปแบบ (6): 12,000,023.0900000000%

หมายเลขรูปแบบ (7): 023%

รูปแบบหมายเลข (8): 120E3

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.