Home  >  Article  >  Web Front-end  >  Implementing sprintf and printf functions in JavaScript_javascript skills

Implementing sprintf and printf functions in JavaScript_javascript skills

WBOY
WBOYOriginal
2016-05-16 16:18:023226browse

Implement the sprintf / printf functions found in most languages ​​​​under JavaScript.

http://www.webtoolkit.info/javascript-sprintf.html: A relatively complete simulation of the sprintf function. Available formatting wildcards:
1.%% - Returns the percent sign itself
2.%b - Binary number
3.%c - ASCII corresponding character
4.%d - integer
5.%f - floating point number
6.%o - Octal number
7.%s - string
8.%x - hexadecimal number (lowercase letter form)
9.%X - hexadecimal number (uppercase letter form)

Available options between % signs and wildcard characters include (e.g. %.2f):

1. (Force to display the and - sign in front of the number as a sign of positive and negative numbers. By default, only negative numbers display the - sign)
2.- (variables left aligned)
3.0 (use 0 as right-aligned padding character)
4.[0-9] (Set the minimum width of the variable)
5..[0-9] (Set floating point precision or string length)

Copy code The code is as follows:

/**
*
*  Javascript sprintf
http://www.webtoolkit.info/
*
*
**/

sprintfWrapper = {

  init : function () {

    if (typeof arguments == "undefined") { return null; }
    if (arguments.length < 1) { return null; }
    if (typeof arguments[0] != "string") { return null; }
    if (typeof RegExp == "undefined") { return null; }

    var string = arguments[0];
    var exp = new RegExp(/(%([%]|(-)?( |x20)?(0)?(d )?(.(d)?)?([bcdfosxX])))/g);
    var matches = new Array();
    var strings = new Array();
    var convCount = 0;
    var stringPosStart = 0;
    var stringPosEnd = 0;
    var matchPosEnd = 0;
    var newString = '';
    var match = null;

    while (match = exp.exec(string)) {
      if (match[9]) { convCount = 1; }

      stringPosStart = matchPosEnd;
      stringPosEnd = exp.lastIndex - match[0].length;
      strings[strings.length] = string.substring(stringPosStart, stringPosEnd);

      matchPosEnd = exp.lastIndex;
      matches[matches.length] = {
        match: match[0],
        left: match[3] ? true : false,
        sign: match[4] || '',
        pad: match[5] || ' ',
        min: match[6] || 0,
        precision: match[8],
        code: match[9] || '%',
        negative: parseInt(arguments[convCount]) < 0 ? true : false,
        argument: String(arguments[convCount])
      };
    }
    strings[strings.length] = string.substring(matchPosEnd);

    if (matches.length == 0) { return string; }
    if ((arguments.length - 1) < convCount) { return null; }

    var code = null;
    var match = null;
    var i = null;

    for (i=0; i

      if (matches[i].code == '%') { substitution = '%' }
      else if (matches[i].code == 'b') {
        matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2));
        substitution = sprintfWrapper.convert(matches[i], true);
      }
      else if (matches[i].code == 'c') {
        matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument)))));
        substitution = sprintfWrapper.convert(matches[i], true);
      }
      else if (matches[i].code == 'd') {
        matches[i].argument = String(Math.abs(parseInt(matches[i].argument)));
        substitution = sprintfWrapper.convert(matches[i]);
      }
      else if (matches[i].code == 'f') {
        matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6));
        substitution = sprintfWrapper.convert(matches[i]);
      }
      else if (matches[i].code == 'o') {
        matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8));
        substitution = sprintfWrapper.convert(matches[i]);
      }
      else if (matches[i].code == 's') {
        matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length)
        substitution = sprintfWrapper.convert(matches[i], true);
      }
      else if (matches[i].code == 'x') {
        matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
        substitution = sprintfWrapper.convert(matches[i]);
      }
      else if (matches[i].code == 'X') {
        matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
        substitution = sprintfWrapper.convert(matches[i]).toUpperCase();
      }
      else {
        substitution = matches[i].match;
      }

      newString = strings[i];
      newString = substitution;

    }
    newString = strings[i];

    return newString;

  },

  convert : function(match, nosign){
    if (nosign) {
      match.sign = '';
    } else {
      match.sign = match.negative ? '-' : match.sign;
    }
    var l = match.min - match.argument.length 1 - match.sign.length;
    var pad = new Array(l < 0 ? 0 : l).join(match.pad);
    if (!match.left) {
      if (match.pad == "0" || nosign) {
        return match.sign pad match.argument;
      } else {
        return pad match.sign match.argument;
      }
    } else {
      if (match.pad == "0" || nosign) {
        return match.sign match.argument pad.replace(/0/g, ' ');
      } else {
        return match.sign match.argument pad;
      }
    }
  }
}

sprintf = sprintfWrapper.init;

If you just want to simply replace the content of the position variable without additional formatting, you can use the printf provided in the relatively simple YUI tools:

Copy code The code is as follows:

YAHOO.Tools.printf = function() {
var num = arguments.length;
var oStr = arguments[0];
for (var i = 1; i < num; i ) {
var pattern = "\{" (i-1) "\}";
var re = new RegExp(pattern, "g");
oStr = oStr.replace(re, arguments[i]);
}
return oStr;
}

When used like YAHOO.Tools.printf("Display string {0}, {1}.", "1", "2"); use {?} to match.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn