ホームページ > 記事 > ウェブフロントエンド > JavaScript_javascript スキルでの sprintf および printf 関数の実装
ほとんどの言語にある sprintf / printf 関数を JavaScript で実装します。
http://www.webtoolkit.info/javascript-sprintf.html: sprintf 関数の比較的完全なシミュレーション。利用可能なフォーマットのワイルドカード:
1.%% - パーセント記号自体を返します
2.%b - 2 進数
3.%c - ASCII 対応文字
4.%d - 整数
5.%f - 浮動小数点数
6.%o - 8 進数
7.%s - 文字列
8.%x - 16 進数 (小文字形式)
9.%X - 16 進数 (大文字形式)
% 記号とワイルドカード文字の間で使用可能なオプションは次のとおりです (例: %.2f):
1. (正と負の数値の記号として数値の前に - 記号を表示します。デフォルトでは、負の数値のみに - 記号が表示されます)
2.- (変数を左揃え)
3.0 (右揃えのパディング文字として 0 を使用)
4.[0-9] (変数の最小幅を設定します)
5..[0-9] (浮動小数点精度または文字列長を設定)
sprintfWrapper = {
init : function () {
if (引数の種類 == "未定義") { return null; }
if (arguments.length
if (引数の種類[0] != "文字列") { null を返します。 }
if (typeof RegExp == "未定義") { return null; }
var string = 引数[0];
var exp = new RegExp(/(%([%]|(-)?( |x20)?(0)?(d )?(.(d)?)?([bcdfosxX])))/g);
varmatches = 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;
一致[一致.長さ] = {
一致: 一致[0]、
左: match[3] ? true : false、
符号: 一致[4] || ''、
パッド: 一致[5] || ' '、
最小: 一致[6] || 0、
精度: match[8]、
コード: 一致[9] || '%'、
負の場合: parseInt(arguments[convCount]) < 0 ? true : false、
引数: String(arguments[convCount])
};
}
strings[strings.length] = string.substring(matchPosEnd);
if (matches.length == 0) { 文字列を返します。 }
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 = '%' } newString = strings[i]; } return newString; }、 変換 : function(match, nosign){ sprintf = sprintfWrapper.init;
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)));
置換 = 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));
置換 = sprintfWrapper.convert(matches[i]);
}
else if (matches[i].code == 'o') {
matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8));
置換 = 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));
置換 = sprintfWrapper.convert(matches[i]);
}
else if (matches[i].code == 'X') {
matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
置換 = sprintfWrapper.convert(matches[i]).toUpperCase();
}
他 {
substitution =matches[i].match;
}
newString = 置換;
newString = strings[i];
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
if (!match.left) {
if (match.pad == "0" || nosign) {
return match.sign パッド match.argument;
} else {
リターンパッド 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 パッド;
}
}
}
}
追加の書式設定を行わずに位置変数の内容を単純に置き換えたい場合は、比較的単純な YUI ツールで提供される printf を使用できます。
YAHOO.Tools.printf("表示文字列 {0}, {1}.", "1", "2"); のように使用する場合は、{?} を使用して一致させます。