Javascript 版本的 Sprintf 字符串格式化函数

转载 2007年09月19日 10:27:00
/*
** sprintf.js -- POSIX sprintf(3) style formatting function for JavaScript
** Copyright (c) 2006-2007 Ralf S. Engelschall <rse@engelschall.com>
** Partly based on Public Domain code by Jan Moesen <http://jan.moesen.nu/>
** Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
**
** $LastChangedDate$
** $LastChangedRevision$
*/

/* make sure the ECMAScript 3.0 Number.toFixed() method is available */
if (typeof Number.prototype.toFixed != "undefined") {
(function(){
/* see http://www.jibbering.com/faq/#FAQ4_6 for details */
function Stretch(Q, L, c) {
var S = Q
if (c.length > 0)
while (S.length < L)
S = c+S;
return S;
}
function StrU(X, M, N) { /* X >= 0.0 */
var T, S;
S = new String(Math.round(X * Number("1e"+N)));
if (S.search && S.search(//D/) != -1)
return ''+X;
with (new String(Stretch(S, M+N, '0')))
return substring(0, T=(length-N)) + '.' + substring(T);
}
function Sign(X) {
return X < 0 ? '-' : '';
}
function StrS(X, M, N) {
return Sign(X)+StrU(Math.abs(X), M, N);
}
Number.prototype.toFixed = function (n) { return StrS(this, 1, n) };
})();
}

/* the sprintf() function */
sprintf = function () {
/* argument sanity checking */
if (!arguments || arguments.length < 1)
alert("sprintf:ERROR: not enough arguments");

/* initialize processing queue */
var argumentnum = 0;
var done = "", todo = arguments[argumentnum++];

/* parse still to be done format string */
var m;
while (m = /^([^%]*)%(/d+$)?([#0 +'-]+)?(/*|/d+)?(/./*|/./d+)?([%diouxXfFcs])(.*)$/.exec(todo)) {
var pProlog = m[1],
pAccess = m[2],
pFlags = m[3],
pMinLength = m[4],
pPrecision = m[5],
pType = m[6],
pEpilog = m[7];

/* determine substitution */
var subst;
if (pType == '%')
/* special case: escaped percent character */
subst = '%';
else {
/* parse padding and justify aspects of flags */
var padWith = ' ';
var justifyRight = true;
if (pFlags) {
if (pFlags.indexOf('0') >= 0)
padWith = '0';
if (pFlags.indexOf('-') >= 0) {
padWith = ' ';
justifyRight = false;
}
}
else
pFlags = "";

/* determine minimum length */
var minLength = -1;
if (pMinLength) {
if (pMinLength == "*") {
var access = argumentnum++;
if (access >= arguments.length)
alert("sprintf:ERROR: not enough arguments");
minLength = arguments[access];
}
else
minLength = parseInt(pMinLength, 10);
}

/* determine precision */
var precision = -1;
if (pPrecision) {
if (pPrecision == ".*") {
var access = argumentnum++;
if (access >= arguments.length)
alert("sprintf:ERROR: not enough arguments");
precision = arguments[access];
}
else
precision = parseInt(pPrecision.substring(1), 10);
}

/* determine how to fetch argument */
var access = argumentnum++;
if (pAccess)
access = parseInt(pAccess.substring(0, pAccess.length - 1), 10);
if (access >= arguments.length)
alert("sprintf:ERROR: not enough arguments");

/* dispatch into expansions according to type */
var prefix = "";
switch (pType) {
case 'd':
case 'i':
subst = arguments[access];
if (typeof subst != "number")
subst = 0;
subst = subst.toString(10);
if (pFlags.indexOf('#') >= 0 && subst >= 0)
subst = "+" + subst;
if (pFlags.indexOf(' ') >= 0 && subst >= 0)
subst = " " + subst;
break;
case 'o':
subst = arguments[access];
if (typeof subst != "number")
subst = 0;
subst = subst.toString(8);
break;
case 'u':
subst = arguments[access];
if (typeof subst != "number")
subst = 0;
subst = Math.abs(subst);
subst = subst.toString(10);
break;
case 'x':
subst = arguments[access];
if (typeof subst != "number")
subst = 0;
subst = subst.toString(16).toLowerCase();
if (pFlags.indexOf('#') >= 0)
prefix = "0x";
break;
case 'X':
subst = arguments[access];
if (typeof subst != "number")
subst = 0;
subst = subst.toString(16).toUpperCase();
if (pFlags.indexOf('#') >= 0)
prefix = "0X";
break;
case 'f':
case 'F':
subst = arguments[access];
if (typeof subst != "number")
subst = 0.0;
subst = 0.0 + subst;
if (precision > -1) {
if (subst.toFixed)
subst = subst.toFixed(precision);
else {
subst = (Math.round(subst * Math.pow(10, precision)) / Math.pow(10, precision));
subst += "0000000000";
subst = subst.substr(0, subst.indexOf(".")+precision+1);
}
}
subst = '' + subst;
if (pFlags.indexOf("'") >= 0) {
var k = 0;
for (var i = (subst.length - 1) - 3; i >= 0; i -= 3) {
subst = subst.substring(0, i) + (k == 0 ? "." : ",") + subst.substring(i);
k = (k + 1) % 2;
}
}
break;
case 'c':
subst = arguments[access];
if (typeof subst != "number")
subst = 0;
subst = String.fromCharCode(subst);
break;
case 's':
subst = arguments[access];
if (precision > -1)
subst = subst.substr(0, precision);
if (typeof subst != "string")
subst = "";
break;
}

/* apply optional padding */
var padding = minLength - subst.toString().length - prefix.toString().length;
if (padding > 0) {
var arrTmp = new Array(padding + 1);
if (justifyRight)
subst = arrTmp.join(padWith) + subst;
else
subst = subst + arrTmp.join(padWith);
}

/* add optional prefix */
subst = prefix + subst;
}

/* update the processing queue */
done = done + pProlog + subst;
todo = pEpilog;
}
return (done + todo);
}
 

C语言sprintf()函数:将格式化的数据写入字符串

摘自:http://c.biancheng.net/cpp/html/295.html 头文件:#include sprintf()函数用于将格式化的数据写入字符串,其原型为:    ...
  • li_qcxy
  • li_qcxy
  • 2017年01月07日 23:45
  • 652

sprintf---字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。

函数简介编辑 功能 把格式化的数据写入某个字符串缓冲区。 头文件 stdio.h 原型 int sprintf( char *buffer, const char *forma...
  • u012717858
  • u012717858
  • 2015年09月11日 21:07
  • 1647

sprintf 字符串格式化

It may be old-fashioned, but I still find printf (and sprintf and _vsnprintf) incredibly useful, bot...
  • guang670248515
  • guang670248515
  • 2017年04月15日 21:11
  • 455

格式化字符串漏洞简介

简介格式化字符串,也是一种比较常见的漏洞类型。
  • PrettyDay
  • PrettyDay
  • 2015年12月20日 23:27
  • 4458

sprintf() 格式化输出函数

sprintf() 格式化输出函数(图形) 功能: 函数sprintf()用来作格式化的输出。 用法: 此函数调用方式为int sprintf(char *string,char *format,...
  • qing101hua
  • qing101hua
  • 2016年10月26日 10:34
  • 3338

perl中sprintf函数的使用方法

对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理。 perl中的sprintf的用法如下: 字符串变成相应的数字eval sprint...
  • AnneQiQi
  • AnneQiQi
  • 2016年10月20日 20:20
  • 1806

c函数之sprintf,sscanf函数使用(字符串与整型互转函数)

1)sprintf     字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。 函数原型:     int sprintf( char *buffer...
  • Ctrl_qun
  • Ctrl_qun
  • 2017年01月22日 13:48
  • 1073

php中的sprintf()函数的format格式字符串

上次碰到的ASCII码问题,查看别人博客时,发现使用sprintf(),可以来输出。这个输出函数,以前也看了好多次,然而并未仔细看它的用途。这次就彻底查看手册,整明白,到底可以做什么。就有了如下的文档...
  • beyond__devil
  • beyond__devil
  • 2016年10月04日 22:54
  • 4510

keil51下使用sprintf问题

测试环境:keil c51 + STC89C52 说明: 1.keil的不定参数只有15个字节 也就是说sizeof(...) 加起来总共不能超过15字节,否则会出错 2.当不定参数中有常数...
  • lin111000713
  • lin111000713
  • 2014年08月06日 11:22
  • 2435

QT中QString 类的使用

QString 类中各函数的作用。 一、字符串连接函数。 1、QString也重载的+和+=运算符。这两个运算符可以把两个字符串连接到一起。     2、QString的append()函数...
  • sbisyju
  • sbisyju
  • 2013年04月13日 15:45
  • 37609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Javascript 版本的 Sprintf 字符串格式化函数
举报原因:
原因补充:

(最多只允许输入30个字)