Каков рекомендуемый способ обнуления значения в JavaScript? Я полагаю, что мог бы создать пользовательскую функцию для добавления нулей к типизированному значению, но мне интересно, есть ли более прямой способ сделать это?
Примечание. Под «заполненным нулями» я подразумеваю это в смысле слова в базе данных (где 6-значное представление с нулевым заполнением числа 5 будет «000005»).
javascript
zerofill
Wilco
источник
источник
npm install sprintf-js
и требуйте его вsprintf('%0d6', 5);
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;}
... при условии, что онn
не отрицательныйwhile
тем, как получить к нему доступn.length
mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Ответы:
Простая функция - это все, что вам нужно
Вы могли бы запечь это в библиотеке, если вы хотите сохранить пространство имен или что-то еще. Как с расширением jQuery .
источник
Простой способ. Вы можете добавить умножение строк для пэда и превратить его в функцию.
Как функция,
источник
paddy (888, 2)
дает88
и не так,888
как требуется. Этот ответ также не обрабатывает отрицательные числа.Я не могу поверить, что все сложные ответы здесь ... Просто используйте это:
источник
Я действительно должен был придумать что-то подобное в последнее время. Я подумал, что должен быть способ сделать это без использования петель.
Это то, что я придумал.
Затем просто используйте его, предоставив число для нуля:
Если число больше, чем отступ, число будет выходить за пределы отступа:
Десятичные числа тоже хорошо!
Если вы не против загрязнения глобального пространства имен, вы можете добавить его в Number напрямую:
И если вы хотите, чтобы десятичные дроби занимали место в отступе:
Ура!
XDR придумал логарифмической вариации , что , кажется, лучше выполнить.
ВНИМАНИЕ : эта функция завершается ошибкой, если num равно нулю (например, zeropad (0, 2))
Говоря о производительности, Томсминг сравнил 3 верхних ответа ( 4 с вариацией журнала ). Угадайте , который один главно превосходит два других? :)
источник
numZeros
параметра, поскольку оно вводит в заблуждение. Это не количество нулей, которое вы хотите добавить, это минимальная длина, которой должно быть число. Лучшее имя будетnumLength
или дажеlength
.num
может быть ноль ...Вот то, что я использовал, чтобы дополнить число до 7 символов.
Такой подход, вероятно, будет достаточно для большинства людей.
Изменить: Если вы хотите сделать его более общим, вы можете сделать это:
Изменить 2: Обратите внимание, что начиная с ES2017 вы можете использовать
String.prototype.padStart
:источник
number = 123456789
, с кодом, приведенным выше, например.new String
. Вы можете просто использовать строковые литералы.(new Array(padding + 1).join("0")
можно заменить на"0".repeat(padding)
Современные браузеры теперь поддерживают
padStart
, вы можете просто сделать:Пример:
источник
К сожалению, существует множество ненужных сложных предложений для этой проблемы, обычно включающих написание собственной функции для выполнения математических или строковых операций или вызова сторонней утилиты. Тем не менее, есть стандартный способ сделать это в базовой библиотеке JavaScript с помощью только одной строки кода. Возможно, стоит обернуть эту строку кода в функцию, чтобы не указывать параметры, которые вы никогда не захотите изменить, например, локальное имя или стиль.
Это приведет к значению «005» для текста. Вы также можете использовать функцию toLocaleString для Number, чтобы заполнить нули справа от десятичной точки.
Это даст значение «5,00» для текста. Измените useGrouping на true, чтобы использовать запятые для тысяч.
Обратите внимание, что использование аргументов
toLocaleString()
withlocales
и стандартизировано отдельно в ECMA-402 , а не в ECMAScript. На сегодняшний день некоторые браузеры реализуют только базовую поддержку , то есть могут игнорировать любые аргументы.options
toLocaleString()
Полный пример
источник
Если заранее известно, что номер заполнения не превышает определенного значения, есть другой способ сделать это без циклов:
Тестовые случаи здесь: http://jsfiddle.net/jfriend00/N87mZ/
источник
-88
должен дать"-00088"
, например.zeroFill(-88, 5)
должно производить-00088
или-0088
? Я думаю, это зависит от того, хотите ли вы, чтобыwidth
аргумент был всей шириной числа или только количеством цифр (не считая отрицательного знака). Реализатор может легко переключить поведение, чтобы не включать отрицательный знак, просто удалив--width
строку кода.Быстрый и грязный способ:
Для x = 5 и count = 6 у вас будет y = "000005"
источник
y="0005"
с вышеизложенным,y = (new Array(count + 1 - x.toString().length)).join('0') + x;
это то , что дал мнеy="000005"
('0000'+n).slice(-4)
Вот быстрая функция, которую я придумал, чтобы сделать работу. Если у кого-то есть более простой подход, не стесняйтесь делиться!
источник
for
.vs.while
производительность не настолько отличается, чтобы быть интересной: jsperf.com/fors-vs-Здесь поздно вечером, но я часто использую эту конструкцию для произвольного заполнения некоторого значения
n
, известного как положительное, десятичное:Где
offset
10 ^^ цифр.Например, заполнение до 5 цифр, где n = 123:
Шестнадцатеричная версия этого немного более многословна:
Примечание 1: Мне также нравится решение @ profitehlolz, которое является строковой версией этого, используя изящную функцию отрицательного индекса slice ().
источник
Я действительно не знаю почему, но никто не сделал это самым очевидным способом. Вот моя реализация.
Функция:
Прототип:
Очень просто, я не могу понять, как это может быть проще. По какой-то причине я, кажется, много раз здесь на SO, люди просто стараются избегать циклов for и while любой ценой. Использование регулярных выражений, вероятно, будет стоить гораздо больше циклов для такого тривиального заполнения из 8 цифр.
источник
Я использую этот фрагмент, чтобы получить представление из 5 цифр
источник
ECMAScript 2017: используйте padStart или padEnd
Больше информации:
источник
Сила математики!
x = целое число для заполнения
y = количество нулей для заполнения
источник
Я не видел, чтобы кто-то указывал на тот факт, что когда вы используете String.prototype.substr () с отрицательным числом, это считается справа.
Единственное решение вопроса ОП, 6-значное представление числа 5 с нулевым заполнением:
Обобщая, мы получим:
источник
После долгого и долгого тестирования 15 различных функций / методов, найденных в ответах на эти вопросы, я теперь знаю, какой из них самый лучший (самый универсальный и быстрый).
Я взял 15 функций / методов из ответов на этот вопрос и сделал сценарий для измерения времени выполнения 100 пэдов. Каждая площадка будет подушечка числа
9
с2000
нулями. Это может показаться чрезмерным, и это так, но это дает вам хорошее представление о масштабировании функций.Код, который я использовал, можно найти здесь: https://gist.github.com/NextToNothing/6325915
Не стесняйтесь изменять и тестировать код самостоятельно.
Чтобы получить самый универсальный метод, вы должны использовать цикл. Это потому, что с очень большим количеством других, вероятно, потерпит неудачу, в то время как, это будет успешно.
Итак, какой цикл использовать? Ну, это было бы
while
петлей.for
Цикл по - прежнему быстро, ноwhile
петля чуть быстрее (несколько мс) - и чище.Ответы, как те
Wilco
,Aleksandar Toplek
илиVitim.us
сделают работу отлично.Лично я попробовал другой подход. Я пытался использовать рекурсивную функцию для заполнения строки / числа. Он работал лучше, чем методы, соединяющие массив, но, тем не менее, работал не так быстро, как цикл for.
Моя функция:
Вы можете использовать мою функцию с настройкой переменной padding или без нее. Ну вот так:
Лично после тестов я бы использовал метод с циклом while, например
Aleksandar Toplek
илиVitim.us
. Тем не менее, я бы немного изменил его, чтобы вы могли установить строку заполнения.Итак, я бы использовал этот код:
Вы также можете использовать его как функцию-прототип, используя этот код:
источник
Первый параметр - это любое действительное число, второй параметр - положительное целое число, указывающее минимальное количество цифр слева от десятичной точки, а третий параметр - необязательное положительное целое число, указывающее число, если цифры находятся справа от десятичной точки.
так
источник
Не изобретайте колесо, используйте строку подчеркивания :
jsFiddle
источник
Это решение ES6.
источник
const numStr = String(num)
return '0'.repeat(len - numStr.length) + numStr;
Во всех современных браузерах вы можете использовать
Вот ссылка на MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
источник
Не то чтобы на этот вопрос требовалось больше ответов, но я подумал, что добавлю простую версию этого кода.
_.padLeft(number, 6, '0')
источник
var zfill = _.partialRight(_.padStart, '0');
npm install --save lodash.padleft
затемimport padLeft from 'lodash.padleft'
пропустите_.
Последний способ сделать это намного проще:
output: "02"
источник
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})
возвращается"00.008"
для меня, основываясь на моей локали.Просто другое решение, но я думаю, что оно более разборчиво.
источник
Этот менее родной, но может быть самым быстрым ...
источник
pad = count - (num + '').length
. отрицательные числа плохо обрабатываются, но, кроме того, это не плохо. +1Мое решение
Применение
источник
Почему бы не использовать рекурсию?
источник
Некоторая мартышка тоже работает
источник
pad(5, 0, 6)
знак равно000005
pad('10', 0, 2)
знак равно10 // don't pad if not necessary
pad('S', 'O', 2)
знак равноSO
...так далее.
ура
источник
var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;
если вы это исправите, я уберу свой отрицательный голос.0
объединения символов :) - Ответ обновлен.Самое простое , самое простое решение, которое вы найдете.
источник