JavaScript эквивалентен printf / String.Format

Попробуйте установить этот ключ на целевом (удаленном) компьютере и перезагрузите компьютер:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"LocalAccountTokenFilterPolicy"=dword:00000001

Смотрите: http://forum.sysinternals.com/topic10924.html и http://www.brandonmartinez.com/2013/04/24/resolve-access-is-denied-using-psexec-with-a-local-admin-account/

1806
задан 9 revs, 6 users 31% 31 July 2018 в 20:09
поделиться

37 ответов

Я хочу поделиться своим решением для «проблемы». Я не изобрел колесо заново, но пытаюсь найти решение, основанное на том, что JavaScript уже делает. Преимущество в том, что вы получаете все неявные преобразования бесплатно. Установка свойства prototype $ для 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'
14
ответ дан 4 revs, 2 users 85% 31 July 2018 в 20:09
поделиться

Если вы хотите обработать разделитель тысяч, вам действительно следует использовать toLocaleString () из класса JavaScript Number , поскольку он будет форматировать строку для региона пользователя.

Класс JavaScript Date может форматировать локализованные даты и время.

11
ответ дан 2 revs, 2 users 75% 31 July 2018 в 20:09
поделиться

У меня есть решение, очень похожее на решение Питера, но оно касается числа и случая объекта.

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."
}
9
ответ дан 3 revs, 2 users 91% 31 July 2018 в 20:09
поделиться

PHPJS-проект написал JavaScript-реализации для многих функций PHP. Поскольку функция PHP sprintf() в основном совпадает с функцией C printf(), их реализация в JavaScript должна удовлетворить ваши потребности.

8
ответ дан 2 revs, 2 users 67% 31 July 2018 в 20:09
поделиться

Я использую это:

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!");
8
ответ дан 3 revs, 2 users 61% 31 July 2018 в 20:09
поделиться

Забавно, потому что Stack & nbsp; Overflow на самом деле имеет свою собственную функцию форматирования для прототипа 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"

Это связано с тем, что slice из Array приведет к тому, что будет в arguments, в Array, независимо от того, было это изначально или нет, и key будет индексом (0, 1, 2 ...) каждого элемента массива, приведенного к строке (например, «0», поэтому "\\{0\\}" для вашего первого шаблона регулярного выражения).

Ухоженная.

430
ответ дан 4 revs, 4 users 63% 31 July 2018 в 20:09
поделиться

Опираясь на ранее предложенные решения:

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

1345
ответ дан Adriaan 31 July 2018 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: