كيف يمكنني الوسادة قيمة مع الأصفار الرائدة؟

StackOverflow https://stackoverflow.com/questions/1267283

  •  13-09-2019
  •  | 
  •  

سؤال

ما هي الطريقة الموصى بها إلى Zerofill قيمة في جافا سكريبت؟ أتصور أنني أستطيع بناء وظيفة مخصصة لسادة الأصفار على قيمة مغلقة، لكنني أتساءل عما إذا كانت هناك طريقة أكثر مباشرة للقيام بذلك؟

ملحوظة: من خلال "Zerofilled" أعني ذلك في قاعدة بيانات الشعور بالكلمة (حيث يكون تمثيل من الزوجي المكون من 6 أرقام للعدد 5 "000005").

هل كانت مفيدة؟

المحلول

ملاحظة للقراء!

وكما أشار المعلقون إلى الخارج، فإن هذا الحل هو "ذكي"، وكما يكون حلولا ذكية في كثير من الأحيان، فهي مكثفة ذاكرة بطيئة نسبيا. إذا كان الأداء مصدر قلق لك، فلا تستخدم هذا الحل!

يحتمل أن تكون قديمة: Ecmascript 2017 يشمل string.prototype.padstart. و number.prototype.tolocaling. هناك منذ 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
}

يمكنك أن تخبز هذا في مكتبة إذا كنت ترغب في الحفاظ على مساحة الاسم أو أي شيء. مثل مع تمديد مسج.

نصائح أخرى

طريقة بسيطة. يمكنك إضافة الضرب السلسلة للوحة وتحويلها إلى وظيفة.

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

ثم استخدمه فقط توفير رقم إلى لوحة صفر:

> 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. خطرت اختلاف لوغاريتمي يبدو أن أداء أفضل.

تحذير: فشلت هذه الوظيفة إذا كان الأسطق يساوي صفر (مثل 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)

من المحتمل أن يكفي هذا النهج لمعظم الناس.

تحرير: إذا كنت ترغب في جعلها عامة، فيمكنك القيام بذلك:

("0".repeat(padding) + number).slice(-padding)

تحرير 2: لاحظ أنه منذ ES2017 يمكنك استخدامه String.prototype.padStart:

number.toString().padStart(padding, "0")

لسوء الحظ، هناك الكثير من الاقتراحات المعقدة التي لا داعي لها لهذه المشكلة، عادة ما تنطوي على كتابة وظيفتك الخاصة للقيام بالمعالجة الرياضيات أو السلسلة أو استدعاء الأداة المساعدة للطرف الثالث. ومع ذلك، هناك طريقة قياسية للقيام بذلك في مكتبة JavaScript الأساسية مع سطر واحد فقط من التعليمات البرمجية. قد يستحق التفاف هذا سطرا واحدا من التعليمات البرمجية في وظيفة لتجنب الاضطرار إلى تحديد المعلمات التي لا تريد تغييرها أبدا مثل الاسم المحلي أو الأناقة.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumIntegerDigits: 3,
    useGrouping: false
});

هذا سوف ينتج قيمة "005" للنص. يمكنك أيضا استخدام وظيفة TOLOCOCATRING للعدد لسادة الأصفار إلى الجانب الأيمن من النقطة العشرية.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumFractionDigits: 2,
    useGrouping: false
});

هذا سوف ينتج قيمة "5.00" للنص. تغيير مجموعة الاستخدام إلى 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/

بطريقة مقترحة (المرحلة 3) ES2017 .padStart() يمكنك ببساطة القيام به الآن (عند تنفيذها / مدعوم):

string.padStart(maxLength, "0"); //max length is the max string length, not max # of fills

الطريقة السريعة والقذرة:

y = (new Array(count + 1 - x.toString().length)).join('0') + x;

ل x = 5 وحول = 6 سيكون لديك y = "000005"

إليك وظيفة سريعة توصلت إلى القيام بهذه المهمة. إذا كان لدى أي شخص نهج أبسط، فلا تتردد في المشاركة!

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: أعجبني @ حلا Profithlolz أيضا، وهو إصدار سلسلة من هذا، باستخدام Slice () ميزة الفهرس السلبي Nifty ().

أنا حقا لا أعرف السبب، لكن لا أحد فعله بالطريقة الأكثر وضوحا. هنا هو تطبيقي.

دور:

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

ومباشرة للغاية، لا أستطيع أن أرى أي طريقة كيف يمكن أن يكون هذا أبسط. لسبب ما يبدو لدي عدة مرات هنا، حاول الناس تجنب "for" و "أثناء" حلقات بأي ثمن. ربما سيكلف استخدام Regex طريقة المزيد من الدورات لمثل هذا الحشو المكون من 8 أرقام تافهة.

يمكنني استخدام هذا Snipet للحصول على تمثيل 5 أرقام

(value+100000).toString().slice(-5) // "00123" with value=123

قوة الرياضيات!

X = عدد صحيح للوحة
نعم = عدد الأصفار إلى الوسادة

function zeroPad(x, y)
{
   y = Math.max(y-1,0);
   var n = (x / Math.pow(10,y)).toFixed(y);
   return n.replace('.','');  
}

Ecmascript 2017: استخدام padstart. أو باديند

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"

مزيد من المعلومات:

لم أر أي شخص يشير إلى حقيقة أنه عند استخدامك string.prototype.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));

المعلمة الأولى هي أي رقم حقيقي، المعلمة الثانية هي عدد صحيح إيجابي يحدد الحد الأدنى لعدد الأرقام على يسار النقطة العشرية والمعلمة الثالثة عبارة عن عدد صحيح إيجابي اختياري يحدد الرقم إذا أرقام الحق في النقطة العشرية.

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'

لا إعادة اختراع العجلة، واستخدام سلسلة تحت التشطيب:

jsfiddle.

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 حلقة لا تزال سريعة، ولكن while حلقة أسرع قليلا (بضع مللي) - وأنظف.

إجابات مثل تلك من قبل Wilco, Aleksandar Toplek أو Vitim.us سوف تفعل المهمة تماما.

شخصيا، حاولت نهجا مختلفا. حاولت استخدام وظيفة متكررة للوحة السلسلة / الرقم. لقد عملت بشكل أفضل من الأساليب التي تنضم إلى صفيف، لكن لا تزال، لم تنجح بشكل سريع مثل حلقة.

وظيفتي هي:

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'

شخصيا، بعد اختباراتي، أود استخدام طريقة مع حلقة بينما مثل 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'

في جميع المتصفحات الحديثة يمكنك استخدامها

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

هنا هو مرجع MDN https:/developer.mozilla.org/en-us/docs/web/javascript/reeference/global_objects/string/padstart.

ليس أن هذا السؤال يحتاج إلى مزيد من الإجابات، لكنني اعتقدت أنني سأضيف إصدار LODASH بسيط من هذا.

_.padLeft(number, 6, '0')

الطريقة الأخيرة للقيام بذلك أبسط بكثير:

var number = 2
number.toLocaleString(undefined, {minimumIntegerDigits:2})

output: "02"

مجرد حل آخر، لكنني أعتقد أنه أكثر مقروءا.

function zeroFill(text, size)
{
  while (text.length < size){
  	text = "0" + text;
  }
  
  return text;
}

هذا واحد أقل مواطن، ولكن قد يكون أسرع ...

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

لماذا لا تستخدم العودية؟

function padZero(s, n) {
    s = s.toString(); // in case someone passes a number
    return s.length >= n ? s : padZero('0' + s, n);
}

بعض الأحمق يعمل أيضا

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top