ජාවාස්ක්‍රිප්ට් printf / String.Format ට සමානයි


1981

මම සොයන්නේ සී / පීඑච්පී වලට සමාන හොඳ ජාවාස්ක්‍රිප්ට් printf()හෝ සී # / ජාවා ක්‍රමලේඛකයින් සඳහා String.Format()( IFormatProvider.නෙට් සඳහා).

මගේ මූලික අවශ්‍යතාවය දැනට සංඛ්‍යා සඳහා වෙන් කිරීමේ ආකෘතිය දහසක් වන නමුත් බොහෝ සංයෝජන (දිනයන් ඇතුළුව) හසුරුවන දෙයක් හොඳ වනු ඇත.

මයික්‍රොසොෆ්ට් හි අජැක්ස් පුස්තකාලයේ අනුවාදයක් සපයන බව මට වැටහී ඇත String.Format(), නමුත් එම රාමුවේ සමස්ත පොදු කාර්යය අපට අවශ්‍ය නැත.


2
පහත දැක්වෙන සියලුම විශිෂ්ට පිළිතුරු පසෙක තබා , ඔබට මෙය බැලීමට අවශ්‍ය විය හැකිය: මෙම ගැටලුව සඳහා වඩාත් කාර්යක්ෂම විසඳුම වන IMO වන stackoverflow.com/a/2648463/1712065 .
ඇනී

1
මම C වැනි printf syntax භාවිතා කරන ලාභදායී එකක් ලිවීය .
බ්‍රැඩන් හොඳම

var search = [$ scope.dog, "1"]; var url = vsprintf (" earth / Services / dogSearch.svc / FindMe /% s /% s ", සෙවීම); *** නෝඩ් සඳහා, ඔබට ඔබේ මොඩියුලය "npm install sprintf-js" මගින් ලබා ගත හැකිය
ජෙනා ලීෆ්

මෙය සාක්ෂාත් කර ගැනීම සඳහා මම සරල කාර්යයක් ද ලියා ඇත්තෙමි. stackoverflow.com/a/54345052/5927126
ආනන්ද්ෂාන්බාග්

Answers:


1124

ES6 සිට ඔබට අච්චු නූල් භාවිතා කළ හැකිය:

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

විස්තර සඳහා කිම්ගේ පිළිතුර පහත බලන්න.


එසේ නොමැති නම්:

JavaScript සඳහා sprintf () උත්සාහ කරන්න .


ඔබට තනිවම සරල ආකෘති ක්‍රමයක් කිරීමට අවශ්‍ය නම්, ආදේශන අනුපිළිවෙලින් නොකර ඒවා එකවර කරන්න.

මක්නිසාද යත්, කලින් සඳහන් කළ ප්‍රතිස්ථාපන නූලක් මේ ආකාරයේ ආකෘති අනුක්‍රමයක් අඩංගු වූ විට සඳහන් කර ඇති අනෙකුත් බොහෝ යෝජනා අසාර්ථක වන බැවිනි:

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

සාමාන්‍යයෙන් ඔබ ප්‍රතිදානය බලාපොරොත්තු වන {1}{0}නමුත් සත්‍ය ප්‍රතිදානය වේ {1}{1}. එබැවින් බියකරුගේ යෝජනාවට සමානව එකවර ප්‍රතිස්ථාපනය කරන්න .


16
සරල සිට අංක දක්වා පරිවර්තනයක් පමණක් අවශ්‍ය නම්, num.toFixed()ක්‍රමය ප්‍රමාණවත් විය හැකිය!
හෙල්ටන්බිකර්

Aks මැක්සිමිලියන් මේජර් විශාල වශයෙන් වෙනස් දෙයක් ලෙස පෙනේ.
ඉවාන් කැරොල්

Van ඉවාන් කැරොල් ඔබ හරි. මා අදහස් දැක්වීම ලියන අවස්ථාවේ නිධිය sprintf() for JavaScriptනොතිබුණි. ක්‍රියාත්මක කිරීම underscore.stringමත පදනම් වූ ස්ප්‍රින්ට්ෆ් හැරුණු කොට තවත් විශේෂාංග sprintf() for JavaScriptඇත. ඒ හැර පුස්තකාලය සම්පූර්ණයෙන්ම වෙනස් ව්‍යාපෘතියකි.
මැක්සිමිලියන් මේජර්

Aks මැක්සිමිලියන් මාජර් හරි, මේ පිළිතුර මැරී ඇති බව පවසමින් සබැඳිය දිරාපත් වී ඇත. එය මුළුමනින්ම පිරිසිදු කළ යුතුය.
ඉවාන් කැරොල්

2
මෙය තවදුරටත් පිළිගත යුතු පිළිතුර නොවේ. ES6 වන විට මෙය ජාවාස්ක්‍රිප්ට් භාෂාවට (බ්‍රව්සර් සහ NodeJS යන දෙකින්ම) ගොඩනගා ඇත. Im කිම්ගේ පිළිතුර පහතින් බලන්න.
රයන්

1398

කලින් යෝජනා කළ විසඳුම් මත ගොඩනැගීම:

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

එකම ප්‍රති result ලය සමඟ:

සහකාර පොලිස් අධිකාරී මියගොස් ඇත, නමුත් ASP.NET ජීවතුන් අතර නැත! සහකාර පොලිස් අධිකාරී {2}


12
|| ආර්ග්ස් [අංකය] 0 නම් උපක්‍රමය ක්‍රියා නොකරයි.
fserb

4
කෙටිකාලීන වෙනත් ප්‍රකාශයේ නම්, "'{' + අංකය + '}'" වෙනුවට "ගැලපීම" නොකරන්නේ මන්ද? ගැලපීම එම නූලට සමාන විය යුතුය.
mikeycgto

4
ඔබ එකිනෙකාට බහු-නූල් එකතු කර ඇත්නම් ( +-ඔපරේටරය සමඟ ), සම්පූර්ණ නූල් වරහන් තුළ තැබීමට වග බලා ගන්න: ("asd {0}"+"fas {1}").format("first", "second");එසේ නොමැති නම්, ශ්‍රිතය අදාළ වන්නේ එකතු කරන ලද අවසාන නූලට පමණි.
ලූකස් නුත්

3
එය ප්‍රති come ලය තරමක් හා සියුම් ලෙස වෙනස් කරයි. සිතන්න 'foo {0}'.format(fnWithNoReturnValue()). එය දැනට නැවත පැමිණේ foo {0}. ඔබගේ වෙනස්කම් සමඟ, එය නැවත පැමිණේ foo undefined.
භීතිය

2
@avenmore: / \ {(\ d +) \} / g
හොසුකි

494

එය විහිලුවක් වන්නේ ස්ටැක් පිටාර ගැලීම ඇත්ත වශයෙන්ම 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 විලාසිතාවේ වස්තුවක් නොව නූල් හෝ ඉලක්කම් තර්ක විතර්ක කළහොත් ඔබට C # ගේ String.Formatහැසිරීම හරියටම පාහේ ලැබෙනු ඇත.

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

අපි ඒ නිසා Arrayගේ sliceඇතුලේ ඕනෑම දෙයක් බල කරනු ඇත argumentsතුලට Arrayඑය මුලින් හෝ නොවේ, සහ දැයි, keyඑසේ (string එකකට බල එක් එක් මාලාවක් මූලද්රව්යයක දර්ශකය (0, 1, 2, ...) වනු ඇත උදා, "0", "\\{0\\}"ඔබගේ පළමු රීජෙක්ස් රටාව සඳහා).

පිළිවෙලට.


405
+1
Sneakyness

5
@ ජේම්ස් මැනින් රීජෙක්ස් ගෝලීය ධජයට ( g) ඉඩ දෙයි , එමඟින් එකම යතුර එක වරකට වඩා ප්‍රතිස්ථාපනය කළ හැකිය. ඉහත උදාහරණයේ දී, ඔබට {name}එකම වාක්‍යයේ කිහිප වතාවක් භාවිතා කළ හැකි අතර ඒවා සියල්ල ප්‍රතිස්ථාපනය කළ හැකිය.
KrekkieD

3
මෙය අවංකව කිවහොත් බිඳෙන සුළුය. නම් කුමක් උදාහරණයක් සිදු nameවේ "blah {adjective} blah"?
sam hocevar

5
uff රුෆින් “ටිකක් අධිභෞතික”? පරිශීලක දත්ත ආකෘති නූල් ලෙස අර්ථ නිරූපණය කිරීම සඳහා රැවටී ඇති කේතය සමස්ත අවදානම් කාණ්ඩයකි . 98.44% සාමාන්‍ය මට්ටමෙන් ඔබ්බට ය .
sam hocevar

3
amsamhocevar මට ඔයාව විශ්වාස කරන්න බැහැ පුංචි බොබී මාව සභා කළා. ;) ඔබ කිසිදු ආරක්ෂිත පරීක්ෂාවකින් තොරව ඔබේ දත්ත සමුදා සේවාදායකයේ සේවාදායක පාර්ශවීය ජාවාස්ක්‍රිප්ට් මඟින් සැකසූ පෙළ ධාවනය කරන්නේ නම්, ස්වර්ගය අප සැමට උපකාර කරයි. ; ^) බලන්න, ඔබේ සේවාදායකයාගේ ආරක්ෂාව ඉක්මවා යන සේවාදායකයෙකුගෙන් (උදා: තැපැල්කරු) ඕනෑම පරිශීලකයෙකුට යැවිය හැකි කිසිවක් නොතිබිය යුතුය . ඔබ කළ යුතු සේවාලාභී සිට යැවිය හැකි බව භයානක දෙයක් උපකල්පනය කරනු ඇත විය. ඔබ 100% ක් ආරක්ෂාව අවශ්ය නම්, ඒ සඳහා වන සේවාදායකයා-පැත්තේ JavaScript කේතය වන සෑම විටම පරිශීලක සංස්කරණය, ඔබ මෙම කාර්යය ආරක්ෂාවට තර්ජනයක්, ඔබ වැරදි ක්රීඩාව ඉන්නේ ක්රීඩා විවෘත විය හැකි හිතන්නේ.
රෆින්

327

JavaScript හි අංක හැඩතල ගැන්වීම

මම මෙම ප්‍රශ්න පිටුවට පැමිණියේ අංක සංයුති කරන්නේ කෙසේදැයි සොයා ගැනීමේ බලාපොරොත්තුවෙනිවෙනත් පුස්තකාලයක් හඳුන්වා නොදී ජාවාස්ක්‍රිප්ට් හි . මෙන්න මම සොයාගත් දේ:

වටකුරු පාවෙන ලක්ෂ්‍ය අංක

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)

On ාතීය ආකෘතිය

සමාන sprintf("%.2e", num)වේ num.toExponential(2).

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

ෂඩාස්රාකාර හා වෙනත් භෂ්ම

B පාදමේ අංක මුද්‍රණය කිරීමට උත්සාහ කරන්න num.toString(B). ජාවාස්ක්‍රිප්ට් 2 සිට 36 දක්වා පදනම් වෙත ස්වයංක්‍රීයව පරිවර්තනය කිරීම සඳහා සහය දක්වයි (ඊට අමතරව, සමහර බ්‍රව්සර්වලට බේස් 64 කේතන ක්‍රමයට සීමිත සහයෝගයක් ඇත ).

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

යොමු පිටු

JS අංක හැඩතල ගැන්වීම පිළිබඳ ඉක්මන් නිබන්ධනය

ToFixed () සඳහා මොසිල්ලා යොමු පිටුව ( toPrecision (), toExponential (), toLocaleString (), ...) වෙත සබැඳි සමඟ.


23
අමුතු සුදු අවකාශයක් එහි තබනවා වෙනුවට වරහන් තුළ සංඛ්‍යාත්මකව අංකනය කිරීම වඩා හොඳ නොවේද?
rmobis

7
එය වඩා හොඳ පෙනුමක්, ඇත්ත. නමුත් මගේ ඉලක්කය වන්නේ සින්ටැක්ස් දෝෂ උගුල පෙන්වා දීම පමණි.
rescdsk

4
ඔබ පැරණි බ්‍රව්සරයක් භාවිතා කරන්නේ නම් හෝ පැරණි බ්‍රව්සර් සඳහා සහය දක්වන්නේ නම් පැති සටහනක් වැරදියට නිවැරදිව ක්‍රියාත්මක කර ඇත, ටොෆික්ස් වෙනුවට Math.round භාවිතා කිරීම වඩා හොඳ විසඳුමකි.
ars265

7
@ රෆායෙල්_ සහ @rescdsk: ..ද ක්‍රියා කරයි:33333..toExponential(2);
පීටර් ජැරික්

නැතහොත් (33333) .toExponential (2)
ජොනතන්

246

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

සටහන: සහාය දක්වන බ්‍රව්සර් ලැයිස්තුවක් සොයා ගැනීමට මොසිල්ලා අඩවිය පරීක්ෂා කරන්න.


63
අච්චු නූල්වල ඇති ගැටළුව නම්, ඒවා වහාම ක්‍රියාත්මක වන බව පෙනේ, ඒවායේ භාවිතය i18n වැනි නූල් වගුවක් මුළුමනින්ම නිෂ් .ල ය. මට මුලින් නූල නිර්වචනය කළ නොහැකි අතර පසුව සහ / හෝ නැවත නැවත භාවිතා කිරීමට පරාමිතීන් සපයන්න.
ටස්ටින් 2121

4
Ust Tustin2121 ඒවා විචල්‍යයකට අනුයුක්ත කිරීම සඳහා ගොඩනගා නැති බව ඔබ නිවැරදියි, එය මඳක් සිතට කාවදින සුළුය, නමුත් ඔබ ඒවා ශ්‍රිතයක් තුළ සඟවා ගන්නේ නම්, සැකසූ නූල්වල ක්ෂණික ක්‍රියාත්මක කිරීමේ ප්‍රවණතා සමඟ වැඩ කිරීමට පහසුය. Jsfiddle.net/zvcm70pa
inanutshellus

13
Ust ටස්ටින් 2121 ටෙම්ප්ලේට් නූල් හෝ පැරණි විලාසිතාවේ නූල් සම්මුතියක් භාවිතා කිරීම අතර වෙනසක් නැත. ඔබට පැරණි ශෛලියේ නූල් උත්පාදක යන්ත්රයක් සරල ශ්‍රිතයකින් ඔතා තැබිය යුතු අතර එකම දේ නූල් සැකිලි සමඟ හොඳින් ක්‍රියා කරයි. const compile = (x, y) => `I can call this template string whenever I want.. x=${x}, y=${y}`...compile(30, 20)
cchamberlain

5
මෙම විසඳුම විචල්‍යයෙන් සම්මත කර ඇති ආකෘති සඳහා ක්‍රියා නොකරනු ඇත (උදාහරණයක් ලෙස සේවාදායකයෙන්)
user993954

1
@inanutshellus ඔබේ අච්චුවේ ක්‍රියාකාරිත්වය ක්‍රියාත්මක වන එකම යන්ත්‍රය තුළම අර්ථ දක්වා ඇත්නම් එය හොඳින් ක්‍රියාත්මක වේ. මා දන්නා පරිදි, ඔබට JSON ලෙස ශ්‍රිතයක් සමත් කළ නොහැක, එබැවින් දත්ත සමුදායක අච්චු කාර්යයන් ගබඩා කිරීම හොඳින් ක්‍රියාත්මක නොවේ.
ස්ටයිෆල්

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 replace ප්‍රතිස්ථාපනය නොවේ. ;)


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
මම හිතන්නේ කේතය තවමත් නිවැරදි නැත. නිවැරදි එක පිලිපීස් පළ කළ ආකාරයට විය යුතුය .
wenqiang

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!"
ගුම්බෝ

6
විචල්‍යය argගෝලීය ය. ඒ වෙනුවට ඔබ මෙය කළ යුතුය:for (var arg in arguments) {
Pauan

70

Node.js භාවිතා කරන්නන් සඳහා util.formatprintf වැනි ක්‍රියාකාරීත්වයක් ඇත:

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

<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
Dem Pilafian

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

මෙහි තියෙන්නේ අවම sprintf ක්රියාත්මක JavaScript දී: එය පමණක් "% s" සහ "% d" කරන්නේ, නමුත් එය දීර්ඝ කිරීමට මම ඉඩ ඉතිරි කර ඇත. එය OP ට වැඩක් නැත, නමුත් ගූගල් වෙතින් එන මෙම ත්‍රෙඩ් එකෙන් පැකිලෙන අනෙක් පුද්ගලයින්ට එයින් ප්‍රයෝජන ගත හැකිය.

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

Ason ජේසන් මෝර්ගන්, මම 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

ES 2015 යාවත්කාලීන කිරීම

ES 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
පවත්නා ශ්‍රිතයකට ඉක්මන් පිටපත් කිරීම සඳහා මෙම පිළිතුර විශිෂ්ටයි. බාගැනීම් අවශ්‍ය නොවේ.
නික්

Ick නික් ඔව්, ඒක තමයි අදහස :)
බ්‍රැඩන් හොඳම

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'); result ලය බවට පත්වන දෙවන අක්‍ෂරය එය ප්‍රතිස්ථාපනය නොකරයි 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++)
සමර්ජිත් සමන්ත

2
යොමු කිරීම සඳහා, for...inමෙම කේතය අපේක්ෂා කරන පරිදි සෑම බ්‍රව්සරයකම ක්‍රියා නොකරනු ඇත. සමහර බ්‍රව්සර්වල ඇතුළත් වන සියලු ගණන් කළ නොහැකි ගුණාංගවලට වඩා එය ලූපයක් වනු ඇති අතර arguments.lengthඅනෙක් ඒවා තුළ තර්ක පවා ඇතුළත් නොවේ. ඕනෑම අවස්ථාවක, Object.prototypeඑකතු කළ හොත් , ඕනෑම එකතු කිරීමක් පොකුරට ඇතුළත් වනු ඇත. කේතය විය යුත්තේ සම්මත forලූපයක් වෙනුවට ය for...in.
cHao

අනුපිටපත් පිළිතුර වෙනුවට පිළිතුරු සංස්කරණයක් යෝජනා කළ යුතුය. මෙම අනුපිටපතමෙම පිළිතුර
රූසෝ ඇලෙක්සැන්ඩ්‍රේ

19

'ගැටලුව' සඳහා මගේ විසඳුම බෙදා ගැනීමට මට අවශ්යය. මම රෝදය නැවත ප්‍රතිනිර්මාණය කර නැති නමුත් ජාවාස්ක්‍රිප්ට් දැනටමත් කරන දේ මත පදනම්ව විසඳුමක් සෙවීමට උත්සාහ කරමි. වාසිය නම්, ඔබට සියලු ව්‍යාජ පරිවර්තනයන් නොමිලේ ලබා ගැනීමයි. String හි මූලාකෘති දේපල සැකසීම ඉතා ලස්සන හා සංයුක්ත වාක්‍ය ඛණ්ඩයක් ලබා දෙයි (පහත උදාහරණ බලන්න). එය සමහර විට වඩාත්ම කාර්යක්ෂම ක්‍රමය නොවේ, නමුත් බොහෝ අවස්ථාවන්හිදී ප්‍රතිදානය සමඟ කටයුතු කිරීමේදී එය සුපිරි ප්‍රශස්තිකරණය කළ යුතු නොවේ.

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'

අවාසනාවට අවම වශයෙන් # සහ + පාවෙන සඳහා ක්‍රියාත්මක නොවේ. c: tutorialspoint.com/c_standard_library/c_function_sprintf.htm
ඩැනියෙල්

15

මම ඇසූ දා සිට සොයාගත් මගේම සොයාගැනීම් එකතු කරමි:

කනගාටුවට කරුණක් නම් .NET හි නූල් ආකෘතිය වැනි ස්ප්රින්ට්ෆ් බෙදුම්කාරක දහස් ගණනක් හසුරුවන්නේ නැති බවයි.


14

මම ජාවාස්ක්‍රිප්ට් සඳහා String.format නමින් කුඩා පුස්තකාලයක් භාවිතා කරන අතර එය බොහෝ ආකෘතියේ හැකියාවන් සඳහා (සංඛ්‍යා හා දිනයන්හි ආකෘතිය ඇතුළුව) සහය දක්වයි .NET සින්ටැක්ස් භාවිතා කරයි. ස්ක්‍රිප්ට් එක 4 kB ට වඩා කුඩා බැවින් එය ඉහළින් බොහෝ දේ නිර්මාණය නොකරයි.


මම ඒ පුස්තකාලය දෙස බැලුවෙමි. බාගත කිරීම EXE එකක් බව දුටු විට මට කරදරයක් විය. ඒ මොකක්ද? බාගත කළේ නැත.
jessegavin

බොහෝ විට බාගත කළ හැකි ලේඛනාගාරයක් EXE වන අතර එය "ස්වයං-නිස්සාරණ ZIP" ට වඩා වැඩි දෙයක් නොවේ. එය ක්‍රියාත්මක කරන්න, එවිට එය ඉවත් වනු ඇත. මෙය තරමක් පහසු නමුත් එය අනිෂ්ට මෘදුකාංග මෙන් පෙනෙන නිසා, මෙම ආකෘතිය වෙබයේ බොහෝ විට භාවිතා නොවේ.
චක් කොලර්ස්

මෙම සබැඳිය ප්‍රශ්නයට පිළිතුරු සැපයිය හැකි නමුත්, පිළිතුරේ අත්‍යවශ්‍ය කොටස් මෙහි ඇතුළත් කිරීම සහ යොමු කිරීම සඳහා සබැඳිය සැපයීම වඩා හොඳය. සම්බන්ධිත පිටුව වෙනස් වුවහොත් සබැඳි පමණක් පිළිතුරු වලංගු නොවේ.
starmole

ar ස්ටාර්මෝල් සබැඳිය (අවම) 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

ඔබ දහස් ගණනක් බෙදුම්කරු හැසිරවීමට සොයන්නේ නම්, ඔබ සැබවින්ම ජාවාස්ක්‍රිප්ට් අංක පන්තියේ සිට ලොකේල්ස්ට්‍රිං () භාවිතා කළ යුතුය, මන්ද එය පරිශීලකයාගේ කලාපය සඳහා නූල් සංයුති කරනු ඇත.

ජාවාස්ක්‍රිප්ට් දිනය පන්තියට දේශීයකරණය කළ දිනයන් සහ වේලාවන් සංයුති කළ හැකිය.


1
එය ඇත්ත වශයෙන්ම පරිශීලකයා විසින් යෙදුමේ සැකසුමක් ලෙස සකසා ඇත (යන්ත්‍රය ඒවා ක්‍රියාත්මක නොවේ) නමුත් මම බලන්නම්, ස්තූතියි
ක්‍රිස් එස්

සෑම කෙනෙකුටම එය ඉක්මණින් තේරුම් ගත හැකි වන පරිදි උදාහරණ කිහිපයක් එක් කරන්න.
භූෂාන් කවාඩ්කර්

9

මෙම PHPJS ව්යාපෘතිය , PHP ක්රියාකාරීත්වයට බොහෝ සඳහා ජාවාස්ක්රිප්ට් නිර්මාණයන් ලියා ඇත. PHP හි සිට sprintf()උත්සවය මූලික වශයෙන් C සමානය printf(), එය ඔවුන්ගේ JavaScript ක්රියාත්මක කිරීම ඔබගේ අවශ්යතා තෘප්තිමත් විය යුතුය.


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 හි [^}] කොටස අනවශ්‍යයි .. ඒ වෙනුවට {(. *?) use භාවිතා කරන්න, නැතහොත් නව රේඛාවට ගැලපීමට වඩා හොඳ {([\ s \ S] *?) use භාවිතා කරන්න.
rawiro

7

තරමක් වෙනස් අනුවාදයක්, මම කැමති එකකි (මෙය {0} අංකිත තර්කවලට වඩා {xxx} ටෝකන භාවිතා කරයි, මෙය ස්වයං ලේඛනගත කිරීමක් වන අතර ප්‍රාදේශීයකරණයට වඩාත් සුදුසු වේ):

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

එය මුලින්ම l () ප්‍රාදේශීයකරණ ශ්‍රිතයක් ලෙස හැඳින්වේ.



6

Node.JS සහ එහි 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)

ද, ඔබ 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 සමඟ අන්වර්ථ වී ඇති අතර දැනටමත් string.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 () සාර්ථකත්වයන් සමඟ භාවිතා කිරීම සඳහා. එකම ගුණාංගයක් පමණක් ගෙන එම වස්තුවෙහි ගුණාංග {propertyName as ලෙස ආදේශ කරන්න:

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" });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.