জাভাস্ক্রিপ্ট প্রিন্টফ / স্ট্রিং.ফর্ম্যাট সমতুল্য


1970

আমি সি / পিএইচপি printf()বা সি # / জাভা প্রোগ্রামারগুলির জন্য String.Format()( IFormatProvider। নেট) জন্য একটি ভাল জাভাস্ক্রিপ্টের সমতুল্য সন্ধান করছি ।

আমার মৌলিক প্রয়োজনীয়তা এখনকার সংখ্যার জন্য হাজার বিভাজক বিন্যাস, তবে এমন কিছু যা প্রচুর সংমিশ্রণগুলি পরিচালনা করে (তারিখ সহ) ভাল হবে।

আমি বুঝতে পারি যে মাইক্রোসফ্টের অ্যাজাক্স লাইব্রেরি একটি সংস্করণ সরবরাহ করে String.Format(), তবে আমরা সেই কাঠামোর পুরো ওভারহেড চাই না।


2
নীচের সমস্ত দুর্দান্ত উত্তরগুলি বাদ দিয়ে, আপনি এইটি একবার দেখে নিতে পারেন: stackoverflow.com/a/2648463/1712065 যা এই IMO, এই সমস্যার সবচেয়ে কার্যকর সমাধান।
অ্যানি

1
আমি একটি সস্তা লিখেছিলাম যা সি-এর মতো প্রিন্টফ সিন্টেক্স ব্যবহার করে।
ব্র্যাডেন সেরা

var সন্ধান = [$ স্কোপ.ডগ, "1"]; var url = vsprintf (" আর্থ / পরিষেবাদি / কুকুর অনুসন্ধান। svc / FindMe /% s /% s ", অনুসন্ধান); *** নোডের জন্য, আপনি "এনপিএম ইনস্টল স্প্রিন্ট-জেএস" দ্বারা আপনার মডিউলটি পেতে পারেন
জেনা লিফ

এটি অর্জনের জন্য আমি একটি সাধারণ ফাংশনও লিখেছি; stackoverflow.com/a/54345052/5927126
আনন্দশঙ্ঘব

উত্তর:


1107

ES6 থেকে আপনি টেম্পলেট স্ট্রিং ব্যবহার করতে পারেন:

let soMany = 10;
console.log(`This is ${soMany} times easier!`);
// "This is 10 times easier!

বিস্তারিত জানার জন্য নীচে কিমের উত্তর দেখুন।


অন্যথায়:

ব্যবহার করে দেখুন জাভাস্ক্রিপ্ট, sprintf ()


আপনি যদি সত্যিই একটি সাধারণ ফর্ম্যাট পদ্ধতি নিজেই করতে চান তবে প্রতিস্থাপনগুলি ক্রমাগত করবেন না তবে সেগুলি একই সাথে করুন।

কারণ পূর্ববর্তী প্রতিস্থাপনের স্ট্রিং স্ট্রিংয়েও উল্লিখিত অন্যান্য প্রস্তাবগুলির বেশিরভাগই ব্যর্থ হয় যখন এই ধরণের বিন্যাস ক্রম থাকে:

"{0}{1}".format("{1}", "{0}")

সাধারণত আপনি আউটপুটটি আশা করবেন {1}{0}তবে আসল আউটপুট হবে {1}{1}। তাই ডায়াফেজের পরামর্শ মতো পরিবর্তে একসাথে প্রতিস্থাপন করুন ।


16
যদি কেবল কয়েকটি সাধারণ-থেকে-স্ট্রিং রূপান্তর পছন্দ হয় তবে num.toFixed()পদ্ধতিটি যথেষ্ট হতে পারে!
হেলটনবাইকার

@ ম্যাকসিমিলিয়ান মাজার যা দেখতে কিছুটা আলাদা to
ইভান ক্যারল

@ ইভানক্রোল আপনি ঠিক বলেছেন আমি মন্তব্যটি লেখার সময় ভান্ডারটি sprintf() for JavaScriptপাওয়া যায় নি। underscore.stringস্প্রিন্টফ বাদে আরও বৈশিষ্ট্য রয়েছে যা sprintf() for JavaScriptবাস্তবায়নের উপর ভিত্তি করে । লাইব্রেরি ব্যতীত সম্পূর্ণ ভিন্ন প্রকল্প।
ম্যাকসিমিলিয়ান মাজার

@ ম্যাকসিমিলিয়ান মাজার ঠিক বলেছেন, কেবল এই উত্তরটি মারা গেছে এবং লিঙ্কটি ক্ষয় হয়ে গেছে। এটি পুরোপুরি শুদ্ধ করা প্রয়োজন।
ইভান ক্যারল

2
এটি আর উত্তর গ্রহণ করা উচিত নয়। ES6 হিসাবে এটি জাভাস্ক্রিপ্ট ভাষায় নির্মিত হয়েছে (উভয় ব্রাউজার এবং নোডজেএস)। নীচে @ কিমের উত্তর দেখুন।
রায়ান শিলিংটন

1390

পূর্বে প্রস্তাবিত সমাধানগুলিতে বিল্ডিং:

// First, checks if it isn't implemented yet.
if (!String.prototype.format) {
  String.prototype.format = function() {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function(match, number) { 
      return typeof args[number] != 'undefined'
        ? args[number]
        : match
      ;
    });
  };
}

"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")

আউটপুট

এএসপি মারা গেছে, তবে এএসপি.এনইটি জীবিত! এএসপি {2}


আপনি যদি Stringপ্রোটোটাইপটি সংশোধন না করা পছন্দ করেন :

if (!String.format) {
  String.format = function(format) {
    var args = Array.prototype.slice.call(arguments, 1);
    return format.replace(/{(\d+)}/g, function(match, number) { 
      return typeof args[number] != 'undefined'
        ? args[number] 
        : match
      ;
    });
  };
}

আপনাকে আরও বেশি পরিচিত করে তোলে:

String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');

একই ফলাফল সহ:

এএসপি মারা গেছে, তবে এএসপি.এনইটি জীবিত! এএসপি {2}


12
|| আরগস [সংখ্যা] ০. হলে ট্রিক কাজ করে না ((আরগস [সংখ্যা] === অপরিবর্তিত) কিনা তা দেখতে একটি স্পষ্টভাবে করা উচিত)।
fserb

4
শর্টহ্যান্ডের অন্য বিবৃতিতে যদি বলা হয়, তবে কেন কেবল "'{' + সংখ্যা + '}'" এর পরিবর্তে "ম্যাচ" করবেন না। ম্যাচটি সেই স্ট্রিংয়ের সমান হওয়া উচিত।
মাইকাইকগ্টো

4
যদি আপনার একে অপরের সাথে একাধিক স্ট্রিং যুক্ত থাকে ( +-ওপ্রেটারের সাথে), সম্পূর্ণ স্ট্রিংকে প্রথম বন্ধনীতে রেখে দিতে ভুলবেন না: ("asd {0}"+"fas {1}").format("first", "second");অন্যথায়, ফাংশনটি কেবল যুক্ত করা শেষ স্ট্রিংয়ের জন্য প্রয়োগ করা হবে।
Lukas Knuth

3
এটি সামান্য এবং সূক্ষ্মভাবে ফলাফল পরিবর্তন করে। কল্পনা করুন 'foo {0}'.format(fnWithNoReturnValue())। এটি বর্তমানে ফিরে আসবে foo {0}। আপনার পরিবর্তনগুলি সহ, এটি ফিরে আসবে foo undefined
ভয়ঙ্কর

2
@ ওয়েভেনমোর: / \ {(\ ডি +) \} / জি
হোজুকি

490

এটি মজার কারণ স্ট্যাক ওভারফ্লো Stringপ্রোটোটাইপ নামক জন্য তাদের নিজস্ব ফর্ম্যাটিং ফাংশন রয়েছে formatUnicorn। চেষ্টা করে দেখুন! কনসোলে যান এবং এর মতো কিছু টাইপ করুন:

"Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"});

ফায়ারবাগকে

আপনি এই আউটপুট পেতে:

Hello, Gabriel, are you feeling OK?

আপনি বস্তু, অ্যারে এবং স্ট্রিংগুলি আর্গুমেন্ট হিসাবে ব্যবহার করতে পারেন! আমি এর কোড পেয়েছি এবং এর নতুন সংস্করণ তৈরি করতে পুনরায় কাজ করেছি String.prototype.format:

String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
function () {
    "use strict";
    var str = this.toString();
    if (arguments.length) {
        var t = typeof arguments[0];
        var key;
        var args = ("string" === t || "number" === t) ?
            Array.prototype.slice.call(arguments)
            : arguments[0];

        for (key in args) {
            str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
        }
    }

    return str;
};

চতুর Array.prototype.slice.call(arguments)কলটি নোট করুন - এর অর্থ যদি আপনি কোনও JSON- স্টাইলের অবজেক্ট নয়, স্ট্রিং বা সংখ্যাগুলি যুক্তিগুলিতে ফেলে থাকেন তবে আপনি সি # এর String.Formatআচরণ প্রায় সঠিকভাবে পাবেন।

"a{0}bcd{1}ef".formatUnicorn("foo", "bar"); // yields "aFOObcdBARef"

এর কারণ Arrayএর sliceবাধ্য করা হবে যাই হোক না কেন এর argumentsএকটি মধ্যে Arrayতা মূলত বা ছিল না, এবং key(একটি স্ট্রিং করতে বাধ্য যেমন, "0" প্রতিটি অ্যারের উপাদানের সূচী (0, 1, 2 ...), তাই হবে "\\{0\\}"আপনার প্রথম regexp প্যাটার্ন জন্য)।

ঝরঝরে।



5
@ জেমসম্যানিং রেইজেক্সটি বৈশ্বিক পতাকা ( g) প্রদানের অনুমতি দেয় যা একই কী একাধিকবার প্রতিস্থাপন করতে পারে। উপরের উদাহরণে, আপনি {name}একই বাক্যে একাধিকবার ব্যবহার করতে পারেন এবং সেগুলি সমস্ত প্রতিস্থাপন করতে পারেন।
KrekkieD

3
সত্যই সত্য বলে মনে হচ্ছে এটি ভয়াবহভাবে ভঙ্গুর। উদাহরণস্বরূপ দিলে কি হবে nameহয় "blah {adjective} blah"?
সাম হোচেভার

5
@ আরফিন "একটু হাইপারবোলিক"? কোড যে বিন্যাস স্ট্রিং যেমন ব্যবহারকারীর ডেটা ব্যাখ্যা মধ্যে বোকা বানানো হয় একটি সম্পূর্ণ হয় দুর্বলতা বিভাগ । 98,44% এর মাঝারি পরলোক
সাম হোসেভর

3
@ সামহোসেইভার আমি আপনাকে বিশ্বাস করতে পারি না লিটল ববি আমাকে দক্ষ করে তুলেছে। ;) আপনি যদি কোনও সুরক্ষা চেক ছাড়াই আপনার ডাটাবেস সার্ভারে ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট দ্বারা প্রক্রিয়াকৃত পাঠ্যটি চালাচ্ছেন তবে স্বর্গ আমাদের সকলকে সহায়তা করুন। ; Look) দেখুন, কোনও ব্যবহারকারী কোনও ক্লায়েন্টের (যেমন, পোস্টম্যান) পাঠাতে পারে এমন কিছু নেই যা আপনার সার্ভারের সুরক্ষার বাইরে চলে যায়। আর তুমি উচিত কিছু বিপজ্জনক যে একটি ক্লায়েন্ট থেকে পাঠানো যেতে পারে অনুমান করবে হও। এটি হ'ল যদি আপনার ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট কোড থেকে 100% সুরক্ষা প্রয়োজন যা ব্যবহারকারীরা সর্বদা সম্পাদনাযোগ্য হয় এবং আপনি মনে করেন যে এই ফাংশনটি কোনও সুরক্ষা ঝুঁকি খুলতে পারে, আপনি ভুল খেলছেন।
রাফিন

325

জাভাস্ক্রিপ্টে নম্বর বিন্যাসকরণ

আমি আর একটি লাইব্রেরি প্রবর্তন না করে, জাভাস্ক্রিপ্টে নম্বরগুলি কীভাবে বিন্যাস করতে পারি তা প্রত্যাশায় এই প্রশ্ন পৃষ্ঠাতে পৌঁছেছি । আমি যা পেয়েছি তা এখানে:

গোলাকার ভাসমান-পয়েন্ট সংখ্যা

sprintf("%.2f", num)জাভাস্ক্রিপ্টের সমতুল্য মনে হয় num.toFixed(2), যা numগোলাকার সহ 2 দশমিক স্থানে ফর্ম্যাট করে (তবে Math.roundনীচে @ ars265 এর মন্তব্য দেখুন)।

(12.345).toFixed(2); // returns "12.35" (rounding!)
(12.3).toFixed(2); // returns "12.30" (zero padding)

সূচকীয় ফর্ম

সমতুল্য sprintf("%.2e", num)হয় num.toExponential(2)

(33333).toExponential(2); // "3.33e+4"

হেক্সাডেসিমাল এবং অন্যান্য ঘাঁটি

বেস বেসে নম্বর মুদ্রণের জন্য, চেষ্টা করুন num.toString(B)। জাভাস্ক্রিপ্ট বেস 2 থেকে 36 এর মধ্যে এবং থেকে স্বয়ংক্রিয় রূপান্তর সমর্থন করে (অতিরিক্তভাবে, কিছু ব্রাউজারে বেস 64 এর এনকোডিংয়ের জন্য সীমিত সমর্থন রয়েছে )।

(3735928559).toString(16); // to base 16: "deadbeef"
parseInt("deadbeef", 16); // from base 16: 3735928559

রেফারেন্স পৃষ্ঠা

জেএস নম্বর ফর্ম্যাটিংয়ের দ্রুত টিউটোরিয়াল

টু ফিক্সড () এর জন্য মজিলা রেফারেন্স পৃষ্ঠা :


23
সেখানে একটি অদ্ভুত সাদা জায়গা না রেখে, বন্ধনীতে সংখ্যাটি আক্ষরিক সংযুক্ত করা কি ভাল হবে?
rmobis

7
এটি সম্ভবত আরও ভাল লাগবে, সত্য। তবে আমার লক্ষ্যটি কেবল সিনট্যাক্স ত্রুটির ফাঁদটি চিহ্নিত করা।
21-28 এ রিডিস্ক করুন

4
আপনি যদি কোনও পুরানো ব্রাউজার ব্যবহার করছেন বা পুরানো ব্রাউজারগুলি সমর্থন করছেন তবে কয়েকটি ব্রাউজার টু ফিক্সডের জায়গায় ম্যাথ.উইন্ড ব্যবহার করা একটি ভুল সমাধান F
ars265

7
@ রাফেল_ এবং @ রিচার্ডস্ক: ..এছাড়াও কাজ করে:33333..toExponential(2);
পিটার জারিক

বা (33333) .TE এক্সফোনশিয়াল (2)
জোনাথন

245

ES6 থেকে আপনি টেম্পলেট স্ট্রিং ব্যবহার করতে পারেন :

let soMany = 10;
console.log(`This is ${soMany} times easier!`);
// "This is 10 times easier!

সচেতন থাকুন যে টেম্পলেট স্ট্রিংগুলি (একক) উদ্ধৃতিগুলির পরিবর্তে ব্যাকটিক্স দ্বারা বেষ্টিত

আরো তথ্যের জন্য:

https://developers.google.com/web/updates/2015/01/ES6-Template-Strings

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings

দ্রষ্টব্য: সমর্থিত ব্রাউজারগুলির একটি তালিকা পেতে মোজিলা-সাইটটি দেখুন।


61
টেমপ্লেট স্ট্রিংগুলির সমস্যাটি হ'ল এগুলি অবিলম্বে সম্পাদিত হবে বলে মনে হচ্ছে, আই আই 18 এন-এর মতো স্ট্রিং টেবিল সম্পূর্ণরূপে নিরর্থক। আমি প্রথমদিকে স্ট্রিংটি সংজ্ঞায়িত করতে পারি না এবং পরে এবং / অথবা বারবার ব্যবহারের জন্য প্যারামিটার সরবরাহ করতে পারি।
Tustin2121

4
@ টুস্টিন ২১২১ আপনি ঠিক বলেছেন যে এগুলি একটি ভেরিয়েবল হিসাবে নির্ধারিত হিসাবে তৈরি করা হয়নি যা কিছুটা মাইন্ড-ওয়ার্পিং, তবে টেম্প্লেটেড স্ট্রিংগুলির তাত্ক্ষণিক প্রয়োগের প্রবণতাগুলি যদি কোনও ফাংশনে লুকিয়ে রাখেন তবে কাজ করা যথেষ্ট সহজ। Jsfiddle.net/zvcm70pa
inanutshellus 25'16

13
@ টাস্টিন 2121 টেমপ্লেট স্ট্রিং বা পুরানো স্টাইলের স্ট্রিং কনটেনটেশন, একই জিনিসটির জন্য এটির মধ্যে কোনও পার্থক্য নেই। আপনাকে একটি সাধারণ ফাংশনে একটি পুরানো শৈলীর স্ট্রিং জেনারেটরটি আবৃত করতে হবে এবং একই জিনিস স্ট্রিং টেম্পলেটগুলির সাথে দুর্দান্ত কাজ করে। const compile = (x, y) => `I can call this template string whenever I want.. x=${x}, y=${y}`...compile(30, 20)
চেম্বারলাইন

4
এই সমাধানটি ভেরিয়েবলে (যেমন সার্ভার থেকে) ফরম্যাট স্ট্রিংয়ের জন্য কাজ করবে না
user993954

1
@ ইনানটশেলাস এটি কার্যকর হয় যদি আপনার টেম্পলেট ফাংশনটি একই মেশিনে নির্ধারণ করা হয় যেখানে এটি কার্যকর করা হয়। আমি যতদূর জানি, আপনি জেএসএন হিসাবে কোনও ফাংশন পাস করতে পারবেন না, সুতরাং একটি ডাটাবেসে টেম্পলেট ফাংশন সংরক্ষণ করা ভাল কাজ করে না।
স্টাইলফ্ল

171

jsxt, জিপ্পো

এই বিকল্পটি আরও ভাল ফিট করে।

String.prototype.format = function() {
    var formatted = this;
    for (var i = 0; i < arguments.length; i++) {
        var regexp = new RegExp('\\{'+i+'\\}', 'gi');
        formatted = formatted.replace(regexp, arguments[i]);
    }
    return formatted;
};

এই বিকল্পের সাহায্যে আমি এর মতো স্ট্রিংগুলি প্রতিস্থাপন করতে পারি:

'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');

আপনার কোডের সাথে দ্বিতীয় {0 replaced প্রতিস্থাপন করা হবে না। ;)


3
gist.github.com/1049426 এই পদ্ধতির সাথে আমি আপনার উদাহরণ আপডেট করেছি। নেটিভ বাস্তবায়ন এটি উপস্থিত থাকলে সংরক্ষণ করা, স্ট্রিংফাইং ইত্যাদিসহ বিভিন্ন সুবিধা I : - /
tbranyen

6
jsxt দুর্ভাগ্যক্রমে জিপিএল-লাইসেন্সযুক্ত
অ্যান্ডিডগ

109

আমি এই সাধারণ ফাংশনটি ব্যবহার করি:

String.prototype.format = function() {
    var formatted = this;
    for( var arg in arguments ) {
        formatted = formatted.replace("{" + arg + "}", arguments[arg]);
    }
    return formatted;
};

এটি স্ট্রিং.ফোর্মটের সাথে খুব মিল:

"{0} is dead, but {1} is alive!".format("ASP", "ASP.NET")

1
কেন +=?, এটি করা উচিতformatted = this.replace("{" + arg + "}", arguments[arg]);
গিলিন 桂林

2
আমি মনে করি কোডটি এখনও সঠিক নয়। সঠিক একটি ফিলিপিজের পোস্টের মতো হওয়া উচিত ।
ওয়েনকিয়াং

3
রেফারেন্সের জন্য, for...inপ্রতিটি ব্রাউজারে এই কোডটি যেমনটি প্রত্যাশা করে তেমন কাজ করবে না। এটি সমস্ত সংখ্যক বৈশিষ্ট্য লুপ করবে, যা কিছু ব্রাউজারে অন্তর্ভুক্ত থাকবে arguments.lengthএবং অন্যগুলিতে এমনকি যুক্তিগুলি নিজেরাই অন্তর্ভুক্ত করবে না। যাই হোক না কেন, Object.prototypeযুক্ত করা হয়, কোনও সংযোজন সম্ভবত গুচ্ছ অন্তর্ভুক্ত করা হবে। কোডটি forবরং একটি মান লুপ ব্যবহার করা উচিত for...in
সিএওও

3
যদি কোনও পূর্ববর্তী প্রতিস্থাপনের পাশাপাশি একটি ফর্ম্যাট স্ট্রিং থাকে তবে এটি ব্যর্থ হয়:"{0} is dead, but {1} is alive!".format("{1}", "ASP.NET") === "ASP.NET is dead, but ASP.NET is alive!"
গম্বো

6
পরিবর্তনশীলটি argবিশ্বব্যাপী। পরিবর্তে আপনার এটি করা দরকার:for (var arg in arguments) {
পৌন

68

নোড.জেস ব্যবহারকারীদের জন্য প্রিন্টফেরutil.format মতো কার্যকারিতা রয়েছে:

util.format("%s world", "Hello")

1
এটি নোড v0.10.26 হিসাবে% x সমর্থন করে না
ম্যাক্স ক্রোহন

প্রস্থ এবং প্রান্তিককরণ সংশোধকগুলিকেও সমর্থন করে না (উদাহরণস্বরূপ %-20s %5.2f)
এফজিএম

এই দরকারী উত্তরটি দেখার জন্য আমাকে সমস্ত পৃষ্ঠায় স্ক্রোল করতে হয়েছিল।
দোনাতো

53

আমি অবাক হয়েছি কেউ ব্যবহার করেনি reduce, এটি একটি দেশীয় সংক্ষিপ্ত এবং শক্তিশালী জাভাস্ক্রিপ্ট ফাংশন।

ES6 (একমা স্ক্রিপ্ট ২০১৫)

String.prototype.format = function() {
  return [...arguments].reduce((p,c) => p.replace(/%s/,c), this);
};

console.log('Is that a %s or a %s?... No, it\'s %s!'.format('plane', 'bird', 'SOman'));

<ES6

function interpolate(theString, argumentArray) {
    var regex = /%s/;
    var _r=function(p,c){return p.replace(regex,c);}
    return argumentArray.reduce(_r, theString);
}

interpolate("%s, %s and %s", ["Me", "myself", "I"]); // "Me, myself and I"

কিভাবে এটা কাজ করে:

হ্রাস একটি সংযোজকের বিরুদ্ধে ফাংশন এবং অ্যারেতে প্রতিটি উপাদান (বাম থেকে ডানে) প্রয়োগ করে একে একক মান হ্রাস করতে।

var _r= function(p,c){return p.replace(/%s/,c)};

console.log(
  ["a", "b", "c"].reduce(_r, "[%s], [%s] and [%s]") + '\n',
  [1, 2, 3].reduce(_r, "%s+%s=%s") + '\n',
  ["cool", 1337, "stuff"].reduce(_r, "%s %s %s")
);


4
সরলীকৃত printfফাংশন তৈরি করতে এই পদ্ধতির ব্যবহার করে এমন একটি সংস্করণ এখানে রয়েছে : jsfiddle.net/11szrbx9
ডেম পিলাফিয়ান

1
এবং এখানে এক লাইনে ES6 ব্যবহার করে অন্য একটি:(...a) => {return a.reduce((p: string, c: any) => p.replace(/%s/, c));
dtasev

String.prototype.formatES6- তে কোনও দরকার নেই : ((a,b,c)=>`${a}, ${b} and ${c}`)(...['me', 'myself', 'I'])(আপনার উদাহরণে আরও ফিট করার জন্য এটি কিছুটা রিডানড্যান্ট মনে করুন)
টিনো

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

51

এখানে জাভাস্ক্রিপ্টে স্প্রিন্টফের একটি ন্যূনতম বাস্তবায়ন: এটি কেবল "% s" এবং "% d" করে, তবে এটি বাড়ানোর জন্য আমি স্থান রেখেছি have এটি ওপির পক্ষে অকার্যকর, তবে গুগল থেকে আসা এই থ্রেডটি জুড়ে যে লোকেরা হোঁচট খায় তারা এ থেকে উপকৃত হতে পারে।

function sprintf() {
    var args = arguments,
    string = args[0],
    i = 1;
    return string.replace(/%((%)|s|d)/g, function (m) {
        // m is the matched format, e.g. %s, %d
        var val = null;
        if (m[2]) {
            val = m[2];
        } else {
            val = args[i];
            // A switch statement so that the formatter can be extended. Default is %s
            switch (m) {
                case '%d':
                    val = parseFloat(val);
                    if (isNaN(val)) {
                        val = 0;
                    }
                    break;
            }
            i++;
        }
        return val;
    });
}

উদাহরণ:

alert(sprintf('Latitude: %s, Longitude: %s, Count: %d', 41.847, -87.661, 'two'));
// Expected output: Latitude: 41.847, Longitude: -87.661, Count: 0

পূর্ববর্তী প্রত্যুত্তরগুলি অনুরূপ সমাধান সঙ্গে বিপরীতে, এই এক সব বদল করে এক বারেই , তাই এটি পূর্বে প্রতিস্থাপিত মূল্যবোধের অংশ প্রতিস্থাপন করা হবে না।


31

জাভাস্ক্রিপ্ট প্রোগ্রামাররা https://github.com/ildar-shaimordanov/jsxt/blob/master/js/String.js এ স্ট্রিং.প্রোটোটাইপ.স্প্রিন্টফ ব্যবহার করতে পারেন । নীচে উদাহরণস্বরূপ:

var d = new Date();
var dateStr = '%02d:%02d:%02d'.sprintf(
    d.getHours(), 
    d.getMinutes(), 
    d.getSeconds());

@ জেসনমোরগান, আমি গিটহাবের কার্যকারী লিঙ্কটি ভাগ করে নিয়েছি the সঠিক উত্তরটি দেখুন।
jsxt

24

যোগ করা হচ্ছে zippoxerএর উত্তর, আমি এই ফাংশন ব্যবহার করুন:

String.prototype.format = function () {
    var a = this, b;
    for (b in arguments) {
        a = a.replace(/%[a-z]/, arguments[b]);
    }
    return a; // Make chainable
};

var s = 'Hello %s The magic number is %d.';
s.format('world!', 12); // Hello World! The magic number is 12.

আমার একটি নন-প্রোটোটাইপ সংস্করণও রয়েছে যা আমি এর জাভা-জাতীয় সিনট্যাক্সের জন্য প্রায়শই ব্যবহার করি:

function format() {
    var a, b, c;
    a = arguments[0];
    b = [];
    for(c = 1; c < arguments.length; c++){
        b.push(arguments[c]);
    }
    for (c in b) {
        a = a.replace(/%[a-z]/, b[c]);
    }
    return a;
}
format('%d ducks, 55 %s', 12, 'cats'); // 12 ducks, 55 cats

ES 2015 আপডেট

ইএস 2015 এর সমস্ত দুর্দান্ত নতুন জিনিস এটিকে অনেক সহজ করে তুলেছে:

function format(fmt, ...args){
    return fmt
        .split("%%")
        .reduce((aggregate, chunk, i) =>
            aggregate + chunk + (args[i] || ""), "");
}

format("Hello %%! I ate %% apples today.", "World", 44);
// "Hello World, I ate 44 apples today."

আমি বুঝতে পেরেছি যেহেতু প্রবীণদের মতো এটিও অক্ষরগুলি বিশ্লেষণ করে না, এটি কেবল একটি টোকন ব্যবহার করতে পারে %%। এর সুস্পষ্ট হওয়ার সুবিধা রয়েছে এবং একটিও ব্যবহার করা কঠিন না করে %। তবে, যদি আপনার %%কোনও কারণে প্রয়োজন হয় তবে আপনার নিজের সাথে এটি প্রতিস্থাপন করতে হবে:

format("I love percentage signs! %%", "%%");
// "I love percentage signs! %%"

3
এই উত্তরটি একটি বিদ্যমান ফাংশনে একটি দ্রুত কপির পেস্ট করার জন্য দুর্দান্ত ছিল। কোনও ডাউনলোড ইত্যাদি প্রয়োজন নেই
নিক

@ নিক হাঁ, এটি ধারণা :)
ব্র্যাডেন সেরা

21

+1 জিপ্পো ব্যতীত যে ফাংশন বডিটি নীচে হিসাবে হওয়া দরকার বা অন্যথায় এটি প্রতিটি পুনরুক্তিতে বর্তমান স্ট্রিং যুক্ত করে:

String.prototype.format = function() {
    var formatted = this;
    for (var arg in arguments) {
        formatted = formatted.replace("{" + arg + "}", arguments[arg]);
    }
    return formatted;
};

1
এটি ফায়ারফক্সে কাজ করে নি। ডিবাগার শোটি সংজ্ঞায়িত হিসাবে আর্গুমেন্ট করে।
xiao 啸

এটি 'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP'); ফলাফলটি দ্বিতীয় চরিত্রটিকে প্রতিস্থাপন করে না The ASP is dead. Don't code {0}. Code PHP that is open source!। আই-তে আরও একটি জিনিস কাজ for(arg in arguments)করে না। আমি প্রতিস্থাপন করেছি for (arg = 0; arg <arguments.length; arg++)
সমরজিৎ সামন্ত

2
রেফারেন্সের জন্য, for...inপ্রতিটি ব্রাউজারে এই কোডটি যেমনটি প্রত্যাশা করে তেমন কাজ করবে না। এটি সমস্ত সংখ্যক বৈশিষ্ট্য লুপ করবে, যা কিছু ব্রাউজারে অন্তর্ভুক্ত থাকবে arguments.lengthএবং অন্যগুলিতে এমনকি যুক্তিগুলি নিজেরাই অন্তর্ভুক্ত করবে না। যাই হোক না কেন, Object.prototypeযুক্ত করা হয়, কোনও সংযোজন সম্ভবত গুচ্ছ অন্তর্ভুক্ত করা হবে। কোডটি forবরং একটি মান লুপ ব্যবহার করা উচিত for...in
সিএওও

সদৃশ উত্তরের পরিবর্তে আপনার একটি উত্তর সম্পাদনার প্রস্তাব দেওয়া উচিত। এই নকল এই উত্তর
RousseauAlexandre

19

আমি 'সমস্যার' জন্য আমার সমাধান ভাগ করতে চাই। আমি চাকাটি পুনরায় উদ্ভাবন করি নি তবে জাভাস্ক্রিপ্ট ইতিমধ্যে যা করেছে তার উপর ভিত্তি করে একটি সমাধান সন্ধান করার চেষ্টা করেছি। সুবিধাটি হ'ল, আপনি নিখরচায় সমস্ত অন্তর্নিহিত রূপান্তরগুলি পান। স্ট্রিংয়ের প্রোটোটাইপ সম্পত্তি সেট করা একটি খুব সুন্দর এবং কমপ্যাক্ট বাক্য গঠন দেয় (নীচের উদাহরণগুলি দেখুন)। এটি সম্ভবত সবচেয়ে কার্যকর উপায় নয়, তবে বেশিরভাগ ক্ষেত্রে আউটপুট নিয়ে কাজ করার ক্ষেত্রে এটির জন্য উচ্চতর অনুকূলিতকরণের প্রয়োজন নেই।

String.form = function(str, arr) {
    var i = -1;
    function callback(exp, p0, p1, p2, p3, p4) {
        if (exp=='%%') return '%';
        if (arr[++i]===undefined) return undefined;
        exp  = p2 ? parseInt(p2.substr(1)) : undefined;
        var base = p3 ? parseInt(p3.substr(1)) : undefined;
        var val;
        switch (p4) {
            case 's': val = arr[i]; break;
            case 'c': val = arr[i][0]; break;
            case 'f': val = parseFloat(arr[i]).toFixed(exp); break;
            case 'p': val = parseFloat(arr[i]).toPrecision(exp); break;
            case 'e': val = parseFloat(arr[i]).toExponential(exp); break;
            case 'x': val = parseInt(arr[i]).toString(base?base:16); break;
            case 'd': val = parseFloat(parseInt(arr[i], base?base:10).toPrecision(exp)).toFixed(0); break;
        }
        val = typeof(val)=='object' ? JSON.stringify(val) : val.toString(base);
        var sz = parseInt(p1); /* padding size */
        var ch = p1 && p1[0]=='0' ? '0' : ' '; /* isnull? */
        while (val.length<sz) val = p0 !== undefined ? val+ch : ch+val; /* isminus? */
       return val;
    }
    var regex = /%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g;
    return str.replace(regex, callback);
}

String.prototype.$ = function() {
    return String.form(this, Array.prototype.slice.call(arguments));
}

এখানে কিছু উদাহরণ আছে:

String.format("%s %s", [ "This is a string", 11 ])
console.log("%s %s".$("This is a string", 11))
var arr = [ "12.3", 13.6 ]; console.log("Array: %s".$(arr));
var obj = { test:"test", id:12 }; console.log("Object: %s".$(obj));
console.log("%c", "Test");
console.log("%5d".$(12)); // '   12'
console.log("%05d".$(12)); // '00012'
console.log("%-5d".$(12)); // '12   '
console.log("%5.2d".$(123)); // '  120'
console.log("%5.2f".$(1.1)); // ' 1.10'
console.log("%10.2e".$(1.1)); // '   1.10e+0'
console.log("%5.3p".$(1.12345)); // ' 1.12'
console.log("%5x".$(45054)); // ' affe'
console.log("%20#2x".$("45054")); // '    1010111111111110'
console.log("%6#2d".$("111")); // '     7'
console.log("%6#16d".$("affe")); // ' 45054'

দুর্ভাগ্যক্রমে কমপক্ষে # এবং + ফ্লোটগুলির জন্য প্রয়োগ করা হয় না।
ড্যানিয়েল

15

আমি আমার নিজের আবিষ্কারগুলি আবিষ্কার করব যা আমি জিজ্ঞাসা করে পেয়েছি:

দুঃখজনকভাবে দেখে মনে হচ্ছে স্প্রিন্টফ .NET এর স্ট্রিং ফর্ম্যাটের মতো হাজার বিভাজক বিন্যাস পরিচালনা করে না।


14

আমি জাভাস্ক্রিপ্টের জন্য স্ট্রিং.ফর্ম্যাট নামে একটি ছোট লাইব্রেরি ব্যবহার করি যা বেশিরভাগ বিন্যাসের স্ট্রিং ক্ষমতা (সংখ্যা এবং তারিখের বিন্যাস সহ) সমর্থন করে এবং নেট সিনট্যাক্স ব্যবহার করে। স্ক্রিপ্টটি নিজেই 4 কেবি এর চেয়ে ছোট, সুতরাং এটি ওভারহেডের বেশি তৈরি করে না।


আমি সেই লাইব্রেরিতে একবার দেখেছিলাম এবং এটি দেখতে দুর্দান্ত দেখাচ্ছে। ডাউনলোডটি একটি EXE ছিল দেখে আমি খুব হতাশ হয়ে পড়েছিলাম। এই হ্যাক কি সম্পর্কে? ডাউনলোড করেনি।
জেসেগাবিন

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

যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
স্টারমোল

@ স্টারমোল লিঙ্কটি একটি (মাইনযুক্ত) 4 কেবি জাভাস্ক্রিপ্ট লাইব্রেরির জন্য । আমি উত্তরে এটি আটকানো একটি ভাল ধারণা বিশ্বাস করি না।
ivarni

আপনি ঠিক পেস্ট করছেন এটি আর ভাল হবে না। আমি এলোমেলো পর্যালোচনার জন্য এই মন্তব্যটি পেয়েছি - এবং এটি অপছন্দ করার আগে মন্তব্য করেছে। আমার কাছে স্ট্যাকওভারফ্লো রেডিমেড সলিউশনগুলির পরিবর্তে (যা লিঙ্কটি হ'ল) ​​ব্যাখ্যাগুলি সরবরাহ করার সময় ভাল। আমি লোকেরা ব্ল্যাক-বক্স কোড পোস্ট করতে বা ডাউনলোড করতে উত্সাহিত করতে চাই না।
স্টারমোল

14

খুব মার্জিত:

String.prototype.format = function (){
    var args = arguments;
    return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (curlyBrack, index) {
        return ((curlyBrack == "{{") ? "{" : ((curlyBrack == "}}") ? "}" : args[index]));
    });
};

// Usage:
"{0}{1}".format("{1}", "{0}")

ক্রেডিট যায় (ছিন্ন সুত্র) https://gist.github.com/0i0/1519811


এটি কেবলমাত্র একমাত্র যা পালানোর বন্ধনী {{0}}এবং সেই সাথে পছন্দসই জিনিসগুলি পরিচালনা করে {0}{1}.format("{1}", "{0}")। একেবারে শীর্ষে থাকা উচিত!
হুয়ান

11

আপনি যদি হাজার হাজার বিভাজককে পরিচালনা করতে চান তবে জাভাস্ক্রিপ্ট নম্বর শ্রেণি থেকে আপনার সত্যিই লোকাল স্ট্রিং () ব্যবহার করা উচিত কারণ এটি ব্যবহারকারীর অঞ্চলে স্ট্রিংটি ফর্ম্যাট করবে।

জাভাস্ক্রিপ্ট তারিখ শ্রেণি স্থানীয়করণের তারিখ এবং সময়গুলি ফর্ম্যাট করতে পারে।


1
এটি আসলে অ্যাপ্লিকেশনটিতে একটি সেটিংস হিসাবে মেশিন দ্বারা সেট করা (মেশিনটি তাদের চালু নয়) তবে আমি একবার দেখে নেব, ধন্যবাদ
ক্রিস এস

কয়েকটি উদাহরণ যুক্ত করুন যাতে প্রত্যেকে এটি দ্রুত বুঝতে পারে।
ভূষণ কাওয়াদকার

9

PHPJS প্রকল্পের পিএইচপি এর ফাংশন অনেকের জন্য জাভাস্ক্রিপ্ট বাস্তবায়নের লিখেছেন। যেহেতু পিএইচপি এর sprintf()ফাংশন মূলত সি এর হিসাবে একই printf(), এটা তাদের জাভাস্ক্রিপ্ট বাস্তবায়ন আপনার প্রয়োজন সন্তুষ্ট করা উচিত নয়।


9

আমি এটি ব্যবহার করি:

String.prototype.format = function() {
    var newStr = this, i = 0;
    while (/%s/.test(newStr))
        newStr = newStr.replace("%s", arguments[i++])

    return newStr;
}

তারপর আমি এটি কল:

"<h1>%s</h1><p>%s</p>".format("Header", "Just a test!");

9

আমার কাছে পিটারের খুব কাছেই একটি সমাধান রয়েছে তবে এটি সংখ্যা এবং অবজেক্টের ক্ষেত্রে ডিল করে।

if (!String.prototype.format) {
  String.prototype.format = function() {
    var args;
    args = arguments;
    if (args.length === 1 && args[0] !== null && typeof args[0] === 'object') {
      args = args[0];
    }
    return this.replace(/{([^}]*)}/g, function(match, key) {
      return (typeof args[key] !== "undefined" ? args[key] : match);
    });
  };
}

সমস্ত গভীরতর কেসগুলি মোকাবেলা করা আরও ভাল হতে পারে তবে আমার প্রয়োজনের জন্য এটি ঠিক আছে।

"This is an example from {name}".format({name:"Blaine"});
"This is an example from {0}".format("Blaine");

PS: আপনি যদি AngularJS এর মতো টেম্পলেট ফ্রেমওয়ার্কগুলিতে অনুবাদ ব্যবহার করেন তবে এই ফাংশনটি খুব দুর্দান্ত :

<h1> {{('hello-message'|translate).format(user)}} <h1>
<h1> {{('hello-by-name'|translate).format( user ? user.name : 'You' )}} <h1>

যেখানে en.json এর মত কিছু

{
    "hello-message": "Hello {name}, welcome.",
    "hello-by-name": "Hello {0}, welcome."
}

নতুন এক্সপ্লোরের সাথে মেলে তুলতে রিজেক্সেপ্টের [^}] অংশটি অনিবার্য .. পরিবর্তে {(। *?) use ব্যবহার করুন বা আরও ভাল {([[\ s \ এস] *?)) ব্যবহার করুন।
কাঁচেরো

7

একটি খুব সামান্য ভিন্ন সংস্করণ, আমি পছন্দ করি (এটি একটি {0} সংখ্যাযুক্ত যুক্তির চেয়ে {xxx xx টোকেন ব্যবহার করে, এটি অনেক বেশি স্ব-ডকুমেন্টিং এবং স্থানীয়করণের পক্ষে আরও ভাল মানায়):

String.prototype.format = function(tokens) {
  var formatted = this;
  for (var token in tokens)
    if (tokens.hasOwnProperty(token))
      formatted = formatted.replace(RegExp("{" + token + "}", "g"), tokens[token]);
  return formatted;
};

তারতম্যটি হ'ল:

  var formatted = l(this);

এটি প্রথমে একটি এল () স্থানীয়করণ ফাংশন কল করে।



6

যারা নোড.জেএস এবং এর util.formatবৈশিষ্ট্য পছন্দ করেন তাদের জন্য , আমি কেবল এটির ভ্যানিলা জাভাস্ক্রিপ্ট ফর্মটিতে বের করেছি (কেবলমাত্র ফাংশন যা ইউজার.ফর্ম্যাট ব্যবহার করে):

exports = {};

function isString(arg) {
    return typeof arg === 'string';
}
function isNull(arg) {
    return arg === null;
}
function isObject(arg) {
    return typeof arg === 'object' && arg !== null;
}
function isBoolean(arg) {
    return typeof arg === 'boolean';
}
function isUndefined(arg) {
    return arg === void 0;
}
function stylizeNoColor(str, styleType) {
    return str;
}
function stylizeWithColor(str, styleType) {
    var style = inspect.styles[styleType];

    if (style) {
        return '\u001b[' + inspect.colors[style][0] + 'm' + str +
            '\u001b[' + inspect.colors[style][3] + 'm';
    } else {
        return str;
    }
}
function isFunction(arg) {
    return typeof arg === 'function';
}
function isNumber(arg) {
    return typeof arg === 'number';
}
function isSymbol(arg) {
    return typeof arg === 'symbol';
}
function formatPrimitive(ctx, value) {
    if (isUndefined(value))
        return ctx.stylize('undefined', 'undefined');
    if (isString(value)) {
        var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
                .replace(/'/g, "\\'")
                .replace(/\\"/g, '"') + '\'';
        return ctx.stylize(simple, 'string');
    }
    if (isNumber(value)) {
        // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
        // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
        if (value === 0 && 1 / value < 0)
            return ctx.stylize('-0', 'number');
        return ctx.stylize('' + value, 'number');
    }
    if (isBoolean(value))
        return ctx.stylize('' + value, 'boolean');
    // For some reason typeof null is "object", so special case here.
    if (isNull(value))
        return ctx.stylize('null', 'null');
    // es6 symbol primitive
    if (isSymbol(value))
        return ctx.stylize(value.toString(), 'symbol');
}
function arrayToHash(array) {
    var hash = {};

    array.forEach(function (val, idx) {
        hash[val] = true;
    });

    return hash;
}
function objectToString(o) {
    return Object.prototype.toString.call(o);
}
function isDate(d) {
    return isObject(d) && objectToString(d) === '[object Date]';
}
function isError(e) {
    return isObject(e) &&
        (objectToString(e) === '[object Error]' || e instanceof Error);
}
function isRegExp(re) {
    return isObject(re) && objectToString(re) === '[object RegExp]';
}
function formatError(value) {
    return '[' + Error.prototype.toString.call(value) + ']';
}
function formatPrimitiveNoColor(ctx, value) {
    var stylize = ctx.stylize;
    ctx.stylize = stylizeNoColor;
    var str = formatPrimitive(ctx, value);
    ctx.stylize = stylize;
    return str;
}
function isArray(ar) {
    return Array.isArray(ar);
}
function hasOwnProperty(obj, prop) {
    return Object.prototype.hasOwnProperty.call(obj, prop);
}
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
    var name, str, desc;
    desc = Object.getOwnPropertyDescriptor(value, key) || {value: value[key]};
    if (desc.get) {
        if (desc.set) {
            str = ctx.stylize('[Getter/Setter]', 'special');
        } else {
            str = ctx.stylize('[Getter]', 'special');
        }
    } else {
        if (desc.set) {
            str = ctx.stylize('[Setter]', 'special');
        }
    }
    if (!hasOwnProperty(visibleKeys, key)) {
        name = '[' + key + ']';
    }
    if (!str) {
        if (ctx.seen.indexOf(desc.value) < 0) {
            if (isNull(recurseTimes)) {
                str = formatValue(ctx, desc.value, null);
            } else {
                str = formatValue(ctx, desc.value, recurseTimes - 1);
            }
            if (str.indexOf('\n') > -1) {
                if (array) {
                    str = str.split('\n').map(function (line) {
                        return '  ' + line;
                    }).join('\n').substr(2);
                } else {
                    str = '\n' + str.split('\n').map(function (line) {
                        return '   ' + line;
                    }).join('\n');
                }
            }
        } else {
            str = ctx.stylize('[Circular]', 'special');
        }
    }
    if (isUndefined(name)) {
        if (array && key.match(/^\d+$/)) {
            return str;
        }
        name = JSON.stringify('' + key);
        if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
            name = name.substr(1, name.length - 2);
            name = ctx.stylize(name, 'name');
        } else {
            name = name.replace(/'/g, "\\'")
                .replace(/\\"/g, '"')
                .replace(/(^"|"$)/g, "'")
                .replace(/\\\\/g, '\\');
            name = ctx.stylize(name, 'string');
        }
    }

    return name + ': ' + str;
}
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
    var output = [];
    for (var i = 0, l = value.length; i < l; ++i) {
        if (hasOwnProperty(value, String(i))) {
            output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
                String(i), true));
        } else {
            output.push('');
        }
    }
    keys.forEach(function (key) {
        if (!key.match(/^\d+$/)) {
            output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
                key, true));
        }
    });
    return output;
}
function reduceToSingleString(output, base, braces) {
    var length = output.reduce(function (prev, cur) {
        return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
    }, 0);

    if (length > 60) {
        return braces[0] +
            (base === '' ? '' : base + '\n ') +
            ' ' +
            output.join(',\n  ') +
            ' ' +
            braces[1];
    }

    return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
}
function formatValue(ctx, value, recurseTimes) {
    // Provide a hook for user-specified inspect functions.
    // Check that value is an object with an inspect function on it
    if (ctx.customInspect &&
        value &&
        isFunction(value.inspect) &&
            // Filter out the util module, it's inspect function is special
        value.inspect !== exports.inspect &&
            // Also filter out any prototype objects using the circular check.
        !(value.constructor && value.constructor.prototype === value)) {
        var ret = value.inspect(recurseTimes, ctx);
        if (!isString(ret)) {
            ret = formatValue(ctx, ret, recurseTimes);
        }
        return ret;
    }

    // Primitive types cannot have properties
    var primitive = formatPrimitive(ctx, value);
    if (primitive) {
        return primitive;
    }

    // Look up the keys of the object.
    var keys = Object.keys(value);
    var visibleKeys = arrayToHash(keys);

    if (ctx.showHidden) {
        keys = Object.getOwnPropertyNames(value);
    }

    // This could be a boxed primitive (new String(), etc.), check valueOf()
    // NOTE: Avoid calling `valueOf` on `Date` instance because it will return
    // a number which, when object has some additional user-stored `keys`,
    // will be printed out.
    var formatted;
    var raw = value;
    try {
        // the .valueOf() call can fail for a multitude of reasons
        if (!isDate(value))
            raw = value.valueOf();
    } catch (e) {
        // ignore...
    }

    if (isString(raw)) {
        // for boxed Strings, we have to remove the 0-n indexed entries,
        // since they just noisey up the output and are redundant
        keys = keys.filter(function (key) {
            return !(key >= 0 && key < raw.length);
        });
    }

    // Some type of object without properties can be shortcutted.
    if (keys.length === 0) {
        if (isFunction(value)) {
            var name = value.name ? ': ' + value.name : '';
            return ctx.stylize('[Function' + name + ']', 'special');
        }
        if (isRegExp(value)) {
            return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
        }
        if (isDate(value)) {
            return ctx.stylize(Date.prototype.toString.call(value), 'date');
        }
        if (isError(value)) {
            return formatError(value);
        }
        // now check the `raw` value to handle boxed primitives
        if (isString(raw)) {
            formatted = formatPrimitiveNoColor(ctx, raw);
            return ctx.stylize('[String: ' + formatted + ']', 'string');
        }
        if (isNumber(raw)) {
            formatted = formatPrimitiveNoColor(ctx, raw);
            return ctx.stylize('[Number: ' + formatted + ']', 'number');
        }
        if (isBoolean(raw)) {
            formatted = formatPrimitiveNoColor(ctx, raw);
            return ctx.stylize('[Boolean: ' + formatted + ']', 'boolean');
        }
    }

    var base = '', array = false, braces = ['{', '}'];

    // Make Array say that they are Array
    if (isArray(value)) {
        array = true;
        braces = ['[', ']'];
    }

    // Make functions say that they are functions
    if (isFunction(value)) {
        var n = value.name ? ': ' + value.name : '';
        base = ' [Function' + n + ']';
    }

    // Make RegExps say that they are RegExps
    if (isRegExp(value)) {
        base = ' ' + RegExp.prototype.toString.call(value);
    }

    // Make dates with properties first say the date
    if (isDate(value)) {
        base = ' ' + Date.prototype.toUTCString.call(value);
    }

    // Make error with message first say the error
    if (isError(value)) {
        base = ' ' + formatError(value);
    }

    // Make boxed primitive Strings look like such
    if (isString(raw)) {
        formatted = formatPrimitiveNoColor(ctx, raw);
        base = ' ' + '[String: ' + formatted + ']';
    }

    // Make boxed primitive Numbers look like such
    if (isNumber(raw)) {
        formatted = formatPrimitiveNoColor(ctx, raw);
        base = ' ' + '[Number: ' + formatted + ']';
    }

    // Make boxed primitive Booleans look like such
    if (isBoolean(raw)) {
        formatted = formatPrimitiveNoColor(ctx, raw);
        base = ' ' + '[Boolean: ' + formatted + ']';
    }

    if (keys.length === 0 && (!array || value.length === 0)) {
        return braces[0] + base + braces[1];
    }

    if (recurseTimes < 0) {
        if (isRegExp(value)) {
            return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
        } else {
            return ctx.stylize('[Object]', 'special');
        }
    }

    ctx.seen.push(value);

    var output;
    if (array) {
        output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
    } else {
        output = keys.map(function (key) {
            return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
        });
    }

    ctx.seen.pop();

    return reduceToSingleString(output, base, braces);
}
function inspect(obj, opts) {
    // default options
    var ctx = {
        seen: [],
        stylize: stylizeNoColor
    };
    // legacy...
    if (arguments.length >= 3) ctx.depth = arguments[2];
    if (arguments.length >= 4) ctx.colors = arguments[3];
    if (isBoolean(opts)) {
        // legacy...
        ctx.showHidden = opts;
    } else if (opts) {
        // got an "options" object
        exports._extend(ctx, opts);
    }
    // set default options
    if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
    if (isUndefined(ctx.depth)) ctx.depth = 2;
    if (isUndefined(ctx.colors)) ctx.colors = false;
    if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
    if (ctx.colors) ctx.stylize = stylizeWithColor;
    return formatValue(ctx, obj, ctx.depth);
}
exports.inspect = inspect;


// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
inspect.colors = {
    'bold': [1, 22],
    'italic': [3, 23],
    'underline': [4, 24],
    'inverse': [7, 27],
    'white': [37, 39],
    'grey': [90, 39],
    'black': [30, 39],
    'blue': [34, 39],
    'cyan': [36, 39],
    'green': [32, 39],
    'magenta': [35, 39],
    'red': [31, 39],
    'yellow': [33, 39]
};

// Don't use 'blue' not visible on cmd.exe
inspect.styles = {
    'special': 'cyan',
    'number': 'yellow',
    'boolean': 'yellow',
    'undefined': 'grey',
    'null': 'bold',
    'string': 'green',
    'symbol': 'green',
    'date': 'magenta',
    // "name": intentionally not styling
    'regexp': 'red'
};


var formatRegExp = /%[sdj%]/g;
exports.format = function (f) {
    if (!isString(f)) {
        var objects = [];
        for (var j = 0; j < arguments.length; j++) {
            objects.push(inspect(arguments[j]));
        }
        return objects.join(' ');
    }

    var i = 1;
    var args = arguments;
    var len = args.length;
    var str = String(f).replace(formatRegExp, function (x) {
        if (x === '%%') return '%';
        if (i >= len) return x;
        switch (x) {
            case '%s':
                return String(args[i++]);
            case '%d':
                return Number(args[i++]);
            case '%j':
                try {
                    return JSON.stringify(args[i++]);
                } catch (_) {
                    return '[Circular]';
                }
            default:
                return x;
        }
    });
    for (var x = args[i]; i < len; x = args[++i]) {
        if (isNull(x) || !isObject(x)) {
            str += ' ' + x;
        } else {
            str += ' ' + inspect(x);
        }
    }
    return str;
};

থেকে সংগ্রহ করা: https://github.com/joyent/node/blob/master/lib/util.js



5

আমার এখানে জাভাস্ক্রিপ্টের জন্য কিছুটা দীর্ঘ ফর্ম্যাটর রয়েছে ...

আপনি বিভিন্ন উপায়ে ফর্ম্যাট করতে পারেন:

  • String.format(input, args0, arg1, ...)
  • String.format(input, obj)
  • "literal".format(arg0, arg1, ...)
  • "literal".format(obj)

এছাড়াও, যদি আপনি কোনও অবজেক্টবেস.প্রোটোটাইপ.ফর্ম্যাট (যেমন ডেটজেএস সহ ) বলেন তবে এটি এটি ব্যবহার করবে।

উদাহরণ ...

var input = "numbered args ({0}-{1}-{2}-{3})";
console.log(String.format(input, "first", 2, new Date()));
//Outputs "numbered args (first-2-Thu May 31 2012...Time)-{3})"

console.log(input.format("first", 2, new Date()));
//Outputs "numbered args(first-2-Thu May 31 2012...Time)-{3})"

console.log(input.format(
    "object properties ({first}-{second}-{third:yyyy-MM-dd}-{fourth})"
    ,{
        'first':'first'
        ,'second':2
        ,'third':new Date() //assumes Date.prototype.format method
    }
));
//Outputs "object properties (first-2-2012-05-31-{3})"

ইতিমধ্যে স্ট্রিং. ফর্ম্যাট (যেমন এমএস অ্যাজাক্স টুলকিটের সাথে (আমি সেই লাইব্রেরিটিকে ঘৃণা করি) এর ক্ষেত্রে আমি .as Format এর সাথেও ক্যারিজ করেছি এবং কিছু জায়গায় সনাক্ত করেছি।


5

দূষিত বৈশ্বিক সুযোগকে রোধ করতে কারও কারও প্রয়োজন হলে, এখানে একই কাজটি করা হয়:

  function _format (str, arr) {
    return str.replace(/{(\d+)}/g, function (match, number) {
      return typeof arr[number] != 'undefined' ? arr[number] : match;
    });
  };

3

আমরা টাইপসক্রিপ্টের জন্য একটি সহজ লাইটওয়েট স্ট্রিং.ফর্ম্যাট স্ট্রিং অপারেশন লাইব্রেরি ব্যবহার করতে পারি।

String.Format ():

var id = image.GetId()
String.Format("image_{0}.jpg", id)
output: "image_2db5da20-1c5d-4f1a-8fd4-b41e34c8c5b5.jpg";

নির্দিষ্টকরণকারীদের জন্য স্ট্রিং ফর্ম্যাট:

var value = String.Format("{0:L}", "APPLE"); //output "apple"

value = String.Format("{0:U}", "apple"); // output "APPLE"

value = String.Format("{0:d}", "2017-01-23 00:00"); //output "23.01.2017"


value = String.Format("{0:s}", "21.03.2017 22:15:01") //output "2017-03-21T22:15:01"

value = String.Format("{0:n}", 1000000);
//output "1.000.000"

value = String.Format("{0:00}", 1);
//output "01"

স্পেসিফায়ার সহ সামগ্রীর জন্য স্ট্রিং ফর্ম্যাট:

var fruit = new Fruit();
fruit.type = "apple";
fruit.color = "RED";
fruit.shippingDate = new Date(2018, 1, 1);
fruit.amount = 10000;

String.Format("the {type:U} is {color:L} shipped on {shippingDate:s} with an amount of {amount:n}", fruit);
// output: the APPLE is red shipped on 2018-01-01 with an amount of 10.000

2

আমি String.formatরূপটি দেখতে পাইনি :

String.format = function (string) {
    var args = Array.prototype.slice.call(arguments, 1, arguments.length);
    return string.replace(/{(\d+)}/g, function (match, number) {
        return typeof args[number] != "undefined" ? args[number] : match;
    });
};

2

JQuery.ajax () সাফল্যের ফাংশন সহ ব্যবহারের জন্য। কেবলমাত্র একটি একক যুক্তি এবং স্ট্রিংটি Pass প্রপার্টি নাম {হিসাবে সেই বস্তুর বৈশিষ্ট্যগুলির সাথে প্রতিস্থাপন করুন:

String.prototype.format = function () {
    var formatted = this;
    for (var prop in arguments[0]) {
        var regexp = new RegExp('\\{' + prop + '\\}', 'gi');
        formatted = formatted.replace(regexp, arguments[0][prop]);
    }
    return formatted;
};

উদাহরণ:

var userInfo = ("Email: {Email} - Phone: {Phone}").format({ Email: "someone@somewhere.com", Phone: "123-123-1234" });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.