Як відформатувати числа, попередньо додавши 0 до одноцифрових чисел?


296

Я хочу відформатувати число, щоб мати дві цифри. Проблема виникає, коли 0- 9передається, тому мені потрібно, щоб вона була відформатована до 00- 09.

Чи є формат чисел у JavaScript?


Відповіді:


594

Найкращий метод, який я знайшов, - це щось на зразок наступного:

(Зверніть увагу, що ця проста версія працює лише для натуральних чисел)

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

Для десяткових знаків ви можете використовувати цей код (хоча він трохи неохайний).

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

Нарешті, якщо вам доводиться стикатися з можливістю від’ємних чисел, найкраще зберігати знак, застосовувати форматування до абсолютного значення числа та повторно застосовувати знак після факту. Зауважте, що цей метод не обмежує число двома цифрами. Натомість він обмежує лише число зліва від десяткової (ціла частина). (Лінія , яка визначає знак був знайдений тут ).

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, що демонстрація цього не демонструє
Джозеф Марікле

1
@KeithPower Ось демонстраційна версія, яка ілюструє вищевказаний метод: jsfiddle.net/bkTX3 . Клацніть на полі, змініть значення та натисніть на поле, щоб побачити його в дії.
Йосиф Марікле

1
@Joseph .75 перетворюється в 75.
Galled

@ Як правило, подібні речі не потрібні з такою формою форматування в моєму досвіді, але я створив редагування, яке б охоплювало цей сценарій.
Джозеф Марікле

Також подивіться на .toPrecision()метод w3schools.com/jsref/jsref_toprecision.asp
Олег

133

Якщо число вище 9, перетворіть число в рядок (консистенція). В іншому випадку додайте нуль.

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

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

4
як щодо негативного часу, хоча 0-1: 20: 00
mjwrazor

131

Використовуйте метод toLocaleString () у будь-якій кількості. Тож для числа 6, як видно нижче, можна отримати бажані результати.

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

Згенерує рядок '06'.


17
Це, безумовно, краще, ніж рубати струни вручну. Коротше, і якщо ваша сторінка може використовуватися за межами США, ви можете налаштувати це на:(6).toLocaleString(undefined, {minimumIntegerDigits: 2})
Позначити Слейтер

2
Використовуючи це за допомогою IE 9, створюється 6.00 замість 06.
Дрю

1
Працює, але вам потрібно IE> = 11.
Saftpresse99

або з intl.js polyfil
maxisam

2
Я все готовий до ігнорування IE, але він недостатньо добре підтримується в мобільних браузерах. src: developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
chetan92

50

Ось проста функція прокладки номерів, яку я зазвичай використовую. Він дозволяє проводити будь-яку кількість прокладки.

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

Приклади:

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

також є проблеми з негативним часом. Чи є виправлення на це?
mjwrazor

39

У всіх сучасних браузерах ви можете користуватися

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
Будьте в курсі, що це не підтримується в IE на всіх developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Тим

Крім того, він не працює в деяких старих версіях вузла (можливо, що-небудь старше, ніж вузол 8)
JSilv

20

@ Відповідь Lifehack була дуже корисною для мене; де я думаю, що ми можемо це зробити в одному рядку для позитивних чисел

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

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

1
Я думаю, ти мав на увазі наступне, щоб отримати день місяця:("0" + (date.getDate())).slice(-2);
Джефф Моллер

11

Ви можете зробити:

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

Приклад:

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 />');

Результат:

00
01
02
10
15

8

Здається, у вас може бути рядок замість числа. використовуй це:

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

Ось приклад: http://jsfiddle.net/xtgFp/


7

Швидкий і брудний один лайнер ....

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

1
Відмінна робота. Краще використовувати це в якості методу розширення , як це:Number.prototype.leftPad = String.prototype.leftPad = function (pad) { return 0..toFixed(pad).slice(2, -this.toString().length) + this.toString(); };
ConductedClever

6

Це просто і працює досить добре:

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

1
можна записати так: номер повернення> = 10? номер: "0" + число.toString ();
apfz

6

Ось дуже просте рішення, яке добре спрацювало для мене.

Спочатку оголосіть змінну для зберігання вашого номера.

var number;

Тепер перетворіть число в рядок і потримайте його в іншій змінній;

var numberStr = number.toString();

Тепер ви можете перевірити довжину цього рядка, якщо він менший від бажаного, ви можете додати "нуль" на початку.

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

Тепер використовуйте число за бажанням

console.log(number);

6

Ось найпростіше рішення, яке я знайшов: -

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

5

Удосконалена версія попередньої відповіді

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

Я знаю, що це давня публікація, але я хотів запропонувати більш гнучку та OO варіант рішення.

Я трохи екстраполював прийняту відповідь і розширив Numberоб’єкт javascript, щоб дозволити регульовані нульові прокладки:

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"

Редагувати: Додайте код, щоб запобігти обрізанню чисел, довших за запитувані цифри.

ПРИМІТКА. Це застаріло у всіх, крім IE. Використовуйте padStart()замість цього.



3

або

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

з

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

3

Якщо ви хочете одночасно обмежити свої цифри:

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

Це також може нарізати будь-яке значення, яке перевищує дві цифри. Я продовжую це щодо рішення фанаура.


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

Ось просте рекурсивне рішення, яке працює для будь-якої кількості цифр.

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

2

Якщо у вашому проекті немає лодашу, буде надлишком додати всю бібліотеку лише для використання однієї функції. Це найскладніше рішення вашої проблеми, що я коли-небудь бачив.

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

1

Ось моя версія. Може легко адаптуватися до інших сценаріїв.

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

Вам слід розглянути можливість додавання контексту, а не просто коду до ваших відповідей.
Майк

1

Для тих, хто хоче мати часові відмінності та мати результати, які можуть приймати негативні цифри, тут є хорошим. 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

за допомогою цієї функції ви можете друкувати будь-які 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

мій приклад :

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

Регекс - найкращий.


Схоже, це майже те саме , що відповідь Джо вище. Просимо додати додаткову інформацію, щоб поліпшити свою відповідь, або видалити її повністю.
Етан

1

Як тип даних у Javascript визначається динамічно, він розглядає 04 як 4 Використовуйте умовне твердження, якщо значення менше 10, а потім додайте 0 до нього, зробивши його рядком E.g,

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

1

Я створив досить просту функцію форматування, яку дзвоню, коли мені потрібна проста форматування дати. Він стосується форматування одноцифрових та двозначних цифр, коли їх менше 10. У ньому починається дата, відформатована якSat Sep 29 2018 - 00:05:44

Ця функція використовується як частина змінної утиліти, тому вона називається так:

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

Оновлено для функцій стрілок ES6 (підтримується майже у всіх сучасних браузерах, див. CanIUse )

const formatNumber = n => ("0" + n).slice(-2);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.