Trình Định Dạng Số
Định dạng số với dấu phẩy, viết tắt, ký hiệu tiền tệ và số thập phân tùy chỉnh.
Cách hoạt động
- Nhập số của bạn: gõ hoặc dán một giá trị số, số nguyên, số thập phân, số lớn hoặc ký hiệu khoa học.
- Chọn tùy chọn định dạng: chọn ngôn ngữ địa phương (US, EU, v.v.), số thập phân, dấu phân tách nhóm và ký hiệu tiền tệ nếu cần.
- Sao chép kết quả đã định dạng: số hiển thị trong định dạng đã chọn ngay tức thì. Sao chép để sử dụng trong báo cáo, tài liệu hoặc xuất.
Tại sao sử dụng trình định dạng số?
Số có nghĩa khác nhau tùy theo ngôn ngữ địa phương. Hoa Kỳ viết một nghìn là 1,000.00 trong khi nhiều nước châu Âu viết là 1.000,00. Sao chép các số thô giữa các hệ thống gây ra lỗi phân tích, đọc sai và lỗi tài chính. Trình định dạng số đảm bảo các số của bạn hiển thị đúng cho bất kỳ đối tượng nào, chuẩn bị báo cáo tài chính, bản địa hóa nội dung hoặc làm sạch dữ liệu để trình bày.
Tính năng
- Định dạng theo ngôn ngữ địa phương: hỗ trợ định dạng US, EU và quốc tế với dấu phân tách thập phân và nhóm đúng.
- Kiểm soát độ chính xác thập phân: xác định chính xác số chữ số thập phân hiển thị.
- Nhóm hàng nghìn: thêm hoặc xóa dấu phân tách hàng nghìn bằng một cú nhấp.
- Định dạng tiền tệ: thêm tiền tố ký hiệu tiền tệ và định dạng như một giá trị tiền tệ.
- Ký hiệu khoa học: chuyển đổi từ hoặc sang ký hiệu khoa học cho các số rất lớn hoặc rất nhỏ.
Câu hỏi thường gặp
Sự khác biệt giữa định dạng số US và châu Âu là gì?
Tại Hoa Kỳ, dấu phân tách thập phân là dấu chấm (.) và dấu phân tách hàng nghìn là dấu phẩy (,), ví dụ 1,234.56. Ở phần lớn châu Âu, ngược lại: 1.234,56. Công cụ này chuyển đổi đúng giữa hai định dạng.
Tôi có thể định dạng số cho tiền tệ không?
Có. Bật chế độ tiền tệ và chọn ký hiệu ($ € £ ¥, v.v.) để thêm tiền tố cho số đã định dạng. Cho định dạng kế toán với quy ước số âm, bật chế độ kế toán.
Nó có xử lý các số rất lớn hoặc rất nhỏ không?
Có. Trình định dạng xử lý số nhiều chữ số và có thể hiển thị chúng ở ký hiệu chuẩn, nhóm hoặc khoa học. Độ chính xác dấu phẩy động được áp dụng cho số thập phân đã cấu hình.
Các tiêu chuẩn định dạng số đến từ đâu
Các định dạng số mà bạn thấy trong phần mềm ngày nay được xác định bởi một chồng nhỏ các tiêu chuẩn mất ba mươi năm để ổn định. IEEE 754 (1985), được sửa đổi vào năm 2008 và 2019, đã cố định bố cục bit của số dấu phẩy động nhị phân: 64 bit chia thành 1 dấu, 11 số mũ, 52 mantissa, đó là những gì mỗi số JavaScript là dưới mui xe. ISO 4217 (1978, ấn bản hiện tại 2015) đã xác định các mã tiền tệ ba chữ cái, USD, EUR, JPY, INR, BRL, và số đơn vị nhỏ hơn mà mỗi loại có (2 cho USD, 0 cho JPY, 3 cho KWD, 4 cho CLF). Unicode CLDR (Common Locale Data Repository), được phát hành lần đầu năm 2003, là bộ dữ liệu mở ghi lại các dấu phân cách nhóm, dấu phân cách thập phân, ký hiệu tiền tệ và quy tắc số nhiều cho mọi locale; bản phát hành hiện tại là CLDR 46 (tháng 10 năm 2024). ECMA-402 (2012), API Quốc tế hóa ECMAScript, đã cung cấp cho JavaScript một liên kết gốc đến dữ liệu đó thông qua Intl.NumberFormat, được hỗ trợ bởi ICU (International Components for Unicode) trong V8, JavaScriptCore và SpiderMonkey. Cùng nhau bốn spec đó khiến (1234567).toLocaleString('de-DE') trả về 1.234.567 thay vì 1,234,567.
Sáu mẫu locale mà bạn sẽ gặp
Hầu hết các định dạng số trong tự nhiên rơi vào sáu mẫu. Ghi nhớ sáu này bao phủ ~95% cơ sở người dùng của bất kỳ sản phẩm toàn cầu nào.
- en-US, en-GB, ja-JP, zh-CN, ko-KR, nhóm dấu phẩy, thập phân dấu chấm:
1,234,567.89. - de-DE, es-ES, it-IT, nl-NL, pt-BR, nhóm dấu chấm, thập phân dấu phẩy:
1.234.567,89. Cẩn thận khi dán vào bảng tính Hoa Kỳ. - fr-FR, ru-RU, sv-SE, pl-PL, nhóm khoảng trắng không-ngắt hẹp (Unicode U+202F), thập phân dấu phẩy:
1 234 567,89. Dấu phân cách không phải là khoảng trắng thông thường; sao chép-dán qua hệ thống chuẩn hóa khoảng trắng sẽ làm hỏng nó. - de-CH, nhóm dấu nháy đơn phải (U+2019), thập phân dấu chấm:
1’234’567.89. Thụy Sĩ độc đáo ở đây. - en-IN, hi-IN, nhóm dấu phẩy, thập phân dấu chấm, nhưng nhóm là 2-2-3 thay vì 3-3-3:
12,34,567.89. Điều này phản ánh hệ thống lakh/crore: 1 lakh = 10⁵, 1 crore = 10⁷. - ar-EG, ar-SA, chữ số Ả Rập-Ấn (٠١٢٣٤٥٦٧٨٩), thập phân Ả Rập U+066B, dấu phân cách hàng nghìn Ả Rập U+066C:
١٬٢٣٤٬٥٦٧٫٨٩. Hầu hết các môi trường phát triển nói tiếng Ả Rập sử dụng chữ số Latin nội bộ và chỉ chuyển đổi để hiển thị.
Các chế độ làm tròn, thực sự chúng làm gì
ECMA-402 (2023) đã thêm chín chế độ làm tròn vào Intl.NumberFormat. Lựa chọn thay đổi tổng tài chính, báo cáo khoa học và tính toán thuế. Ba quan trọng nhất trong thực tế.
halfExpand(mặc định). 2,5 làm tròn thành 3, −2,5 làm tròn thành −3. Đây là cách làm tròn mà mọi người đã học ở trường và là mặc định của JavaScript.halfEven(làm tròn của ngân hàng). 2,5 làm tròn thành 2, 3,5 làm tròn thành 4, các trận hòa luôn đi đến chữ số chẵn. Được yêu cầu bởi IEEE 754 cho số học dấu phẩy động. Được sử dụng trong bảng thuế Hoa Kỳ, tính toán khoa học và các hệ thống kế toán lớn để loại bỏ một độ lệch hệ thống nhỏ màhalfExpandgiới thiệu qua hàng triệu lần làm tròn.trunc. Loại bỏ mọi thứ sau cắt mà không làm tròn. 2,9 thành 2, −2,9 thành −2. Được sử dụng khi bạn thực sự muốn loại bỏ độ chính xác, không bao giờ cho tiền.- Sáu cái khác (
ceil,floor,expand,halfCeil,halfFloor,halfTrunc) xử lý các trường hợp chuyên biệt như luôn làm tròn lên cho chi phí vận chuyển hoặc luôn làm tròn xuống cho giảm giá thuế. Chọn một cách có chủ ý, đừng chấp nhận mặc định nếu tiền hoặc tuân thủ liên quan.
Nơi công cụ này kiếm được tiền lương của mình
- Báo cáo tài chính. Định dạng doanh thu, chi phí, tỷ lệ cho slide. Chuyển đổi giữa định dạng Hoa Kỳ và EU để phù hợp với quốc gia của khán giả.
- Kiểm tra locale của cửa hàng bạn. Nhập giá theo định dạng mong muốn và xác minh rằng nó khớp với những gì trang thương mại điện tử của bạn hiển thị cho khách hàng ở Đức hoặc Ấn Độ.
- Chuẩn bị CSV. Chuyển đổi các hàng tiếng Đức
1.234,56thành Hoa Kỳ1234.56trước khi nhập vào trang tính mong đợi thập phân chấm, hoặc ngược lại. - Định dạng rupee Ấn Độ. Biến 12.500.000 thành 1,25,00,000 (1,25 crore) cho khán giả Nam Á. Hầu hết các công cụ được xây dựng tại Hoa Kỳ không làm điều này.
- Hiển thị dashboard nhỏ gọn. Biến 1.234.567 thành
1.23Mcho các widget mà không gian ngang chật chội. Ký hiệu nhỏ gọn cũng nhận biết locale: tiếng Đức hiển thị1,23 Mio. - Tiền tố ký hiệu tiền tệ. Thêm $, €, £, ¥, ₹ ở vị trí chính xác cho mỗi locale, đô la Mỹ ở phía trước, euro Đức ở phía sau.
- Thoát ký hiệu khoa học Excel. Các ID lớn được dán như snowflake của Twitter được chuyển đổi thành
1.23E+18và mất độ chính xác. Định dạng chúng với nhóm cộng dấu nháy đơn ở đầu trước khi dán để Excel coi chúng là văn bản.
Những sai lầm cắn cả những nhà phát triển có kinh nghiệm
- Số học dấu phẩy động trên tiền.
0.1 + 0.2 === 0.30000000000000004trong mọi ngôn ngữ IEEE 754, không chỉ JavaScript. Lưu trữ tiền tệ dưới dạng đơn vị nhỏ hơn số nguyên (xu) hoặc sử dụng thư viện thập phân nhưdecimal.js. Định dạng che giấu lỗi, nó không sửa lỗi. - Phân tích cú pháp ngây thơ chuỗi locale.
parseFloat("1,234.56")trả về1, không phải1234.56.parseFloat("1.234,56")trả về1.234. Để phân tích cú pháp một số được định dạng locale, hãy xóa dấu phân cách nhóm sau đó thay thế dấu thập phân, lý tưởng được điều khiển bởiIntl.NumberFormat(locale).formatToParts(). - Mất độ chính xác trên số nguyên lớn. Số nguyên trên
2⁵³ − 1 = 9 007 199 254 740 991âm thầm mất độ chính xác khi được lưu trữ dưới dạngnumber. ID Twitter, ID Stripe, hash giao dịch blockchain đều vượt quá điều này. Nhận chúng dưới dạng chuỗi hoặc sử dụngBigInt;Intl.NumberFormatchấp nhận BigInt một cách tự nhiên. - Đơn vị nhỏ hơn theo phong cách Stripe. Stripe gửi
amount: 499cho $4.99. Chia cho 100 (hoặc cho số đơn vị nhỏ hơn ISO 4217 cho tiền tệ) trước khi định dạng. JPY, KRW, VND, ISK, HUF sử dụng 0 đơn vị nhỏ hơn, không cần chia. - Đầu vào phần trăm là một phân số.
new Intl.NumberFormat('en', {style: 'percent'}).format(0.5)trả về50%, không phải0.5%. Nhân giá trị được lưu trữ của bạn với 0,01 trước khi định dạng nếu bạn đã lưu trữ nó dưới dạng phần trăm. - Xây dựng NumberFormat trong vòng lặp nóng. Mỗi lệnh gọi hàm tạo tải dữ liệu locale ICU. Sử dụng lại một instance duy nhất giữa các lệnh gọi: 1M định dạng với instance được lưu trong bộ nhớ cache mất ~60ms trong V8, ~3s nếu bạn xây dựng mới mỗi lần.
- JPY với hai chữ số thập phân.
¥1000.00có vẻ sai vì JPY có 0 đơn vị nhỏ hơn. ĐặtminimumFractionDigits: 0, maximumFractionDigits: 0cho JPY, KRW, VND, ISK, HUF, CLP.
Các câu hỏi thường gặp hơn
Tại sao 0,1 + 0,2 không bằng 0,3?
Bởi vì các số float nhị phân IEEE 754 không thể lưu trữ chính xác phân số thập phân 0,1, theo cách tương tự rằng cơ số 10 không thể lưu trữ chính xác 1/3. Double 64 bit gần nhất với 0,1 là khoảng 0,1000000000000000055511151231257827021181583404541015625. Cộng hai xấp xỉ như vậy tạo ra một kết quả làm tròn thành 0,30000000000000004 thay vì 0,3. Mỗi ngôn ngữ IEEE 754 đều có hành vi này: Java, Python, C++, Swift, tất cả. Đối với số học thập phân chính xác, hãy sử dụng xu số nguyên hoặc thư viện như decimal.js / Decimal của Python / BigDecimal của Java.
Sự khác biệt giữa Intl.NumberFormat và toLocaleString là gì?
Cùng động cơ, công thái học khác nhau. (1234.5).toLocaleString('de-DE', {style: 'currency', currency: 'EUR'}) và new Intl.NumberFormat('de-DE', {style: 'currency', currency: 'EUR'}).format(1234.5) tạo ra đầu ra giống hệt nhau. Sự khác biệt: Intl.NumberFormat có thể tái sử dụng, vì vậy nếu bạn định dạng nhiều số với các tùy chọn giống nhau, hãy khởi tạo một lần và lưu vào bộ nhớ cache. toLocaleString đọc các tùy chọn hàm tạo mỗi lần gọi và chậm hơn đáng kể trong các vòng lặp chặt chẽ.
Hệ thống đánh số của Ấn Độ hoạt động như thế nào?
Tiếng Anh Ấn Độ và tiếng Hindi nhóm các chữ số theo mẫu 2-2-3 thay vì 3-3-3: ba chữ số ngoài cùng bên phải, sau đó là các nhóm hai. 100.000 được viết là 1,00,000 và được gọi là một lakh (10⁵). 10.000.000 được viết là 1,00,00,000 và được gọi là một crore (10⁷). Intl.NumberFormat('en-IN').format(12345678) trả về 1,23,45,678. Hệ thống mở rộng đến arab (10⁹) và kharab (10¹¹) mặc dù chúng hiếm trong sử dụng hiện đại.
Công cụ này có thể xử lý số lớn đến mức nào?
Lên đến Number.MAX_SAFE_INTEGER = 2⁵³ − 1 = 9.007.199.254.740.991, bất kỳ số nguyên nào cũng sống sót qua chuyến đi khứ hồi một cách chính xác. Vượt quá đó, độ chính xác bắt đầu rò rỉ. JSON.parse("9007199254740993") trả về 9007199254740992, double có thể biểu diễn gần nhất. Đối với các giá trị lớn hơn, dán chúng dưới dạng các literal BigInt (với một n ở cuối) hoặc coi chúng như chuỗi. Bộ định dạng chấp nhận cả hai.
Số của tôi có được gửi đi đâu không?
Không. Intl.NumberFormat và dữ liệu locale được vận chuyển cùng với trình duyệt của bạn; toàn bộ pipeline chạy cục bộ. Mở tab Mạng trong DevTools và định dạng một số, bạn sẽ thấy không có yêu cầu đi ra nào. An toàn cho tiền lương, doanh thu, số dư tài khoản, hoặc bất kỳ dữ liệu nào bạn sẽ không dán vào dịch vụ được lưu trữ.