Làm cách nào để định dạng số bằng cách thêm 0 đến một chữ số?


Câu trả lời:


594

Phương pháp tốt nhất tôi tìm thấy là một cái gì đó như sau:

(Lưu ý rằng phiên bản đơn giản này chỉ hoạt động cho các số nguyên dương)

var myNumber = 7;
var formattedNumber = ("0" + myNumber).slice(-2);
console.log(formattedNumber);

Đối với số thập phân, bạn có thể sử dụng mã này (mặc dù nó hơi cẩu thả).

var myNumber = 7.5;
var dec = myNumber - Math.floor(myNumber);
myNumber = myNumber - dec;
var formattedNumber = ("0" + myNumber).slice(-2) + dec.toString().substr(1);
console.log(formattedNumber);

Cuối cùng, nếu bạn phải đối phó với khả năng của số âm, tốt nhất là lưu trữ dấu hiệu, áp dụng định dạng cho giá trị tuyệt đối của số đó và áp dụng lại dấu hiệu sau thực tế. Lưu ý rằng phương pháp này không giới hạn số lượng thành 2 chữ số. Thay vào đó, nó chỉ giới hạn số ở bên trái của số thập phân (phần nguyên). (Dòng xác định dấu hiệu đã được tìm thấy ở đây ).

var myNumber = -7.2345;
var sign = myNumber?myNumber<0?-1:1:0;
myNumber = myNumber * sign + ''; // poor man's absolute value
var dec = myNumber.match(/\.\d+$/);
var int = myNumber.match(/^[^\.]+/);

var formattedNumber = (sign < 0 ? '-' : '') + ("0" + int).slice(-2) + (dec !== null ? dec : '');
console.log(formattedNumber);


4
@KeithPower bản demo đó không minh họa điều này
Joseph Marikle

1
@KeithPower Đây là bản demo minh họa phương pháp trên: jsfiddle.net/bkTX3 . Nhấp vào hộp, thay đổi giá trị và nhấp vào hộp để xem nó hoạt động.
Joseph Marikle

1
@Joseph .75 được chuyển đổi trong 75.
Giành

@ Thông thường, loại điều đó là không cần thiết với hình thức định dạng này theo kinh nghiệm của tôi, nhưng tôi đã đưa ra một chỉnh sửa bao gồm kịch bản đó.
Joseph Marikle

Ngoài ra, hãy xem .toPrecision()phương pháp w3schools.com/jsref/jsref_toprecision.asp
Oleg

133

Nếu số cao hơn 9, chuyển đổi số thành chuỗi (tính nhất quán). Nếu không, thêm một số không.

function n(n){
    return n > 9 ? "" + n: "0" + n;
}

n( 9); //Returns "09"
n(10); //Returns "10"
n(999);//Returns "999"

4
những gì về thời gian tiêu cực mặc dù. 0-1: 20: 00
mjwrazor

131

Sử dụng phương thức toLocaleString () với bất kỳ số nào. Vì vậy, đối với số 6, như được thấy dưới đây, bạn có thể nhận được kết quả mong muốn.

(6).toLocaleString('en-US', {minimumIntegerDigits: 2, useGrouping:false})

Sẽ tạo chuỗi '06'.


17
Điều này chắc chắn là tốt hơn so với cắt dây bằng tay. Ngắn gọn hơn và nếu trang của bạn có thể được sử dụng bên ngoài Hoa Kỳ, bạn có thể muốn điều chỉnh điều này thành:(6).toLocaleString(undefined, {minimumIntegerDigits: 2})
Đánh dấu Slater

2
Sử dụng điều này với IE 9 sẽ tạo ra 6,00 thay vì 06.
Drew

1
Hoạt động, nhưng bạn cần IE> = 11.
Saftpresse99

hoặc với polyfil intl.js
maxisam

2
Tôi sẵn sàng bỏ qua IE, nhưng nó không được hỗ trợ tốt trong các trình duyệt di động. src: developer.mozilla.org/en/docs/Web/JavaScript/Reference/
Kẻ

50

Đây là một chức năng đệm số đơn giản mà tôi thường sử dụng. Nó cho phép bất kỳ số lượng đệm.

function leftPad(number, targetLength) {
    var output = number + '';
    while (output.length < targetLength) {
        output = '0' + output;
    }
    return output;
}

Ví dụ:

leftPad(1, 2) // 01
leftPad(10, 2) // 10
leftPad(100, 2) // 100
leftPad(1, 3) // 001
leftPad(1, 8) // 00000001

cũng có vấn đề với thời gian tiêu cực. có cách sửa nào cho nó không?
mjwrazor

39

Trong tất cả các trình duyệt hiện đại, bạn có thể sử dụng

numberStr.padStart(2, "0");

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

function zeroPad(numberStr) {
  return numberStr.padStart(2, "0");
}

var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

numbers.forEach(
  function(num) {
    var numString = num.toString();
    
    var paddedNum = zeroPad(numString);

    console.log(paddedNum);
  }
);


1
Xin lưu ý rằng điều này không được hỗ trợ trong IE tại tất cả nhà phát
Tim

Ngoài ra, nó không hoạt động trong một số phiên bản cũ hơn của nút (có thể là bất cứ thứ gì cũ hơn nút 8)
JSilv

20

Câu trả lời của @ Lifehack rất hữu ích với tôi; nơi tôi nghĩ rằng chúng ta có thể làm điều đó trong một dòng cho các số dương

 String(input).padStart(2, '0');

12
("0" + (date.getMonth() + 1)).slice(-2);
("0" + (date.getDay())).slice(-2);

1
Tôi nghĩ bạn có nghĩa là sau đây để có được ngày trong tháng:("0" + (date.getDate())).slice(-2);
Jeff Moeller

11

Bạn có thể làm:

function pad2(number) {
   return (number < 10 ? '0' : '') + number
}

Thí dụ:

document.write(pad2(0) + '<br />');
document.write(pad2(1) + '<br />');
document.write(pad2(2) + '<br />');
document.write(pad2(10) + '<br />');
document.write(pad2(15) + '<br />');

Kết quả:

00
01
02
10
15

8

Có vẻ như bạn có thể có một chuỗi, thay vì một số. dùng cái này:

var num = document.getElementById('input').value,
    replacement = num.replace(/^(\d)$/, '0$1');
document.getElementById('input').value = replacement;

Đây là một ví dụ: http://jsfiddle.net/xtgFp/


7

Nhanh chóng và bẩn một lót ....

function zpad(n, len) {
  return 0..toFixed(len).slice(2,-n.toString().length)+n.toString();
}

1
Công việc tuyệt vời. Tốt hơn hết là sử dụng phương thức này như một phương thức mở rộng như thế này:Number.prototype.leftPad = String.prototype.leftPad = function (pad) { return 0..toFixed(pad).slice(2, -this.toString().length) + this.toString(); };
ConductedClever

6

Điều này là đơn giản và hoạt động khá tốt:

function twoDigit(number) {
  var twodigit = number >= 10 ? number : "0"+number.toString();
  return twodigit;
}

1
có thể được viết là: số trả về> = 10? số: "0" + số.toString ();
apfz 3/2/2015

6

Đây là một giải pháp rất đơn giản mà làm việc tốt cho tôi.

Đầu tiên khai báo một biến để giữ số của bạn.

var number;

Bây giờ chuyển đổi số thành một chuỗi và giữ nó trong một biến khác;

var numberStr = number.toString();

Bây giờ bạn có thể kiểm tra độ dài của chuỗi này, nếu nó nhỏ hơn mong muốn, bạn có thể nối thêm "không" vào lúc đầu.

if(numberStr.length < 2){
      number = '0' + number;
}

Bây giờ sử dụng số như mong muốn

console.log(number);

6

Đây là giải pháp đơn giản nhất tôi tìm thấy: -

let num = 9; // any number between 0 & 99
let result = ( '0' + num ).substr( -2 );

5

Phiên bản cải tiến của câu trả lời trước

function atLeast2Digit(n){
    n = parseInt(n); //ex. if already passed '05' it will be converted to number 5
    var ret = n > 9 ? "" + n: "0" + n;
    return ret;
}

alert(atLeast2Digit(5));


5

Tôi biết đây là một bài viết cổ, nhưng tôi muốn cung cấp tùy chọn giải pháp OO linh hoạt hơn.

Tôi đã ngoại suy câu trả lời được chấp nhận một chút và mở rộng Numberđối tượng javascript để cho phép đệm không điều chỉnh:

Number.prototype.zeroPad = function(digits) {
  var loop = digits;
  var zeros = "";
  while (loop) {
    zeros += "0";
    loop--;
  }
  return (this.toString().length > digits) ?
    this.toString() : (zeros + this).slice(-digits);
}
var v = 5;
console.log(v.zeroPad(2)); // returns "05"
console.log(v.zeroPad(4)); // returns "0005"

Chỉnh sửa: Thêm mã để ngăn việc cắt các số dài hơn các chữ số bạn yêu cầu.

LƯU Ý: Đây là lỗi thời trong tất cả trừ IE. Sử dụng padStart()thay thế.


4

Không có trình định dạng số tích hợp cho JavaScript, nhưng có một số thư viện thực hiện việc này:

  1. underscore.opes cung cấp một hàm sprintf (cùng với nhiều trình định dạng hữu ích khác)
  2. javascript-sprintf , mà underscore.opes mượn từ.

3

hoặc là

function zpad(n,l){
   return rep(l-n.toString().length, '0') + n.toString();
}

với

function rep(len, chr) { 
   return new Array(len+1).join(chr);
}

3

Nếu bạn muốn giới hạn các chữ số của mình cùng một lúc:

function pad2(number) {
  number = (number < 10 ? '0' : '') + number;
  number = number.substring(0,2);
  return number;
}

Điều này cũng sẽ cắt bất kỳ giá trị nào vượt quá hai chữ số. Tôi đã mở rộng điều này theo giải pháp của fanaur.


2
<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function(){
                $('#test').keypress(allowOnlyTwoPositiveDigts);
            });

            function allowOnlyTwoPositiveDigts(e){

                var test = /^[\-]?[0-9]{1,2}?$/
                return test.test(this.value+String.fromCharCode(e.which))
            }

        </script>
    </head>
    <body>
        <input id="test" type="text" />
    </body>
</html>

2

Đây là một giải pháp đệ quy đơn giản, hoạt động với mọi số chữ số.

function numToNDigitStr(num, n)
{
    if(num >=  Math.pow(10, n - 1)) { return num; }
    return "0" + numToNDigitStr(num, n-1);
}

2

Nếu bạn không có lodash trong dự án của mình, sẽ là quá mức cần thiết để thêm toàn bộ thư viện chỉ để sử dụng một chức năng. Đây là giải pháp tinh vi nhất cho vấn đề của bạn mà tôi từng thấy.

_.padStart(num, 2, '0')

1

Đây là phiên bản của tôi. Có thể dễ dàng thích nghi với các kịch bản khác.

function setNumericFormat(value) {
    var length = value.toString().length;
    if (length < 4) {
        var prefix = "";
        for (var i = 1; i <= 4 - length; i++) {
            prefix += "0";
        }
        return prefix + value.toString();
    }
    return  value.toString();
}

1
    function colorOf(r,g,b){
  var f = function (x) {
    return (x<16 ? '0' : '') + x.toString(16) 
  };

  return "#" +  f(r) + f(g) + f(b);
}

Bạn nên xem xét thêm một số bối cảnh, không chỉ mã cho câu trả lời của bạn.
Mike

1

Đối với bất cứ ai muốn có sự khác biệt về thời gian và có kết quả có thể lấy số âm ở đây là một điều tốt. pad (3) = "03", pad (-2) = "-02", pad (-234) = "-234"

pad = function(n){
  if(n >= 0){
    return n > 9 ? "" + n : "0" + n;
  }else{
    return n < -9 ? "" + n : "-0" + Math.abs(n);
  }
}

1

Với chức năng này, bạn có thể in với bất kỳ n chữ số nào bạn muốn

function frmtDigit(num, n) {
    isMinus = num < 0;
    if (isMinus)
        num *= -1;
    digit = '';
    if (typeof n == 'undefined')
        n = 2;//two digits
    for (i = 1; i < n; i++) {
        if (num < (1 + Array(i + 1).join("0")))
            digit += '0';
    }
    digit = (isMinus ? '-' : '') + digit + num;
    return digit;
};

1

ví dụ của tôi sẽ là :

<div id="showTime"></div>

    function x() {
    var showTime = document.getElementById("showTime");
    var myTime = new Date();
    var hour = myTime.getHours();
    var minu = myTime.getMinutes();
    var secs = myTime.getSeconds();
    if (hour < 10) {
        hour = "0" + hour
    };
    if (minu < 10) {
        minu = "0" + minu
    };
    if (secs < 10) {
        secs = "0" + secs
    };

    showTime.innerHTML = hour + ":" + minu + ":" + secs;
}

setInterval("x()", 1000)

1

`${number}`.replace(/^(\d)$/, '0$1');

Regex là tốt nhất.


Điều này dường như gần giống hệt như câu trả lời của Joe ở trên. Vui lòng xem xét thêm thông tin bổ sung để cải thiện câu trả lời của bạn hoặc xóa nó hoàn toàn.
Ethan

1

AS kiểu dữ liệu trong Javascript được xác định một cách linh hoạt, nó xử lý 04 là 4 Sử dụng câu lệnh có điều kiện nếu giá trị nhỏ hơn 10 rồi thêm 0 trước nó bằng cách tạo chuỗi E.g,

var x=4;
  x = x<10?"0"+x:x
 console.log(x); // 04

1

Tôi đã xây dựng một chức năng định dạng khá đơn giản mà tôi gọi bất cứ khi nào tôi cần một ngày đơn giản được định dạng. Nó xử lý định dạng các chữ số đơn thành hai chữ số khi chúng nhỏ hơn 10. Nó khởi động một ngày được định dạng làSat Sep 29 2018 - 00:05:44

Hàm này được sử dụng như một phần của biến utils nên được gọi là:

let timestamp = utils._dateFormatter('your date string');

var utils = {
  _dateFormatter: function(dateString) {
    let d = new Date(dateString);
    let hours = d.getHours();
    let minutes = d.getMinutes();
    let seconds = d.getSeconds();
    d = d.toDateString();
    if (hours < 10) {
      hours = '0' + hours;
    }
    if (minutes < 10) {
      minutes = '0' + minutes;
    }
    if (seconds < 10) {
      seconds = '0' + seconds;
    }
    let formattedDate = d + ' - ' + hours + ':' + minutes + ':' + seconds;
    return formattedDate;
  }
}

1

Đã cập nhật cho các chức năng mũi tên ES6 (Được hỗ trợ trong hầu hết các trình duyệt hiện đại, xem CanIUse )

const formatNumber = n => ("0" + n).slice(-2);
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.