String.prototype.$ = function(...a) {
var i = -1;
var re = /(%+)(\+)?((0)?\d+)?(\.(\d+))?([bcdefosuxX])/g;
var f = function(...m) {
/* คำอธิบายตัวแปร
m[1]: กลุ่มเครื่องหมาย % ด้านหน้า
m[2]: เครื่องหมาย +
m[3]: ส่วนที่บอกว่าจะเติมสายอักขระให้ยาวอย่างต่ำกี่ตัว
m[4]: ส่วนที่บอกว่าจะเติมเลข 0 หรือช่องว่าง
m[5]: ส่วนที่บอกว่าจะเอาเลขทศนิยมกี่ตำแหน่ง
m[6]: จำนวนตำแหน่งทศนิยม
m[7]: [bcdefosuxX] ตัวกำหนดประเภท
*/
// จัดการกับเครื่องหมาย % ด้านหน้า
var s = m[1].replace(/%%/g, "%");
// ถ้าจำนวน % เป็นเลขคู่ ไม่ต้องทำอะไร
if (m[1].length % 2 == 0) {
return s + [m[2],m[3],m[5],m[7]].join("");
} // ถ้าจำนวน % เป็นเลขคี่ ให้จัดการแทนค่า
else {
s = s.slice(1); // เอา % ออกไปหนึ่งตัว
i++;
}
// ใส่เรื่องหมายบวกถ้าค่าเป็นบวกและไม่ใช่สายอักขระ
if (m[2] && m[7] != "s" && a[i] > 0) {
var buak = "+";
} // ถ้าเป็นลบหรือเป็นสายอักขระไม่ต้องใส่
else var buak = "";
// ถ้าเลือกเติม 0 เครื่องหมายบวกใส่ด้านหน้า
if (m[4] == "0") s += buak;
// แปลงข้อมูลตามชนิดที่ใส่มา
// เลขฐาน 2
if (m[7] == "b") {
var kaen = a[i].toString(2);
} // โค้ดตัวหนังสือ
else if (m[7] == "c") {
var kaen = String.fromCharCode(a[i]);
} // เลขจำนวนเต็ม
else if (m[7] == "d" || m[7] == "u") {
var kaen = a[i].toString();
} // เลขทศนิยมในรูป E
else if (m[7] == "e") {
if (m[5]) var kaen = a[i].toExponential(m[6]);
else var kaen = a[i].toExponential();
} // เลขทศนิยม
else if (m[7] == "f") {
var kaen = parseFloat(a[i]);
if (m[5]) kaen = kaen.toFixed(m[6]);
} // เลขฐาน 8
else if (m[7] == "o") {
var kaen = a[i].toString(8);
} // เลขฐาน 16 ใช้ตัวพิมพ์เล็ก
else if (m[7] == "x") {
var kaen = a[i].toString(16);
} // เลขฐาน 16 ใช้ตัวพิมพ์ใหญ่
else if (m[7] == "X") {
var kaen = a[i].toString(16).toUpperCase();
} // สายอักขระธรรมดา
else var kaen = a[i];
// ใส่ 0 หรือช่องว่าง
if (m[3]) {
var n0 = parseInt(m[3]) - (kaen.length + buak.length);
while (n0 > 0) {
n0--;
// ใส่ 0
if (m[7] != "s" && m[4] == "0") s += "0";
// ใส่ช่องว่าง
else s += " ";
}
}
// ถ้าเลือกเติมช่องว่าง เครื่องหมายบวกใส่ด้านหลัง
if (!m[4]) s += buak;
return s + kaen;
};
return this.replace(re, f);
};
// ทดลองใช้
var ss = `%+04d
%+3d
%%d
%%%%02d
%d
%8.3f
%9.3e
%03o
%05x
%+07X
%b
%c
%7s`;
alert(ss.$(1, -2, 3, 4.2, 0.0053, 9, 315, 315, 61, 100, "ห"));
ผลที่ได้
+001 -2 %dd %%020d 3 4.200 5.300e-3 011 0013b +00013B 111101 d ห
ข้อมูล |
|
สายอักขระ |
ผลลัพธ์ |
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ