2012-03-28 43 views
16

Tôi có một số thập lục phân trong javascript. Đối với mục đích hiển thị, tôi muốn để định dạng chuỗi như:Định dạng số thập lục phân trong Javascript

ffffffff-ffff-ffff 
00000000-0000-01ff 

(8 chữ số) - (4 chữ số) - (4 chữ số) với số không đệm trên mặt trận

Tôi đã cố gắng để viết vòng lặp của riêng tôi để định dạng một số thập lục phân tùy ý thành định dạng này, nhưng điều này có vẻ giống như một cái gì đó mà nên có sẵn trong javascript rồi. Có cách tích hợp để định dạng một số thập lục phân trong javascript không?

Cảm ơn!

+0

Có thật không may là không có cách nào để định dạng số thập lục phân như trong JavaScript. Nhưng hãy xem [liên kết này] (http://josscrowcroft.github.com/accounting.js/), có thể nó sẽ giúp ích cho bạn. – Neq

Trả lời

43

tôi sẽ làm một quá trình hai bước:

1) chuyển đổi số đến 16 chữ số hex với số không hàng đầu:

var i = 12345; // your number 
var h = ("000000000000000" + i.toString(16)).substr(-16); 

2) thêm dấu gạch ngang

var result = h.substr(0, 8)+'-'+h.substr(8,4)+'-'+h.substr(12,4); 
+0

+1 Hoạt động khá độc đáo: http://jsfiddle.net/jmKYB/ – mellamokb

0

tôi không nghĩ rằng có bất cứ điều gì liên quan đến rằng trong javascript tinh khiết, nhưng khuôn khổ cung cấp phương pháp này, trong ExtJS 3 nó được thực hiện theo cách này

/** 
    * Pads the left side of a string with a specified character. This is especially useful 
    * for normalizing number and date strings. Example usage: 
    * <pre><code> 
var s = String.leftPad('123', 5, '0'); 
// s now contains the string: '00123' 
    * </code></pre> 
    * @param {String} string The original string 
    * @param {Number} size The total length of the output string 
    * @param {String} char (optional) The character with which to pad the original string (defaults to empty string " ") 
    * @return {String} The padded string 
    * @static 
    */ 
    leftPad : function (val, size, ch) { 
     var result = String(val); 
     if(!ch) { 
      ch = " "; 
     } 
     while (result.length < size) { 
      result = ch + result; 
     } 
     return result; 
    } 
+0

Đây chỉ là một chức năng đệm, những gì về định dạng hex và dấu gạch ngang? – maerics

12

Tiếp tục câu trả lời knabar của:

Nếu số của bạn thực sự là một đầy đủ 64 bit mỏi bạn nên biết rằng javascript đã chỉ tăng gấp đôi, mà đầu ra vào khoảng 53 bit chính xác. Ví dụ.

var i = 0x89abcdef; // a 64-bit constant 
var h = ("000000000000000" + i.toString(16)).substr(-16); // "89abcdef" 

Vì vậy, bạn có thể muốn chia thành hai số 32 bit và định dạng chúng thành 8 chữ số cùng một lúc. Sau đó, cảnh báo thứ hai xảy ra: javascript thực hiện các thay đổi bit trên đã ký số nguyên 32 bit và mã định dạng này không thể xử lý số âm.

var i = 0xffd2 << 16; // actually negative 
var h = ("0000000" + i.toString(16)).substr(-8); // "0-2e0000" 

Vì nó là khá khả năng là số mà bạn muốn định dạng theo hệ thập lục phân là kết quả của thao tác trên bit, mã có thể được tinh chỉnh để in trong bổ sung hai thay vì:

var i = 0xffd2 << 16; // actually negative 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffd20000" 

này tạo ra các đại diện hex của 32 bit dưới cùng của phần không thể tách rời của số dương và số âm bất kỳ. Đây có lẽ là những gì bạn muốn (khoảng printf("%08x")). Một số trường hợp góc khác:

var i = 1.5; // non-integers are rounded 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000001" 

var i = -1.5; // rounding is towards zero 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffffffff" 

var i = NaN; // not actually a number 
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000000" 
0

Tôi giả định số đã ở dạng chuỗi do các giới hạn được mô tả trong câu trả lời của hexwab. Nếu không, hãy bắt đầu quá trình bằng cách nhập nó vào một chuỗi hex có độ dài tùy ý (được gọi là str) bằng cách sử dụng bất kỳ cơ chế nào phù hợp với hoàn cảnh của bạn. Sau đó:

(Array(16).join(0) + str).slice(-16).replace(/^.{8}|.{4}(?!$)/g,"$&-"); 
6

ES6 Version

function toPaddedHexString(num, len) { 
    str = num.toString(16); 
    return "0".repeat(len - str.length) + str; 
} 

var hexStr = toPaddedHexString(12345, 16); 
Các vấn đề liên quan