जावास्क्रिप्ट प्रिंट / स्ट्रिंग के बराबर है


1970

मैं C / PHP के बराबर printf()या C # / Java प्रोग्रामर के लिए, String.Format()( IFormatProvider.NET के लिए) एक अच्छे जावास्क्रिप्ट की तलाश कर रहा हूँ ।

मेरी मूल आवश्यकता अब के लिए संख्याओं के लिए एक हजार विभाजक प्रारूप है, लेकिन कुछ ऐसा जो बहुत सारे संयोजनों को संभालता है (तिथियों सहित) अच्छा होगा।

मुझे एहसास है कि Microsoft के अजाक्स पुस्तकालय का एक संस्करण प्रदान करता है String.Format(), लेकिन हम उस ढांचे के पूरे ओवरहेड नहीं चाहते हैं।


2
नीचे दिए गए सभी शानदार उत्तरों के अलावा, आप इस पर एक नज़र डालना चाहते हैं: stackoverflow.com/a/2648463/1712065 जो IMO, इस समस्या का सबसे कुशल समाधान है।
एनी

1
मैंने एक सस्ता लिखा है जो सी-जैसे प्रिंटफ सिंटैक्स का उपयोग करता है।
ब्रैडेन बेस्ट

var खोज = [$ गुंजाइश.डॉग, "1"]; var url = vsprintf (" Earth / Services / dogSearch.svc / FindMe /% s /% s ", search); *** नोड के लिए, आप "npm स्थापित स्प्रिंटफ-जेएस" द्वारा अपना मॉड्यूल प्राप्त कर सकते हैं
जेन्ना लीफ

मैंने इसे प्राप्त करने के लिए एक सरल कार्य भी लिखा है; stackoverflow.com/a/54345052/5927126
आनंदभानग

जवाबों:


1109

ES6 से आप टेम्प्लेट स्ट्रिंग्स का उपयोग कर सकते हैं:

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

विवरण के लिए नीचे किम का जवाब देखें।


अन्यथा:

जावास्क्रिप्ट के लिए स्प्रिंटफ () का प्रयास करें ।


यदि आप वास्तव में अपने दम पर एक सरल प्रारूप विधि करना चाहते हैं, तो प्रतिस्थापन को क्रमिक रूप से न करें बल्कि उन्हें एक साथ करें।

क्योंकि जिन अन्य प्रस्तावों का उल्लेख किया गया है, उनमें से अधिकांश विफल हो जाते हैं जब पिछले प्रतिस्थापन की एक स्ट्रिंग भी इस तरह एक प्रारूप अनुक्रम होता है:

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

आम तौर पर आपको उम्मीद होगी कि आउटपुट होगा {1}{0}लेकिन वास्तविक आउटपुट है {1}{1}। इसलिए डरने के सुझाव की तरह एक साथ प्रतिस्थापन करें ।


16
यदि केवल कुछ सरल संख्या-से-स्ट्रिंग रूपांतरण वांछित है, तो num.toFixed()विधि पर्याप्त हो सकती है!
हेल्टनबिकर

@MaksymilianMajer जो कुछ बड़े पैमाने पर अलग लगता है।
इवान कैरोल

@EvanCarroll आप सही हैं। जिस समय मैंने टिप्पणी लिखी थी उस समय का भंडार sprintf() for JavaScriptउपलब्ध नहीं था। underscore.stringस्प्रिंट से अलग विशेषताएं हैं जो sprintf() for JavaScriptकार्यान्वयन पर आधारित है। इसके अलावा पुस्तकालय एक पूरी तरह से अलग परियोजना है।
मैक्सीमिलियन मेजर

@MaksymilianMajer सही है, यह कहते हुए कि यह उत्तर मृत है, और लिंक का क्षय हो गया है। इसे पूरी तरह से शुद्ध करने की आवश्यकता है।
इवान कैरोल

2
इसे अब उत्तर स्वीकार नहीं किया जाना चाहिए। ES6 के रूप में यह जावास्क्रिप्ट भाषा (ब्राउज़र और नोड्स दोनों में) में बनाया गया है। नीचे @Kim का उत्तर देखें।
रयान

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

आउटपुट

ASP मर चुका है, लेकिन ASP.NET जीवित है! ASP {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');

उसी परिणाम के साथ:

ASP मर चुका है, लेकिन ASP.NET जीवित है! ASP {2}


12
|| ट्रिक काम नहीं करता है अगर args [संख्या] 0. है तो एक स्पष्ट करना चाहिए अगर () यह देखने के लिए कि क्या (args [संख्या] === अपरिभाषित)।
fserb

4
शॉर्टहैंड के दूसरे कथन में, यदि "" {'+ संख्या +'} '' के बजाय "मिलान" क्यों नहीं किया जाता है। मैच उस स्ट्रिंग के बराबर होना चाहिए।
माइकाइकगेटो

4
यदि आपके पास एक-दूसरे से जुड़े कई तार हैं ( +-ओपरेटर के साथ ), पूरा स्ट्रिंग कोष्ठक में रखना सुनिश्चित करें: ("asd {0}"+"fas {1}").format("first", "second");अन्यथा, फ़ंक्शन केवल पिछले स्ट्रिंग पर लागू होगा जो कि जोड़ा गया था।
लुकास नुथ

3
वह थोड़ा और सूक्ष्मता से परिणाम बदलता है। कल्पना कीजिए 'foo {0}'.format(fnWithNoReturnValue())। यह वर्तमान में वापस आ जाएगी foo {0}। आपके परिवर्तनों के साथ, यह वापस आ जाएगा foo undefined
14

2
@avenmore: / \ {(\ d +) \} / g
होजुकि

490

यह हास्यास्पद है क्योंकि स्टैक ओवरफ्लो वास्तव में Stringप्रोटोटाइप नाम के लिए अपना स्वयं का प्रारूपण फ़ंक्शन है formatUnicorn। कोशिश करो! कंसोल में जाएं और कुछ टाइप करें:

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

Firebug

आपको यह आउटपुट मिलता है:

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- शैली की वस्तु नहीं है, तो आपको C # का String.Formatव्यवहार लगभग बिल्कुल मिलता है।

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

ऐसा इसलिए है क्योंकि उस Arrayके sliceलिए बाध्य करेगा जो कुछ भी है argumentsएक में Arrayहै कि क्या यह मूल रूप से या नहीं था, है, और key(एक स्ट्रिंग मजबूर जैसे, "0" प्रत्येक सरणी तत्व के सूचकांक (0, 1, 2 ...), तो हो जाएगा "\\{0\\}"अपने पहले regexp पैटर्न के लिए)।

साफ।



5
@JamesManning regex वैश्विक ध्वज ( g) की अनुमति देता है , जो एक ही कुंजी को एक से अधिक बार बदल सकता है। उपरोक्त उदाहरण में, आप {name}एक ही वाक्य में कई बार उपयोग कर सकते हैं और उन सभी को प्रतिस्थापित कर सकते हैं।
क्रेकडी

3
यह भयानक नाजुक लगता है, ईमानदार होना। उदाहरण के लिए क्या होता nameहै "blah {adjective} blah"?
सैम होसेवर

5
@ इरफ़ान "थोड़ा अतिशयोक्तिपूर्ण"? कोड जिसे उपयोगकर्ता डेटा को प्रारूपण स्ट्रिंग्स के रूप में व्याख्यायित करने में मूर्ख बनाया गया है, यह पूरी तरह से कमजोरियों की श्रेणी है । 98.44% औसत दर्जे से परे है
सैम होसेवर

3
@samhocevar मुझे विश्वास नहीं हो रहा है कि आप लिटिल बॉबी ने मुझे सक्षम किया है। ;) यदि आप बिना किसी सुरक्षा जांच के अपने डेटाबेस सर्वर पर क्लाइंट-साइड जावास्क्रिप्ट द्वारा संसाधित पाठ चला रहे हैं, तो स्वर्ग हम सभी की मदद करता है। ; ^) देखो, कुछ भी नहीं होना चाहिए कोई भी उपयोगकर्ता क्लाइंट (जैसे, डाकिया) से भेज सकता है जो आपके सर्वर की सुरक्षा को पास्ट करता है। और तुम चाहिए कुछ भी खतरनाक है कि एक ग्राहक से भेजा जा सकता है ग्रहण करेंगे हो। यदि आपको क्लाइंट-साइड जावास्क्रिप्ट कोड से 100% सुरक्षा की आवश्यकता होती है, जो हमेशा उपयोगकर्ता संपादन योग्य होता है, और आपको लगता है कि यह फ़ंक्शन सुरक्षा जोखिम को खोल सकता है, तो आप गलत गेम खेल रहे हैं।
रफिन

325

जावास्क्रिप्ट में संख्या स्वरूपण

मुझे यह प्रश्न पृष्ठ मिला कि मैं अभी तक एक और पुस्तकालय शुरू किए बिना, जावास्क्रिप्ट में संख्याओं को प्रारूपित करने का तरीका खोजने की उम्मीद कर रहा हूं । यहाँ मैं क्या पाया है:

राउंडिंग फ्लोटिंग-पॉइंट नंबर

sprintf("%.2f", num)जावास्क्रिप्ट के समतुल्य प्रतीत होता है num.toFixed(2), जो num2 दशमलव स्थानों पर गोलाई के साथ प्रारूपित होता है (लेकिन 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)। जावास्क्रिप्ट 36 के माध्यम से (2 इसके अलावा, कुछ ब्राउज़रों में बेस 64 एन्कोडिंग के लिए सीमित समर्थन है ) जावास्क्रिप्ट स्वचालित रूपांतरण का समर्थन करता है ।

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

संदर्भ पृष्ठ

जेएस नंबर प्रारूपण पर त्वरित ट्यूटोरियल

मोज़िला संदर्भ पृष्ठ toFixed के लिए () (लिंक के साथ toPreults (), toExponential (), toLocaleString (), ...)


23
क्या केवल एक अजीब सफेद जगह छोड़ने के बजाय, कोष्ठक में संख्या शाब्दिक रूप से संलग्न करना बेहतर नहीं होगा?
1

7
यह शायद बेहतर, सच्चा लगेगा। लेकिन मेरा लक्ष्य सिंटैक्स त्रुटि जाल को इंगित करना है।
21

4
यदि आप पुराने ब्राउज़र का उपयोग कर रहे हैं, या पुराने ब्राउज़रों का समर्थन कर रहे हैं, तो एक साइड नोट, कुछ ब्राउज़रों को गलत तरीके से कार्यान्वित किया गया, तो फ़िक्स्ड के स्थान पर Math.round का उपयोग करना बेहतर समाधान है।
ars265

7
@Raphael_ और @rescdsk: ..भी काम करता है:33333..toExponential(2);
पीटर

या (33333) .toExponential (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
टेम्पलेट स्ट्रिंग्स के साथ समस्या यह है कि वे तुरंत निष्पादित होने लगते हैं, जैसा कि उनका उपयोग, कहते हैं, एक i18n जैसी स्ट्रिंग तालिका पूरी तरह से बेकार है। मैं स्ट्रिंग को जल्दी परिभाषित नहीं कर सकता, और बाद में और / या बार-बार उपयोग करने के लिए मापदंडों की आपूर्ति करता हूं।
Tustin2121

4
@ Tustin2121 आप सही कह रहे हैं कि वे किसी वैरिएबल को असाइन करने के लिए नहीं बनाए गए हैं, जो थोड़ा दिमाग लगाने वाला है, लेकिन अगर आप किसी फंक्शन में उन्हें छिपाते हैं तो टेम्पर्ड स्ट्रिंग्स की इंस्टेंट-एक्जीक्यूशन ट्रेंड के साथ काम करना काफी आसान है। देखें jsfiddle.net/zvcm70pa
inanutshellus

13
@ Tustin2121 टेम्प्लेट स्ट्रिंग या पुरानी शैली स्ट्रिंग कॉन्फैनेटेशन का उपयोग करने के बीच कोई अंतर नहीं है, एक ही चीज़ के लिए इसकी चीनी। आपको पुराने स्टाइल के स्ट्रिंग जनरेटर को एक साधारण फंक्शन में लपेटना होगा और स्ट्रिंग टेम्प्लेट के साथ भी यही काम ठीक रहेगा। const compile = (x, y) => `I can call this template string whenever I want.. x=${x}, y=${y}`...compile(30, 20)
cchamberlain

4
यह समाधान प्रारूप स्ट्रिंग (उदाहरण के लिए सर्वर से) में पारित स्ट्रिंग के लिए काम नहीं करेगा
user993954

1
@inutsutshellus ठीक काम करता है यदि आपका टेम्पलेट फ़ंक्शन उसी मशीन पर परिभाषित किया गया है जहां इसे निष्पादित किया जाता है। जहाँ तक मुझे पता है, आप JSON के रूप में एक फ़ंक्शन पास नहीं कर सकते हैं, इसलिए डेटाबेस में टेम्पलेट फ़ंक्शंस अच्छी तरह से काम नहीं करते हैं।
स्टाइलफ्ल

171

jsxt, Zippo

यह विकल्प बेहतर है।

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} प्रतिस्थापित नहीं किया जाएगा। ;)


3
gist.github.com/1049426 मैंने इस दृष्टिकोण के साथ आपका उदाहरण अपडेट किया। मूल कार्यान्वयन को बचाने सहित कई लाभ अगर यह मौजूद है, तो इसे मजबूत करना, आदि, मैंने नियमित अभिव्यक्ति को हटाने की कोशिश की, लेकिन वैश्विक प्रतिस्थापन के लिए आवश्यक तरह के वेल्ड। : - /
tbranyen

6
jsxt को GPL-लाइसेंस प्राप्त है दुर्भाग्य से
AndiDog

109

मैं इस सरल कार्य का उपयोग करता हूं:

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

यह string.format के समान है:

"{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
cHao

3
यह विफल रहता है यदि पिछले प्रतिस्थापन में एक प्रारूप स्ट्रिंग के रूप में अच्छी तरह से शामिल है:"{0} is dead, but {1} is alive!".format("{1}", "ASP.NET") === "ASP.NET is dead, but ASP.NET is alive!"
Gumbo

6
चर argवैश्विक है। आपको इसके बजाय यह करने की आवश्यकता है:for (var arg in arguments) {
पाओण

68

के लिए Node.js उन है util.formatजो printf की तरह कार्यक्षमता है:

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

1
यह Node v0.10.26 के रूप में% x का समर्थन नहीं करता है
मैक्स क्रोन

चौड़ाई और संरेखण संशोधन का समर्थन नहीं करता है (उदाहरण के लिए %-20s %5.2f)
FGM

मुझे इस उपयोगी उत्तर को देखने के लिए पृष्ठ के नीचे सभी तरह से स्क्रॉल करना था।
डोनाटो

53

मुझे आश्चर्य है कि कोई भी इस्तेमाल नहीं किया गया है reduce, यह एक देशी संक्षिप्त और शक्तिशाली जावास्क्रिप्ट फ़ंक्शन है।

ES6 (EcmaScript2015)

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

<ईएस 6

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'])(ध्यान दें कि यह आपके उदाहरण में बेहतर फिट होने के लिए थोड़ा बेमानी है)
Tino

आपको प्रत्येक printfप्रकार के विनिर्देशक के लिए प्रतिस्थापन कार्य लागू करने होंगे और पैडिंग उपसर्गों के लिए तर्क शामिल करना होगा। समझदार अंदाज में फॉर्मेट स्ट्रिंग पर इरेटिंग यहां छोटी चुनौती लगती है, इमो। यदि आपको केवल स्ट्रिंग प्रतिस्थापन की आवश्यकता है, तो नीट समाधान।
कोलापसर

51

यहां जावास्क्रिप्ट में स्प्रिंटफ का न्यूनतम कार्यान्वयन है: यह केवल "% s" और "% d" करता है, लेकिन मैंने इसे आगे बढ़ाने के लिए जगह छोड़ दी है। यह ओपी के लिए बेकार है, लेकिन अन्य लोग जो Google से आने वाले इस धागे को ठोकर खाते हैं, उन्हें इससे लाभ हो सकता है।

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 पर String.prototype.sprintf का उपयोग कर सकते हैं । नीचे उदाहरण है:

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

@JasonMorgan, मैंने GitHub पर कामकाजी लिंक साझा किया है। सही उत्तर को देखें।
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

ईएस 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 Zippo इस अपवाद के साथ कि फ़ंक्शन बॉडी को नीचे होने की आवश्यकता है या अन्यथा यह प्रत्येक पुनरावृत्ति पर वर्तमान स्ट्रिंग को जोड़ता है:

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

1
यह फ़ायरफ़ॉक्स पर काम नहीं किया। डिबगर शो आर्गन अपरिभाषित के रूप में।
जिओ x

यह दूसरे चरित्र '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)IE में एक और बात काम नहीं करती है। मैं के साथ बदल दिया for (arg = 0; arg <arguments.length; arg++)
samarjit सामंत

2
संदर्भ के लिए, for...inहर ब्राउज़र में काम नहीं करेगा क्योंकि यह कोड इसकी अपेक्षा करता है। यह सभी असंख्य गुणों पर लूप करेगा, जो कुछ ब्राउज़रों में शामिल होंगे arguments.length, और दूसरों में भी तर्कों को शामिल नहीं करेंगे। किसी भी मामले में, अगर Object.prototypeइसमें जोड़ा जाता है , तो संभवतः किसी भी जोड़ को गुच्छा में शामिल किया जाएगा। कोड मानक forलूप का उपयोग करना चाहिए , बजाय for...in
cHao

आपको डुप्लिकेट उत्तर के बजाय एक उत्तर संपादित करने का प्रस्ताव देना चाहिए। यह इस उत्तर को
रूसो

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'

दुर्भाग्य से कम से कम # और + फ्लोट के लिए लागू नहीं किए गए हैं। यहाँ सी में समारोह के लिए एक संदर्भ है: tutorialspoint.com/c_standard_library/c_function_sprintf.htm
डैनियल

15

मैं अपनी खुद की खोजों को जोड़ूंगा जो मैंने पूछा है:

अफसोस की बात यह है कि स्प्रिंटफ .NET के स्ट्रिंग फॉर्मेट की तरह हजार सेपरेटर फॉर्मेटिंग को हैंडल नहीं करता है।


14

मैं जावास्क्रिप्ट के लिए String.format नामक एक छोटी सी लाइब्रेरी का उपयोग करता हूं जो अधिकांश प्रारूप स्ट्रिंग क्षमताओं (संख्याओं और तिथियों के प्रारूप सहित) का समर्थन करता है, और .NET सिंटैक्स का उपयोग करता है। स्क्रिप्ट स्वयं 4 kB से छोटी है, इसलिए यह बहुत अधिक ओवरहेड नहीं बनाता है।


मैंने उस पुस्तकालय पर एक नज़र डाली और यह वास्तव में बहुत अच्छा लग रहा है। जब मैंने देखा कि डाउनलोड एक EXE था, तो मैं नाराज हो गया। बिल्ली के बारे में क्या है? डाउनलोड नहीं किया।
1885 में jessegavin

अक्सर एक डाउनलोड करने योग्य संग्रह जो एक EXE होता है, वह "सेल्फ-एक्सट्रैक्टिंग ज़िप" से ज्यादा कुछ नहीं होता है। इसे निष्पादित करें, और यह स्वयं को अनपैक करेगा। यह काफी सुविधाजनक BUT है क्योंकि यह मालवेयर की तरह बहुत दिखता है, प्रारूप का उपयोग वेब पर नहीं किया जाता है जो अक्सर किसी भी अधिक होता है।
चक कोलारस

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
जुमान

@starmole लिंक एक (minified) 4 kB जावास्क्रिप्ट लाइब्रेरी के लिए है । मुझे विश्वास नहीं है कि इसे उत्तर में चिपकाना एक अच्छा विचार है।
ivarni

आप सही चिपका रहे हैं यह बेहतर नहीं होगा। मुझे यह टिप्पणी यादृच्छिक समीक्षा के लिए मिली - और इसे नापसंद करने से पहले टिप्पणी की। मेरे लिए स्टैकओवरफ़्लो बेहतर है जब तैयार किए गए समाधान (जो लिंक है) के बजाय स्पष्टीकरण प्रदान करते हैं। मैं लोगों को ब्लैक-बॉक्स कोड पोस्ट या डाउनलोड करने के लिए प्रोत्साहित नहीं करना चाहता।
starmole

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

यदि आप हजारों विभाजक को संभालना चाह रहे हैं, तो आपको वास्तव में जावास्क्रिप्ट संख्या वर्ग से toococaleString () का उपयोग करना चाहिए क्योंकि यह उपयोगकर्ता के क्षेत्र के लिए स्ट्रिंग को प्रारूपित करेगा।

जावास्क्रिप्ट तिथि वर्ग स्थानीयकृत तिथियों और समय को प्रारूपित कर सकता है।


1
यह वास्तव में उपयोगकर्ता द्वारा एप्लिकेशन में एक सेटिंग के रूप में एक सेट है (मशीन पर उनके नहीं) लेकिन मैं एक नज़र डालूंगा, धन्यवाद
क्रिस एस

कुछ उदाहरण जोड़ते हैं ताकि हर कोई इसे जल्दी से समझ सके।
भूषण कवाडकर

9

PHPJS परियोजना पीएचपी के कार्यों के कई के लिए जावास्क्रिप्ट कार्यान्वयन लिखा है। चूंकि PHP का sprintf()कार्य मूल रूप से C के समान है 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."
}

regexp में [^}] भाग अवास्तविक है .. इसके बजाय {(। *?)} का उपयोग करें या बेहतर {([\ s \ S] *?}} से भी नई मिलान करें।
कच्ची ओरियो

7

एक बहुत ही भिन्न संस्करण, जिसे मैं पसंद करता हूं (यह {{}} के बजाय {0} गिने हुए तर्कों का उपयोग करता है, यह बहुत अधिक स्व-दस्तावेजीकरण है और स्थानीयकरण को बेहतर बनाता है):

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

उन लोगों के लिए जो Node.JS और इसकी util.formatविशेषता को पसंद करते हैं, मैंने अभी इसे अपने वेनिला जावास्क्रिप्ट फॉर्म (केवल ऐसे कार्यों के साथ निकाला है जो use.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)

इसके अलावा, यदि आप कहते हैं एक ObjectBase.prototype.format (जैसे DateJS के साथ ) यह इसका उपयोग करेगा।

उदाहरण...

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

मैं .asFormat के साथ भी अलियास हो चुका हूं और पहले से ही एक स्ट्रिंग.फॉर्मैट (जैसे कि एमएस अजाक्स टूलकिट (मुझे उस लाइब्रेरी से नफरत है) के साथ कुछ पता लगाने की जगह है।


5

अगर किसी को ग्लोबल स्कोप को प्रदूषित करने से रोकने के लिए किसी फ़ंक्शन की आवश्यकता होती है, तो यहां वह फ़ंक्शन होता है जो ऐसा करता है:

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

3

हम एक सरल हल्के उपयोग कर सकते हैं String.Format टाइपप्रति के लिए स्ट्रिंग आपरेशन पुस्तकालय।

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 () सफलता कार्यों के साथ उपयोग के लिए। केवल एक ही तर्क पास करें और स्ट्रिंग उस ऑब्जेक्ट के गुणों को {संपत्तिनाम} के रूप में प्रतिस्थापित करें:

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" });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.