Как я могу заполнить значение с ведущими нулями?
каков рекомендуемый способ обнуления значения в JavaScript? Я предполагаю, что могу построить пользовательскую функцию для заполнения нулей на типизированное значение, но мне интересно, есть ли более прямой способ сделать это?
Примечание: под " zerofilled "я подразумеваю его в смысле базы данных слова (где 6-значное нулевое представление числа 5 будет"000005").
30 ответов:
Примечание Для читателей!
как отметили комментаторы, это решение является "умным", и как умные решения часто бывают, это память интенсивная и относительно медленный. Если производительность является проблемой для вас, не используйте это решение!
потенциально устаревшей: ECMAScript 2017 включает строку.прототип.падстарт и количество.прототип.toLocaleString is там начиная с ECMAScript 3.1. Пример:
var n=-0.1; n.toLocaleString('en', {minimumIntegerDigits:4,minimumFractionDigits:2,useGrouping:false})...будет выводить "-0000.10".
// or const padded = (.1+"").padStart(6,"0"); `-${padded}`...будет выводить "-0000.1".
простая функция-это все, что вам нужно
function zeroFill( number, width ) { width -= number.toString().length; if ( width > 0 ) { return new Array( width + (/\./.test( number ) ? 2 : 1) ).join( '0' ) + number; } return number + ""; // always return a string }вы можете испечь это в библиотеке, если вы хотите сохранить пространство имен или что-то еще. Как с расширение jQuery.
простой способ. Вы можете добавить строковое умножение для пэда и превратить его в функцию.
var pad = "000000"; var n = '5'; var result = (pad+n).slice(-pad.length);как функция,
function paddy(num, padlen, padchar) { var pad_char = typeof padchar !== 'undefined' ? padchar : '0'; var pad = new Array(1 + padlen).join(pad_char); return (pad + num).slice(-pad.length); } var fu = paddy(14, 5); // 00014 var bar = paddy(2, 4, '#'); // ###2
Я не могу поверить, что все сложные ответы здесь... Просто используйте это:
var zerofilled = ('0000'+n).slice(-4);
Я на самом деле должен был придумать что-то вроде этого недавно. Я решил, что должен быть способ сделать это без использования петель.
вот что я придумал.
function zeroPad(num, numZeros) { var n = Math.abs(num); var zeros = Math.max(0, numZeros - Math.floor(n).toString().length ); var zeroString = Math.pow(10,zeros).toString().substr(1); if( num < 0 ) { zeroString = '-' + zeroString; } return zeroString+n; }тогда просто используйте его, предоставляя число до нуля pad:
> zeroPad(50,4); "0050"если число больше, чем заполнение, число будет расширяться за пределы заполнения:
> zeroPad(51234, 3); "51234"десятичные тоже хорошо!
> zeroPad(51.1234, 4); "0051.1234"если вы не против загрязнения глобального пространства имен вы можно добавить его в число непосредственно:
Number.prototype.leftZeroPad = function(numZeros) { var n = Math.abs(this); var zeros = Math.max(0, numZeros - Math.floor(n).toString().length ); var zeroString = Math.pow(10,zeros).toString().substr(1); if( this < 0 ) { zeroString = '-' + zeroString; } return zeroString+n; }и если вы предпочитаете, чтобы десятичные числа занимали место в дополнении:
Number.prototype.leftZeroPad = function(numZeros) { var n = Math.abs(this); var zeros = Math.max(0, numZeros - n.toString().length ); var zeroString = Math.pow(10,zeros).toString().substr(1); if( this < 0 ) { zeroString = '-' + zeroString; } return zeroString+n; }Ура!
XDR придумал логарифмическая вариация это, кажется, работает лучше.
предупреждение: эта функция не работает, если num равно нулю(например, zeropad (0, 2))
function zeroPad (num, numZeros) { var an = Math.abs (num); var digitCount = 1 + Math.floor (Math.log (an) / Math.LN10); if (digitCount >= numZeros) { return num; } var zeroString = Math.pow (10, numZeros - digitCount).toString ().substr (1); return num < 0 ? '-' + zeroString + an : zeroString + an; }
говоря о производительности, tomsmeding сравнил 3 лучших ответа (4 с изменением журнала). Угадайте, какой из них в основном превзошли две другие? :)
вот что я использовал для заполнения числа до 7 символов.
("0000000" + number).slice(-7)этот подход, вероятно, достаточно для большинства людей.
Edit: если вы хотите сделать его более общим, вы можете сделать это:
("0".repeat(padding) + number).slice(-padding)
к сожалению, есть много ненужных сложных предложений для этой проблемы, обычно связанных с написанием собственной функции для выполнения математических или строковых манипуляций или вызова сторонней утилиты. Однако существует стандартный способ сделать это в базовой библиотеке JavaScript только с одной строкой кода. Возможно, стоит обернуть эту строку кода в функцию, чтобы избежать необходимости указывать параметры, которые вы никогда не хотите изменять, например локальное имя или стиль.
var amount = 5; var text = amount.toLocaleString('en-US', { style: 'decimal', minimumIntegerDigits: 3, useGrouping: false });это приведет к значению " 005 " для текста. Вы также можете использовать функцию toLocaleString числа для заполнения нулей в правой части десятичной точки.
var amount = 5; var text = amount.toLocaleString('en-US', { style: 'decimal', minimumFractionDigits: 2, useGrouping: false });это приведет к значению" 5.00 " для текста. Измените useGrouping на true, чтобы использовать разделители запятых для тысяч.
обратите внимание, что с помощью
toLocaleString()Сlocalesиoptionsаргументы - это стандартизированный по отдельности в ECMA-402, не в ECMAScript. Как сегодня, некоторые браузеры только реализовать базовую поддержку, т. е.toLocaleString()может игнорировать любые аргументы.
если заранее известно, что номер заполнения не превышает определенного значения, есть другой способ сделать это без циклов:
var fillZeroes = "00000000000000000000"; // max number of zero fill ever asked for in global function zeroFill(number, width) { // make sure it's a string var input = number + ""; var prefix = ""; if (input.charAt(0) === '-') { prefix = "-"; input = input.slice(1); --width; } var fillAmt = Math.max(width - input.length, 0); return prefix + fillZeroes.slice(0, fillAmt) + input; }тестовые случаи здесь:http://jsfiddle.net/jfriend00/N87mZ/
быстрый и грязный способ:
y = (new Array(count + 1 - x.toString().length)).join('0') + x;для x = 5 и count = 6 у вас будет y = "000005"
в предложенном (Этап 3) методе ES2017
.padStart()теперь вы можете просто сделать (при реализации / поддержке):string.padStart(maxLength, "0"); //max length is the max string length, not max # of fills
вот быстрая функция, которую я придумал, чтобы сделать эту работу. Если у кого есть более простой подход, не стесняйтесь поделиться!
function zerofill(number, length) { // Setup var result = number.toString(); var pad = length - result.length; while(pad > 0) { result = '0' + result; pad--; } return result; }
поздно на вечеринку здесь, но я часто использую эту конструкцию для выполнения специального заполнения некоторого значения
n, известный как положительный, десятичный:(offset + n + '').substr(1);здесь
offsetв 10^^цифр.например, заполнение до 5 цифр, где n = 123:
(1e5 + 123 + '').substr(1); // => 00123шестнадцатеричная версия этого немного более подробна:
(0x100000 + 0x123).toString(16).substr(1); // => 00123Примечание 1: мне также нравится решение @profitehlolz, которое является Строковой версией этого, используя отличный отрицательный индекс slice () особенность.
Я действительно не знаю, почему, но никто не сделал это самым очевидным способом. Вот это моя реализация.
функция:
/** Pad a number with 0 on the left */ function zeroPad(number, digits) { var num = number+""; while(num.length < digits){ num='0'+num; } return num; }прототип:
Number.prototype.zeroPad=function(digits){ var num=this+""; while(num.length < digits){ num='0'+num; } return(num); };очень просто, я не вижу никакого способа, как это может быть проще. По какой-то причине я, кажется, много раз здесь так, люди просто пытаются избежать " Для " и "в то время как" петли любой ценой. Использование регулярного выражения, вероятно, будет стоить намного больше циклов для такого тривиального 8-значного заполнения.
Я использую этот снипет, чтобы получить 5-значное представление
(value+100000).toString().slice(-5) // "00123" with value=123
сила математики!
x = целое число в pad
y = количество нулей в колодкеfunction zeroPad(x, y) { y = Math.max(y-1,0); var n = (x / Math.pow(10,y)).toFixed(y); return n.replace('.',''); }
первый параметр-любое вещественное число, второй параметр-положительное целое число, указывающее минимальное количество цифр слева от десятичной точки, а третий параметр-необязательное положительное целое число, указывающее число, если цифры справа от десятичной точки.
function zPad(n, l, r){ return(a=String(n).match(/(^-?)(\d*)\.?(\d*)/))?a[1]+(Array(l).join(0)+a[2]).slice(-Math.max(l,a[2].length))+('undefined'!==typeof r?(0<r?'.':'')+(a[3]+Array(r+1).join(0)).slice(0,r):a[3]?'.'+a[3]:''):0 }так
zPad(6, 2) === '06' zPad(-6, 2) === '-06' zPad(600.2, 2) === '600.2' zPad(-600, 2) === '-600' zPad(6.2, 3) === '006.2' zPad(-6.2, 3) === '-006.2' zPad(6.2, 3, 0) === '006' zPad(6, 2, 3) === '06.000' zPad(600.2, 2, 3) === '600.200' zPad(-600.1499, 2, 3) === '-600.149'
Не изобретайте велосипед, используйте подчеркивание строки:
var numToPad = '5'; alert(_.str.pad(numToPad, 6, '0')); // yields: '000005'
это решение ES6.
function pad(num, len) { return '0'.repeat(len - num.toString().length) + num; } alert(pad(1234,6));
после долгого, долгого времени тестирования 15 различных функций / методов, найденных в ответах на эти вопросы, я теперь знаю, что является лучшим (самым универсальным и быстрым).
я взял 15 функций / методов из ответов на этот вопрос и сделал скрипт для измерения времени, необходимого для выполнения 100 пэдов. Каждый Блокнот будет заполнять число
9С2000нули. Это может показаться чрезмерным, и это, но это дает вам хорошее представление о масштабировании функции.код, который я использовал, можно найти здесь: https://gist.github.com/NextToNothing/6325915
не стесняйтесь изменять и тестировать код самостоятельно.
для того, чтобы получить наиболее универсальный метод, вы должны использовать цикл. Это потому, что с очень большим количеством других, скорее всего, потерпят неудачу, в то время как, это будет успешным.
Итак, какой цикл использовать? Ну, это было бы
whileпетли. Аforцикл по-прежнему быстро, но awhileцикл просто немного быстрее (несколько МС) - и чище.ответы как
Wilco,Aleksandar ToplekилиVitim.usсделает работу отлично.лично я попробовал другой подход. Я попытался использовать рекурсивную функцию для заполнения строки / числа. Это сработало лучше, чем методы, соединяющие массив, но, тем не менее, не работало так быстро, как цикл for.
моя функция:
function pad(str, max, padder) { padder = typeof padder === "undefined" ? "0" : padder; return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str; }вы можете использовать мою функцию с или без, установка переменной заполнения. Вот так:
pad(1, 3); // Returns '001' // - Or - pad(1, 3, "x"); // Returns 'xx1'лично, после моих тестов, я бы использовал метод с циклом while, как
Aleksandar ToplekилиVitim.us. Однако я бы немного изменил его, чтобы вы могли установить строку заполнения.Итак, я бы использовал этот код:
function padLeft(str, len, pad) { pad = typeof pad === "undefined" ? "0" : pad + ""; str = str + ""; while(str.length < len) { str = pad + str; } return str; } // Usage padLeft(1, 3); // Returns '001' // - Or - padLeft(1, 3, "x"); // Returns 'xx1'вы также можете использовать его в качестве функции-прототипа, используя этот код:
Number.prototype.padLeft = function(len, pad) { pad = typeof pad === "undefined" ? "0" : pad + ""; var str = this + ""; while(str.length < len) { str = pad + str; } return str; } // Usage var num = 1; num.padLeft(3); // Returns '001' // - Or - num.padLeft(3, "x"); // Returns 'xx1'
ECMAScript 2017: используйте padStart или padEnd
'abc'.padStart(10); // " abc" 'abc'.padStart(10, "foo"); // "foofoofabc" 'abc'.padStart(6,"123465"); // "123abc"Подробнее:
Я не видел, чтобы кто-то указывал на то, что когда вы используете строку.прототип.substr () с отрицательным числом он считает справа.
одно линейное решение вопроса OP, 6-значное нулевое представление числа 5, является:
console.log(("00000000" + 5).substr(-6));обобщая, мы получим:
function pad(num, len) { return ("00000000" + num).substr(-len) }; console.log(pad(5, 6)); console.log(pad(45, 6)); console.log(pad(345, 6)); console.log(pad(2345, 6)); console.log(pad(12345, 6));
последний способ сделать это намного проще:
var number = 2 number.toLocaleString(undefined, {minimumIntegerDigits:2})
output: "02"
во всех современных браузерах, вы можете использовать
numberStr.padStart(numberLength, "0");function zeroFill(num, numLength) { var numberStr = num.toString(); return numberStr.padStart(numLength, "0"); } var numbers = [0, 1, 12, 123, 1234, 12345]; numbers.forEach( function(num) { var numString = num.toString(); var paddedNum = zeroFill(numString, 5); console.log(paddedNum); } );вот ссылка MDNhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
Это меньше родной, но может быть самым быстрым...
zeroPad = function (num, count) { var pad = (num + '').length - count; while(--pad > -1) { num = '0' + num; } return num; };
мое решение
Number.prototype.PadLeft = function (length, digit) { var str = '' + this; while (str.length < length) { str = (digit || '0') + str; } return str; };использование
var a = 567.25; a.PadLeft(10); // 0000567.25 var b = 567.25; b.PadLeft(20, '2'); // 22222222222222567.25
Не то, чтобы этот вопрос требует больше ответов, но я думал, что добавлю простую версию lodash этого.
_.padLeft(number, 6, '0')
просто другое решение, но я думаю, что это более читаемым.
function zeroFill(text, size) { while (text.length < size){ text = "0" + text; } return text; }
почему бы не использовать рекурсию?
function padZero(s, n) { s = s.toString(); // in case someone passes a number return s.length >= n ? s : padZero('0' + s, n); }
некоторые monkeypatching также работает
String.prototype.padLeft = function (n, c) { if (isNaN(n)) return null; c = c || "0"; return (new Array(n).join(c).substring(0, this.length-n)) + this; }; var paddedValue = "123".padLeft(6); // returns "000123" var otherPadded = "TEXT".padLeft(8, " "); // returns " TEXT"
function pad(toPad, padChar, length){ return (String(toPad).length < length) ? new Array(length - String(toPad).length + 1).join(padChar) + String(toPad) : toPad; }
pad(5, 0, 6)=000005
pad('10', 0, 2)=10 // don't pad if not necessary
pad('S', 'O', 2)=SO...так далее.
Ура
на простой, самое прямое решение, которое вы найдете.
function zerofill(number,length) { var output = number.toString(); while(output.length < length) { output = '0' + output; } return output; }
Comments