Forum Moderators: open

Message Too Old, No Replies

sprintf for JavaScript - String substitution

Anyone have a library that does this?

         

Fotiman

9:29 pm on Nov 1, 2006 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member Top Contributors Of The Month



I'm looking for something that does string substitution. Initially, I was thinking something like this:

substitute("Hello {0}, you are {1}.", "Webmaster World","great")

Which would result in:

Hello Webmaster World, you are great.

But maybe something more like sprintf is what I want? Anyone have anything like this?

jalarie

3:11 pm on Nov 2, 2006 (gmt 0)

10+ Year Member



Does this help?

<script type="text/javascript">
<!-- Hide this code from non-JavaScript browsers
function Substitute() {
var args=Substitute.arguments;
var Base=args[0];
var Seek,Len,ix1,ix2,ix3;
for (ix1=1; ix1<args.length; ix1++) {
ix2=ix1-1;
Seek='{'+ix2+'}';
if ((ix3=Base.indexOf(Seek)) > -1) {
Len=Seek.length;
Base=Base.substring(0,ix3)+args[ix1]+Base.substring(ix3+Len);
}
}
return Base;
} // Substitute
// End hiding -->
</script>

<script type="text/javascript">
<!-- Hide this code from non-JavaScript browsers
a=prompt('A','');
b=prompt('B','');
c="Hello {0}, you are {1}.";
d=Substitute(c,a,b);
alert(d);
// End hiding -->
</script>

danhale

9:36 pm on Nov 6, 2006 (gmt 0)

10+ Year Member



Or maybe something I snagged from I don't remember where:
//////////////////////////////////////////////////////////////////////////////
// sprintf function for Javascript
function sprintf() {
if (!arguments ¦¦ arguments.length < 1 ¦¦!RegExp) { return; }
var str = arguments[0];
var re = /([^%]*)%('.¦0¦\x20)?(-)?(\d+)?(\.\d+)?(%¦b¦c¦d¦u¦f¦o¦s¦x¦X)(.*)/;
var a = b = [], numSubstitutions = 0, numMatches = 0;
while (a = re.exec(str)) {
var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
var pPrecision = a[5], pType = a[6], rightPart = a[7]; numMatches++;
if (pType == '%') {
subst = '%';
} else {
numSubstitutions++;
if (numSubstitutions >= arguments.length) {
alert('Error! Not enough function arguments (' +
(arguments.length - 1) + ', excluding the string)\n' +
'for the number of substitution parameters in string (' +
numSubstitutions + ' so far).');
}
var param = arguments[numSubstitutions];
var pad = '';
if (pPad && pPad.substr(0,1) == "'") {
pad = leftpart.substr(1,1);
} else if (pPad) {
pad = pPad;
}
var justifyRight = true;
if (pJustify && pJustify === "-") justifyRight = false;
var minLength = -1;
if (pMinLength) minLength = parseInt(pMinLength);
var precision = -1;
if (pPrecision && pType == 'f') {
precision = parseInt(pPrecision.substring(1));
}
var subst = param;
switch (pType) {
case 'b': subst = parseInt(param).toString(2); break;
case 'c': subst = String.fromCharCode(parseInt(param)); break;
case 'd': subst = parseInt(param)? parseInt(param) : 0; break;
case 'u': subst = Math.abs(param); break;
case 'f': subst = (precision > -1)?
Math.round(parseFloat(param) * Math.pow(10, precision)) /
Math.pow(10, precision) : parseFloat(param); break;
case 'o': subst = parseInt(param).toString(8); break;
case 's': subst = param; break;
case 'x': subst = ('' +
parseInt(param).toString(16)).toLowerCase(); break;
case 'X': subst = ('' +
parseInt(param).toString(16)).toUpperCase(); break;
}
var padLeft = minLength - subst.toString().length;
if (padLeft > 0) {
var arrTmp = new Array(padLeft+1);
var padding = arrTmp.join(pad?pad:" ");
} else {
var padding = ""; } }
str = leftpart + padding + subst + rightPart;
}
return str;
}

Fotiman

10:21 pm on Nov 6, 2006 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member Top Contributors Of The Month



Actually, the solution I found was MUCH simpler and shorter, thanks to Dav Glass and his extension of the Yahoo UI Library, YUI tools [blog.davglass.com]:

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

With this, you would call:

YAHOO.Tools.printf("Showing {0} of {1}.", "1", "2");

And that would return:

Showing 1 of 2.