/* 書式つき出力ルーチン by Shigenobu AOKI 使用法は以下の通り printf(書式, arg1, arg2..) 書式として許されるのは以下の通り(W,D は数値 W > D) %s, %i, %d, %f, %g, %Ws, %Wi, %Wd, %W.Df, %W.Dg, /, %/, %% %s 対応する引数(文字列,または数値)を出力する %Ws 対応する引数(文字列,または数値)を出力幅 W で右詰で出力する %-Ws 対応する引数(文字列,または数値)を出力幅 W で左詰で出力する %i, %d 対応する引数(数値)を(小数点以下を四捨五入して)整数値とし て出力する %Wi, %Wd 対応する引数(数値)を(小数点以下を四捨五入して)整数値と して,出力幅 W で右詰で出力する %f 対応する引数(数値)を実数値として出力する(小数点以下の桁数 は3を仮定) %W.Df 対応する引数(数値)を実数値として,出力幅 W,小数点以下の桁 数 D で右詰で出力する %g 対応する引数(数値)を実数値として,浮動小数点形式で出力する %W.Dg 対応する引数(数値)を実数値として,浮動小数点形式で,出力幅 W,有効数字桁数 D で右詰で出力する 改行は / であり,書式内に文字としての / を含めるときは %/ と記述 書式内に文字としての % を含めるときは %% と記述 以下のように用意された form 中の, document.Result.result.value へ書き込む
出力欄
なお,printf.js を使うスクリプトで document.Result.result.value にア クセスするのはこの関数のみであること */ function err100(string) { alert(string) } function isDigit(c) { return "0123456789.".indexOf(c) == -1 ? 0 : 1 } var newline = (navigator.appVersion.lastIndexOf('Win') != -1) ? "\r\n" : "\n" var string_constant_blank = " " var string_constant_zero = "0000000000000000000000000000000000" var _line = "" // 出力行バッファ function out_one_line() { document.Result.result.value +=_line+newline _line = "" } function printf(arg) { var i, c, c2, c3, ww, pointer = 1, w = 0, d = 0, left, piriod var format = printf.arguments[0] for (i = 0; i < format.length; i++) { c = format.charAt(i) if (c == "/") { if (_line == "") _line = " " out_one_line() } else if (c == "%") { left = 0 i++ c2 = format.charAt(i) if (c2 == "%" || c2 == "/") { _line += c2 continue } else if (c2 == "-") { left = 1 c2 = format.charAt(++i) } if (isDigit(c2)) { piriod = w = d = 0 while ((c3 = format.charAt(i)) != "s" && c3 != "f" && c3 != "g" && c3 != "i" && c3 != "d") { if (c3 == ".") { piriod = 1 } else if (isDigit(c3) == 0) { err100("non digit after % ("+c3+")") } else if (piriod == 0) { w = w*10+eval(c3) } else if (piriod == 1) { d = d*10+eval(c3) } i++ } if (c3 == "s") { print_string(left, w, printf.arguments[pointer++]) } else if (c3 == "g" || c3 == "f") { print_number(c3, w, d, printf.arguments[pointer++]) } else if (c3 == "i" || c3 == "d") { print_number(c3, w, 0, printf.arguments[pointer++]) } } else if (c2 == "s") { print_string(left, 0, printf.arguments[pointer++]) } else if (c2 == "f") { print_number(c2, 0, 3, printf.arguments[pointer++]) } else if (c2 == "g") { print_number(c2, 0, 6, printf.arguments[pointer++]) } else if (c2 == "i" || c2 == "d") { print_number(c2, 0, 0, printf.arguments[pointer++]) } } else { _line += c } } } function print_string(left, w, arg) { var ww, temp if (w != 0) { ww = (""+arg).length if (left == 1) { if (ww > w) { _line += arg } else { _line += arg+string_constant_blank.substring(0, w-ww) } } else { if (ww > w) { _line += arg } else { _line += string_constant_blank.substring(0, w-ww)+arg } } } else { _line += arg } } function print_number(gf, w, d, number) { if (gf == "g") { _line += print_number_g(w, d, number) } else if (gf == "f") { _line += print_number_f(w, d, number) } else if (gf == "i" || gf == "d") { _line += print_number_i(w, d, number) } } function print_number_i(w, d, number) { var s, p, ww s = fixed2(number, d) ww = (""+s).length if (ww < w) { s = string_constant_blank.substring(0, w-ww)+s } return s } function print_number_f(w, d, number) { var s, p, ww s = fixed2(number, d) if ((""+s).charAt(0) == ".") { s = "0"+s } else if ((""+s).indexOf("-.") != -1) { s = "-0"+(""+s).substring(1, (""+s).length) } if ((""+s).indexOf(".") == -1) { s += "." } ww = (""+s).length-1 p = (""+s).indexOf(".") if (ww-p < d) { s += string_constant_zero.substring(0, d-(ww-p)) } ww = (""+s).length if (ww < w) { s = string_constant_blank.substring(0, w-ww)+s } return s } function print_number_g(w, d, number) { var abs = Math.abs(number) if (number == 0 || (0.001 <= abs && abs < Math.pow(10, d))) { return print_number_g2(w, d, number) } else { return print_number_e(w, d, number) } } function print_number_g2(w, d, number) { var s, p, ww, abs, temp abs = Math.abs(number) if (number == 0) { temp = 1 } else if (abs >= 1) { temp = d-(""+Math.floor(abs)).length } else { temp = d-1 while (abs < 1) { temp++ abs *= 10 } } s = fixed2(number, temp) if ((""+s).charAt(0) == ".") { s = "0"+s } else if ((""+s).indexOf("-.") != -1) { s = "-0"+(""+s).substring(1, (""+s).length) } if ((""+s).indexOf(".") == -1) { s += "." } ww = (""+s).length ww -= (number < 0 ? 1 : 0)+(Math.abs(number) < 1 ? 1 : 0)+1 if (ww < d) { s += string_constant_zero.substring(0, d-ww) } ww = (""+s).length if (ww < w) { s = string_constant_blank.substring(0, w-ww)+s } return s } function print_number_e(w, d, number) { var s, p, ww, exponent, sign, abs, temp w -= 4 exponent = 0 abs = Math.abs(number) while (abs < 1) { exponent-- abs *= 10 } while (abs >= 10) { exponent++ abs /= 10 } temp = (number < 0 ? -1 : 1)*abs return print_number_f(w, d-1, temp)+"e"+(exponent < 0 ? "-" : "+") +rec(exponent) } function rec(expo) { expo = Math.abs(expo) return (expo < 10) ? "0"+expo : ""+expo } function fixed2(x, d) { return Math.round(x*Math.pow(10,d))/Math.pow(10,d) }