শীর্ষস্থানীয় শূন্যগুলির সাথে কীভাবে আমি কোনও মূল্য প্যাড করতে পারি?


394

জাভাস্ক্রিপ্টে কোনও মান জিরোফিল করার প্রস্তাবিত উপায় কী? আমি কল্পনা করেছিলাম যে আমি জিরোগুলিকে একটি টাইপকাষ্ট মান হিসাবে প্যাড করতে একটি কাস্টম ফাংশন তৈরি করতে পারব, তবে আমি ভাবছি যে এটি করার আরও সরাসরি কোনও উপায় আছে কিনা?

দ্রষ্টব্য: "জিরোফিল্ড" দ্বারা আমি এটি শব্দের ডাটাবেস অর্থে বোঝাতে চাইছি (যেখানে 5 নম্বরের 6-অঙ্কের জিরোফিল্ড উপস্থাপনা হবে "000005")।


এটি উত্তর দেওয়ার জন্য যথেষ্ট তথ্য নয়। "শূন্য প্যাডিং" এর সর্বাধিক সাধারণ উদাহরণ সম্ভবত সম্ভবত তারিখগুলিতে শূন্যগুলি প্রিপেন্ড করছে: 5/1/2008> 05/01/2008। তুমি কি এটাই বুজাতে চাও?
ট্রিপটিচ

6
নোড অ্যাপ্লিকেশনগুলির জন্য npm install sprintf-jsআপনার প্রয়োজনীয় ফাইলটিতে এটি ব্যবহার করুন এবং এটির প্রয়োজন:sprintf('%0d6', 5);
ড্রোগানস

function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;} ... ধরে nনেই নেতিবাচক
পাওলো

@ পাওলো যে ফাংশনটি এন সংখ্যাসূচক হলে কাজ করে না। whileঅ্যাক্সেস করার জন্য আপনাকে N কে একটি স্ট্রিংয়ে রূপান্তর করতে হবেn.length
নিক এফ

1
ম্যাথ ছাড়া একটি লাইনার বা লুপ বা লাইব্রেরি যখন? mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
অ্যাডাম

উত্তর:


224

পাঠকদের জন্য নোট!

মন্তব্যকারীরা যেমন উল্লেখ করেছেন, এই সমাধানটি "চতুর" এবং চতুর সমাধানগুলি প্রায়শই হয়, এটি স্মৃতিশক্তি নিবিড় এবং তুলনামূলকভাবে ধীর গতির হয়। পারফরম্যান্স যদি আপনার জন্য উদ্বেগজনক হয় তবে এই সমাধানটি ব্যবহার করবেন না!

সম্ভাব্য পুরানো : ECMAScript 2017 এ স্ট্রিং.প্রোটোটাইপ.প্যাডস্টার্ট এবং নম্বর.প্রোটোটাইপ.টলোক্যাল স্ট্রিং রয়েছে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 এর প্রসারিত সঙ্গে পছন্দ করুন ।


1
এখন আপনাকে কেবল 50.1234 এর মতো সংখ্যার যত্ন নেওয়া দরকার এবং আমার সমাধানের একটি নীচে পড়ার সংস্করণ পেয়েছি! তবে আমি ধরে নিলাম যে আমরা কেবল প্যাডিং করেছি, সামগ্রিক প্যাডিং নয়।
কোডারজে

7
আপনি যখনই কোনও মূল্য প্যাড করতে চান তখনই নতুন অ্যারে তৈরি করার অনুরাগী নন। পাঠকদের সম্ভাব্য মেমরি এবং জিসি প্রভাব সম্পর্কে সচেতন হওয়া উচিত যদি তারা এর মধ্যে # বড় কাজ করে থাকে (উদাঃ একটি নোড.জেএস সার্ভারে যা প্রতি সেকেন্ডে 1000 এর কাজ করে থাকে। @ প্রোফিটহললজের উত্তরটি আরও ভাল সমাধান বলে মনে হয়) ।)
ব্রুফা

6
এটি নেতিবাচক মানগুলির জন্য কাজ করে না: জিরোফিল (-10, 7) -> "0000-10"
ডিজিটালথ

2
এখানে শীর্ষস্থানীয় তিনটির উত্তরের মধ্যে পারফরম্যান্স পরিমাপ: jsperf.com/left-zero-pad
টমসডিং

12
ECMAScript 2017 হিসাবে, একটি বিল্ট -ইন ফাংশন প্যাডস্টার্ট রয়েছে
টমাস নিকডিম

321

সহজ উপায়. আপনি প্যাডের জন্য স্ট্রিং গুণটি যোগ করতে এবং এটি একটি ফাংশনে পরিণত করতে পারেন।

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

95
এটি একটি খুব সুন্দর সমাধান, সেরা আমি দেখেছি। স্পষ্টতার জন্য, আমি এখানে সময় বিন্যাসে মিনিট প্যাড করতে ব্যবহার করছি একটি সহজ সংস্করণ: ('0' + মিনিট) .স্লাইস (-2)
লূক এহ্রেসমান

17
এটি কিছুক্ষণ লুপ সহ বাস্তবায়নের চেয়ে 5 গুণ ধীর: gist.github.com/4382935
এন্ড্রুর্ক

42
এটিতে প্রত্যাশিত সংখ্যার চেয়ে বড় সংখ্যার সাথে একটি ফ্যাটাল ফ্ল্যাব রয়েছে - এটি অত্যন্ত সাধারণ ঘটনা। উদাহরণস্বরূপ, paddy (888, 2)ফলন 88এবং 888প্রয়োজনীয় হিসাবে না । এই উত্তরটি নেতিবাচক সংখ্যাগুলিও পরিচালনা করে না।
ব্রক অ্যাডামস

8
@ ব্রোকএডামস, জিরোফিল সাধারণত স্থির প্রস্থের নম্বর / ফর্ম্যাটিং ক্ষেত্রে ব্যবহৃত হয় - সুতরাং আমি মনে করি যে 2 ডিজিটের জিরোফিল করার চেষ্টা করার সময় কোনও 3 ডিজিটের নম্বর দেওয়া হলেও এটি সম্ভবত কম সম্ভাব্য (বা এমনকি একটি ইস্যু নয়) হতে পারে।
Seaux

1
("000000" + সামেনাম)। সাবস্ট্রিট (-6,6) যেখানে শূন্যের সংখ্যা এবং -6,6 প্যাডের প্রস্থের সাথে সামঞ্জস্য রয়েছে। একই ধারণা কিন্তু স্লাইস আরও একটি কম পরম লাগে; স্লাইস সাবটারের চেয়ে দ্রুত বা ধীর কিনা তা নিশ্চিত নন। অবশ্যই আমার সমাধানটির জন্য ভেরিয়েবল অ্যাসাইনমেন্টের প্রয়োজন নেই।
4:44

315

আমি এখানে সমস্ত জটিল উত্তর বিশ্বাস করতে পারি না ... কেবল এটি ব্যবহার করুন:

var zerofilled = ('0000'+n).slice(-4);

27
Negativeণাত্মক সংখ্যা এবং 4 টির চেয়ে বেশি সংখ্যার সংখ্যা বাদে ভাল।
wberry

12
@ উদ্বোধনী এটি উত্পাদন প্রস্তুত কোড হিসাবে নয়, বরং হাতে প্রশ্নটি সমাধান করার জন্য বেসিকগুলির আরও সাধারণ ব্যাখ্যা। আকা এটি একটি সংখ্যা ইতিবাচক বা নেতিবাচক কিনা তা নির্ধারণ করা খুব সহজ এবং প্রয়োজনে উপযুক্ত চিহ্নটি যুক্ত করুন, তাই আমি এটির সাথে আমার সহজ উদাহরণটি ক্লাস্টার করতে চাইনি। এছাড়াও, একটি আর্গ হিসাবে একটি অঙ্কের দৈর্ঘ্য গ্রহণ করা এবং আমার হার্ডকোডযুক্ত মানগুলির পরিবর্তে এটি ব্যবহার করা ঠিক তত সহজ।
Seaux

5
@ সিয়োক্স, আপনি বলেছেন: "সমস্ত জটিল উত্তর বিশ্বাস করতে পারে না" এবং মন্তব্য করার সময় নিজের জটিলতা ব্যাখ্যা করতে শুরু করে। এর অর্থ আপনি বুঝতে পেরেছেন যে এমন দৃষ্টিকোণ রয়েছে যা থেকে আপনার উত্তরটি নিখুঁত নয়। অতএব জটিলতা।
ওম শঙ্কর

2
ওমশঙ্করকে "জটিল উত্তরগুলি" লিখে আমি ব্যাখ্যা বা বিস্তারিত উত্তরগুলি উল্লেখ করছিলাম না (যা আমার সাইটে না হলেও এই সাইটে স্পষ্টতই উত্সাহিত হয়), বরং উত্তরগুলিতে অপ্রয়োজনীয় কোড জটিলতা রয়েছে।
সিক্স

7
আমি এই উত্তর পছন্দ। আমার নিজস্ব ক্ষেত্রে, আমি জানি যে সংখ্যাগুলি সর্বদা ইতিবাচক হয় এবং 3 টির বেশি কখনই হয় না এবং আপনি যখন 0 এর সাথে প্যাডিং করেন এবং আপনার ইনপুটটি ভালভাবে পরিচিত তখন এটি প্রায়ই ঘটে। নিস!
প্যাট্রিক চু

110

আমি আসলে সম্প্রতি কিছু এই সঙ্গে আসতে হবে। আমি বুঝতে পারি লুপগুলি ব্যবহার না করে এটি করার একটি উপায় থাকতে হবে be

এটিই আমি নিয়ে এসেছি।

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

চিয়ার্স!



এক্সডিআর একটি লোগারিথমিক প্রকরণ নিয়ে এসেছিল যা আরও ভাল সম্পাদন করে বলে মনে হচ্ছে।

সতর্কতা : এই সংখ্যাটি যদি শূন্যের সমান হয় (যেমন জিরোপ্যাড (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;
}

পারফরম্যান্সের কথা বলতে গিয়ে টমসমিডিং শীর্ষ 3 টি উত্তর ( লগের পরিবর্তনের সাথে 4 ) তুলনা করে । অনুমান করুন কোনটি প্রধানত অন্য দুজনকে ছাড়িয়ে গেছে? :)


9
এটি ভাল, আমি এটি পাঠযোগ্য এবং শক্তিশালী পছন্দ করি। আমি কেবলমাত্র numZerosপ্যারামিটারটির নামটি পরিবর্তন করব , কারণ এটি বিভ্রান্তিকর। এটি আপনি যোগ করতে চান এমন শূন্যের সংখ্যা নয়, সংখ্যাটি হওয়া উচিত সর্বনিম্ন দৈর্ঘ্য। আরও ভাল নাম numLengthবা এমনকি হতে হবে length
সেনসফুল

13
+1 টি। উচ্চতর ভোট দেওয়া উত্তরের বিপরীতে, এইটি নেতিবাচক সংখ্যাগুলি পরিচালনা করে এবং ওভারফ্লোতে গুরুতর ত্রুটিগুলি ফেরায় না !! ?!
ব্রক অ্যাডামস

10
এখানে তিনটি শীর্ষ উত্তরের মধ্যে পারফরম্যান্স পরিমাপ: jsperf.com/left-zero-pad
21:38

4
আমি লগারিদম ব্যবহার করে এই উত্তরটির কার্যকারিতা 100% এরও বেশি উন্নত করেছি। দয়া করে লগারিদমিক পরীক্ষার
কেসটি

2
আসল সমাধানটি আরও ভাল, লগারিদমিকের প্রকরণটি যদি numশূন্য হতে পারে তবে কাজ করে না ...
ওন্দ্র সি।

69

এখানে আমি 7 টি অক্ষর পর্যন্ত কোনও সংখ্যা প্যাড করতাম।

("0000000" + number).slice(-7)

এই পদ্ধতির সম্ভবত বেশিরভাগ লোকের পক্ষে যথেষ্ট হবে।

সম্পাদনা করুন: আপনি যদি আরও জেনেরিক করতে চান তবে আপনি এটি করতে পারেন:

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

সম্পাদনা 2: নোট করুন যে ES2017 সাল থেকে আপনি ব্যবহার করতে পারেন String.prototype.padStart:

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

এটি ব্যর্থ হয়, খারাপভাবে, বিপুল সংখ্যক এবং নেতিবাচক সংখ্যায়। number = 123456789উদাহরণস্বরূপ, উপরে কোড সহ with
ব্রুক অ্যাডামস

নির্দিষ্ট দ্রষ্টব্যগুলির জন্য এই সমাধানটি সর্বকালের সেরাতম সম্ভাবনা! আমরা এর আগে কেন এলো না সে সম্পর্কে আমার কোনও ধারণা নেই। দৃশ্যটি হ'ল: আপনি এমন একটি নম্বর পেয়েছেন যা সর্বদা ইতিবাচক থাকে [যেমন ব্রোক উল্লেখ করেছেন] এবং আপনি জানেন যে এটি আপনার সীমা থেকে বেশি অক্ষর নেবে না। আমাদের ক্ষেত্রে আমাদের একটি স্কোর রয়েছে যা আমরা অ্যামাজন এসডিবিতে সঞ্চয় করি। আপনি যেমন জানেন যে এসডিবি সংখ্যার তুলনা করতে পারে না, তাই সমস্ত স্কোর শূন্য প্যাডড হতে হবে। এটি অত্যন্ত সহজ এবং কার্যকর!
ক্রিস্টিয়ান

4
দুঃখিত, আমার উল্লেখ করা উচিত ছিল যে এটি নেতিবাচক সংখ্যার জন্য কাজ করবে না। যদিও আমি মনে করি এটি আরও সাধারণ ধনাত্মক সংখ্যার ক্ষেত্রে ডিল করে। এটি আমার যা প্রয়োজন, তা করে!
চেটবক্স

এটি আবার প্রয়োজন এবং বুঝতে পেরেছিল যে আপনার প্রয়োজন নেই new String। আপনি কেবল স্ট্রিং লিটারেল ব্যবহার করতে পারেন।
চ্যাটবক্স

3
(new Array(padding + 1).join("0")প্রতিস্থাপন করা যেতে পারে"0".repeat(padding)
পাভেল

34

আধুনিক ব্রাউজারগুলি এখন সমর্থন করে padStart, আপনি কেবল এখনই করতে পারেন:

string.padStart(maxLength, "0");

উদাহরণ:

string = "14";
maxLength = 5; // maxLength is the max string length, not max # of fills
res = string.padStart(maxLength, "0");
console.log(res); // prints "00014"


@ ফ্লিম এই উত্তরে এটি নির্দ্বিধায় নির্দ্বিধায় :) :) এটি 4 বছর আগে লেখা হয়েছিল তাই আমি নিশ্চিত যে এখন বিষয়গুলি পরিবর্তিত হয়েছে
স্টার্লিং আর্চার

27

দুর্ভাগ্যক্রমে, এই সমস্যার জন্য অনেকগুলি অযথা জটিল পরামর্শ রয়েছে, সাধারণত গণিত বা স্ট্রিং ম্যানিপুলেশন করতে নিজের ফাংশন লিখতে বা কোনও তৃতীয় পক্ষের ইউটিলিটি কল করার সাথে জড়িত। তবে বেস জাভাস্ক্রিপ্ট লাইব্রেরিতে কোডের এক লাইনের সাহায্যে এটি করার একটি স্ট্যান্ডার্ড উপায় রয়েছে। আপনি কোনও স্থানীয় নাম বা স্টাইলের মতো পরিবর্তন করতে চান না এমন প্যারামিটারগুলি নির্দিষ্ট করে না দেওয়ার জন্য কোনও ফাংশনে কোডের এই এক লাইন মোড়ানো উপযুক্ত।

var amount = 5;

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

এটি পাঠ্যের জন্য "005" এর মান উত্পন্ন করবে। আপনি দশমিক পয়েন্টের ডান দিকে প্যাড শূন্য থেকে প্যাডের টু লোকলস্ট্রিং ফাংশনটিও ব্যবহার করতে পারেন।

var amount = 5;

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

এটি পাঠ্যের জন্য "5.00" এর মান উত্পন্ন করবে। হাজারে হাজারে কমা বিভাজক ব্যবহার করতে ব্যবহারের গোষ্ঠীকরণকে সত্যে পরিণত করুন।

উল্লেখ্য ব্যবহার করে toLocaleString()সঙ্গে localesএবং optionsআর্গুমেন্ট ECMA-402 আলাদাভাবে মান নির্ধারিত হয়েছে এর নাম ECMAScript নেই। আজ অবধি, কিছু ব্রাউজার কেবলমাত্র প্রাথমিক সমর্থন বাস্তবায়ন করে , অর্থাত্ toLocaleString()কোনও যুক্তি উপেক্ষা করতে পারে।

সম্পূর্ণ উদাহরণ


বাহ, এটি একটি সুপার ক্লিন সমাধান এবং node.js. এ কাজ করে
jishi

আমি যখন পরিচয় - "অহেতুক জটিল পরামর্শগুলি" পড়ি তখন আমি চক্কর দিলাম। সফ্টওয়্যার বিকাশ, যেমন সমস্ত ইঞ্জিনিয়ারিং শাখায়, ওজন ট্রেড অফ জড়িত। আমি এই "স্ট্যান্ডার্ড ওয়ে" নিজেই চেষ্টা করেছিলাম - এবং সময়সাপেক্ষে। এটি অবশ্যই কার্যকরভাবে কাজ করে, তবে অন্যান্য "হোম রোলড" সমাধানগুলির তুলনায় এটি যে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে তুলনা করা হচ্ছে তার কারণে আমি কখনই এটি কোনও ধরণের পুনরাবৃত্ত অ্যাপ্লিকেশনটির জন্য বেছে নেব না।
ভালভরাইন

1
সত্য, প্রচুর ডেটা লুপ করার সময় অনেকগুলি অন্তর্নির্মিত জাভাস্ক্রিপ্ট ফাংশন খারাপভাবে সঞ্চালিত হয়, তবে আমি যুক্তি দেব যে এর জন্য আপনার জাভাস্ক্রিপ্ট ব্যবহার করা উচিত নয়, এমনকি নোড.জেএস এর মতো সার্ভার-সাইডও side আপনার কাছে সার্ভার-সাইড প্রক্রিয়া করার জন্য প্রচুর ডেটা থাকলে আপনার। নেট বা জাভার মতো আরও ভাল প্ল্যাটফর্ম ব্যবহার করা উচিত। যদি আপনি শেষ ব্যবহারকারীর কাছে প্রদর্শনের জন্য ক্লায়েন্ট-সাইড ডেটা প্রক্রিয়াজাত করেন তবে আপনি বর্তমানে শেষ ব্যবহারকারীর স্ক্রিনে যা সরবরাহ করছেন তার জন্য কেবলমাত্র ডেটা প্রক্রিয়া করা উচিত। উদাহরণস্বরূপ, কেবলমাত্র একটি সারণীর দৃশ্যমান সারিগুলি রেন্ডার করুন এবং অন্যান্য রাস্তার জন্য ডেটা প্রক্রিয়া করবেন না।
ড্যানিয়েল বারবিলাস 21

21

যদি পূরণ নম্বরটি কোনও নির্দিষ্ট মান অতিক্রম না করার জন্য আগেই জানা থাকে তবে লুপ ছাড়াই এটি করার আরও একটি উপায় রয়েছে:

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/jender00/N87mZ/


@ ব্রোকএডামস - আপনার উল্লেখ করা দুটি ক্ষেত্রেই স্থির যদি নম্বরটি ইতিমধ্যে পূরণের প্রস্থের মতো প্রশস্ত হয় তবে কোনও ফিল পূরণ করা হয় না।
jفر00

ধন্যবাদ; +1 টি। যদিও সাধারণ সম্মেলন থেকে নেতিবাচক সংখ্যাগুলি কিছুটা দূরে রয়েছে। আপনার পরীক্ষার ক্ষেত্রে উদাহরণস্বরূপ -88ফলন করা উচিত "-00088"
ব্রুক অ্যাডামস

1
@BrockAdams - আমি নিশ্চিত কিনা কলিং ছিল না zeroFill(-88, 5)উত্পাদন করা উচিত -00088বা -0088? আমি অনুমান করি যে আপনি widthযুক্তিটি সংখ্যার পুরো প্রস্থ বা কেবল অঙ্কের সংখ্যা (নেতিবাচক চিহ্ন সহ নয়) হতে চান তার উপর নির্ভর করে । কোনও প্রয়োগকারী সহজেই --widthকোডের লাইনটি সরিয়ে নেতিবাচক চিহ্নকে অন্তর্ভুক্ত না করার জন্য আচরণটি সহজেই স্যুইচ করতে পারেন ।
jفر00

19

দ্রুত এবং নোংরা উপায়:

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

X = 5 এবং গণনা = 6 এর জন্য আপনার y = "000005" থাকবে


1
y="0005"উপরের সাথে আমি পেয়েছিলাম , y = (new Array(count + 1 - x.toString().length)).join('0') + x;যা আমাকে দিয়েছিলy="000005"

3
@ অরসিলোনি: সংক্ষিপ্ততম কোড সমাধানটি হ'ল('0000'+n).slice(-4)
সিওক্স

14

আমি এখানে কাজ করার জন্য একটি দ্রুত ফাংশন নিয়ে এসেছি। কারও যদি সহজ পদ্ধতির থাকে তবে নির্দ্বিধায় শেয়ার করুন!

function zerofill(number, length) {
    // Setup
    var result = number.toString();
    var pad = length - result.length;

    while(pad > 0) {
        result = '0' + result;
        pad--;
    }

    return result;
}

আমি মনে করি না যে এখানে একটি "সরল" সমাধান হবে - এটি সর্বদা কোনও ধরণের ফাংশন হবে। আমরা একটি অ্যালগরিদম আলোচনা করতে পারি, কিন্তু দিনের শেষে, আপনি এখনও একটি ফাংশন শেষ করবেন যা একটি সংখ্যা জিরোফিল করে।
পিটার বেইলি

আমার সাধারণ পরামর্শটি হ'ল "লুপগুলি" ব্যবহার করার জন্য কারণ তারা সাধারণত ECMAScript ভাষাগুলিতে আরও স্থিতিশীল এবং দ্রুত হয় (অ্যাকশনস্ক্রিপ্ট 1-3 এবং জাভাস্ক্রিপ্ট)
cwallenpoole

বা, পুনরাবৃত্তি সম্পূর্ণভাবে এড়িয়ে যান;)
পিটার বেইলি

সহজ কাজ? সম্ভবত না. যে লুপ না? এটি সম্ভব ... যদিও অ্যালগরিদম সম্পূর্ণ তুচ্ছ নয়।
কোডারজে

1
বাহ, বেশিরভাগই উপরের সমস্ত মন্তব্যগুলি ভুল। @ প্রোফিটহললজ এর সমাধান সহজতর এবং ইনলাইনের জন্য উপযুক্ত (কোনও ফাংশন হওয়ার দরকার নেই)। এদিকে for.vs। whileপারফরম্যান্স আকর্ষণীয় হওয়ার পক্ষে যথেষ্ট আলাদা নয়: jsperf.com/fors-vs- moment
ব্রোফা

12

এখানে পার্টিতে দেরীতে, তবে আমি প্রায়শই এই কনস্ট্রাক্টটি কোনও মানের অ্যাড-হক প্যাডিংয়ের জন্য ব্যবহার করি n, এটি ইতিবাচক, দশমিক হিসাবে পরিচিত:

(offset + n + '').substr(1);

যেখানে offset10 ^^ অঙ্ক রয়েছে।

উদাহরণস্বরূপ 5 সংখ্যায় প্যাডিং, যেখানে এন = 123:

(1e5 + 123 + '').substr(1); // => 00123

এর হেক্সিডেসিমাল সংস্করণটি আরও কিছুটা ভার্বোস:

(0x100000 + 0x123).toString(16).substr(1); // => 00123

দ্রষ্টব্য 1: আমি @ প্রোফিটহ্ললজের সমাধানও পছন্দ করি, এটি স্লাইস () এর নিফটি নেতিবাচক-সূচক বৈশিষ্ট্যটি ব্যবহার করে এটির স্ট্রিং সংস্করণ।


12

আমি সত্যিই জানি না কেন, তবে কেউ এটি সবচেয়ে সুস্পষ্ট উপায়ে করেনি। এই এখানে আমার বাস্তবায়ন।

ফাংশন:

/** 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 ডিজিটের প্যাডিংয়ের জন্য আরও চক্রের জন্য ব্যয় করতে পারে।


11

আমি 5 টি সংখ্যার প্রতিনিধিত্ব পেতে এই স্নিপেটটি ব্যবহার করি

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


9

ম্যাথের শক্তি!

x = প্যাড
y এর পূর্ণসংখ্যা y = প্যাডে শূন্যের সংখ্যা

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

9

আমি কাউকে এই সত্যটি চিহ্নিত করতে দেখিনি যে আপনি যখন স্ট্রিং.প্রোটোটাইপ.সুবস্ট্র () ব্যবহার করেন তখন একটি নেতিবাচক সংখ্যা দিয়ে ডান থেকে গণনা করা হয়।

ওপির প্রশ্নের একটি লাইন সমাধান, 5 নম্বরের 6-অঙ্কের জিরোফিল্ড প্রতিনিধিত্ব হ'ল:

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


8

এই প্রশ্নের উত্তরগুলিতে পাওয়া 15 টি বিভিন্ন ফাংশন / পদ্ধতিগুলির পরীক্ষার দীর্ঘ পরে, দীর্ঘ সময়ের পরে, আমি এখন জানি যে সেরা (সবচেয়ে বহুমুখী এবং দ্রুত) is

আমি এই প্রশ্নের উত্তর থেকে 15 টি ফাংশন / পদ্ধতি নিয়েছি এবং 100 প্যাডগুলি কার্যকর করতে সময় নির্ধারণ করার জন্য একটি স্ক্রিপ্ট তৈরি করেছি। প্রতিটি প্যাড শূন্যের 9সাথে সংখ্যাটি প্যাড করবে 2000। এটি অত্যধিক বলে মনে হচ্ছে এবং এটি হ'ল তবে এটি আপনাকে কার্যকারিতাগুলির স্কেলিং সম্পর্কে একটি ভাল ধারণা দেয়।

আমার ব্যবহৃত কোডটি এখানে পাওয়া যাবে: https://gist.github.com/NextToN কিছুই / 6325915

কোডটি নিজেরাই সংশোধন ও পরীক্ষা করতে নির্দ্বিধায়।

সর্বাধিক বহুমুখী পদ্ধতিটি পেতে, আপনাকে একটি লুপ ব্যবহার করতে হবে। এটি কারণ খুব সংখ্যক লোকের সাথে অন্যরা ব্যর্থ হওয়ার সম্ভাবনা রয়েছে, তবে এটি সফল হবে।

সুতরাং, কোন লুপ ব্যবহার করতে হবে? ঠিক আছে, এটি একটি whileলুপ হবে। একটি forলুপটি এখনও দ্রুত, তবে একটি whileলুপটি কিছুটা দ্রুত (বেশ কয়েকটি এমএস) - এবং ক্লিনার is

এর মত উত্তরগুলি 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'

আপনার কোডটির সংস্করণ যুক্ত করে অন্যদের এটির পরীক্ষা করা দ্রুত করার জন্য আমি এটিকে জিসফিডেলে রেখেছি : jsfiddle.net/kevinmicke/vnvghw7y/2 আপনার সংস্করণটি সর্বদা খুব প্রতিযোগিতামূলক এবং কখনও কখনও দ্রুত হয়। মোটামুটি পরিপূর্ণ পরীক্ষার জন্য ধন্যবাদ।
কেভিনমিক 16

8

প্রথম প্যারামিটারটি কোনও আসল সংখ্যা, দ্বিতীয় প্যারামিটার হল ধনাত্মক পূর্ণসংখ্যা যা দশমিক পয়েন্টের বামে সর্বনিম্ন সংখ্যার সংখ্যা নির্দিষ্ট করে এবং তৃতীয় প্যারামিটারটি একটি দশমিক পয়েন্টের ডানদিকে অঙ্কগুলি সংখ্যায় নির্দিষ্ট করে এমন একটি alচ্ছিক ধনাত্মক পূর্ণসংখ্যা হয়।

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'


8

এটি ES6 সমাধান।

function pad(num, len) {
  return '0'.repeat(len - num.toString().length) + num;
}
alert(pad(1234,6));


স্পষ্টতই সবচেয়ে মার্জিত সমাধান আমি 2 স্ট্রিং রূপান্তর এড়াতে এটিকে কেবল পরিবর্তন করব: const numStr = String(num)এবংreturn '0'.repeat(len - numStr.length) + numStr;
ngryman

8

সমস্ত আধুনিক ব্রাউজারে আপনি ব্যবহার করতে পারেন

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/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / স্ট্রিং / প্যাডস্টার্ট


5

এই প্রশ্নের আরও উত্তরের প্রয়োজন নেই এমন নয়, তবে আমি ভেবেছিলাম যে আমি এটির সহজ লোডাশ সংস্করণ যুক্ত করব।

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


1
আরও ভাল:var zfill = _.partialRight(_.padStart, '0');
দ্রুগানস

3
কিছু লোক সম্ভবত "আমি লোড্যাশ ব্যবহার করতে চাই না" এর প্রতিবাদ করব তবে আপনি কেবল এই ফাংশনটি ইনস্টল করতে পারবেন কারণ এটি আর কার্যকরভাবে যুক্তিযুক্ত যুক্তি নেই: npm install --save lodash.padleftতারপরে import padLeft from 'lodash.padleft'এবং _.
অ্যান্ডি

5

এটি করার সর্বশেষতম উপায়টি অনেক সহজ:

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

output: "02"


(8).toLocaleString(undefined, {minimumIntegerDigits: 5})"00.008"আমার লোকালের উপর ভিত্তি করে আমার জন্য ফেরত দেয় ।
le_m


4

এইটি কম স্থানীয়, তবে এটি দ্রুততম হতে পারে ...

zeroPad = function (num, count) {
    var pad = (num + '').length - count;
    while(--pad > -1) {
        num = '0' + num;
    }
    return num;
};

আমি আপনি কি করতে চান মনে pad = count - (num + '').length। নেতিবাচক সংখ্যাগুলি ভালভাবে পরিচালনা করা হয় না, তবে এটির বাইরেও এটি খারাপ নয়। +1
নিকফ

3

আমার সমাধান

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

3

কেন পুনরাবৃত্তি ব্যবহার করবেন না?

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

প্যাডজিরো (223, 3) '0223'
সার্জিনহো

ঠিক আছে, আমি ধরে নিয়েছি যে এই ফাংশনটিকে প্রথম পরামিতি হিসাবে স্ট্রিং দিয়ে ডাকা হয়। যাইহোক, আমি এটি স্থির করেছি।
lex82

2

কিছু মনকিপাচিংও কাজ করে

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"

1
জাভাস্ক্রিপ্টে টপলেভেল নেমস্পেসিং -1 বানকিপ্যাচ করা খারাপ অভ্যাস।
জেরেমি ওয়াল

2
অবজেক্ট এবং অ্যারে অবজেক্টের জন্য সত্য তবে স্ট্রিং খারাপ নয়
রডরিগো

2
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

... ইত্যাদি।

চিয়ার্স


আমি মনে করি এটি আরও পছন্দ করা উচিত: var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;আপনি যদি এটি ঠিক করেন তবে আমি আমার ডাউন ভোট সরিয়ে ফেলব।
22-28

@ স্পষ্টরূপে এটি ধরা পড়ার জন্য ধন্যবাদ, আমি আপনার সম্পাদনার সাথে একমত (হার্ডকডযুক্ত 0যোগদানের চর বাদে :) - উত্তর আপডেট হয়েছে।
ম্যাডব্রেক্স

আমি মনে করি স্ট্রিংটিকে একটি অস্থায়ী ভেরিয়েবলের মধ্যে সঞ্চয় করা ভাল। আমি এখানে এর কিছু বেঞ্চমার্কিং করেছি: jsperf.com/padding-with- মেমোয়েজেশন "নতুন অ্যারে" এ নতুন ব্যবহারের জন্য এটিও বেঞ্চমার্ক পেয়েছে নতুনটির ফলাফলগুলি সমস্ত জায়গাতেই রয়েছে তবে স্মৃতিচারণের পথে যাওয়ার মতো মনে হচ্ছে।
12 'এ 16-18 এ অনুপ্রেরণা প্রকাশ করুন

2

সহজ , সহজ-সরল সমাধান আপনি পাবেন।

function zerofill(number,length) {
    var output = number.toString();
    while(output.length < length) {
      output = '0' + output;
    }
    return output;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.