sprintf.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // from http://www.esqsoft.com/javascript_examples/javascript-sprintf.js
  2. function sprintf() {
  3. if (!arguments || arguments.length < 1 || !RegExp) {
  4. return;
  5. }
  6. var str = arguments[0];
  7. var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
  8. var a = b = [], numSubstitutions = 0, numMatches = 0;
  9. var subst;
  10. while (a = re.exec(str)) {
  11. var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
  12. var pPrecision = a[5], pType = a[6], rightPart = a[7];
  13. numMatches++;
  14. if (pType == '%') {
  15. subst = '%';
  16. } else {
  17. numSubstitutions++;
  18. if (numSubstitutions >= arguments.length) {
  19. qWarning('Error! Not enough function arguments ('
  20. + (arguments.length - 1)
  21. + ', excluding the string)\n'
  22. + 'for the number of substitution parameters in string ('
  23. + numSubstitutions + ' so far).');
  24. }
  25. var param = arguments[numSubstitutions];
  26. var pad = '';
  27. if (pPad && pPad.substr(0, 1) == "'")
  28. pad = leftpart.substr(1, 1);
  29. else if (pPad)
  30. pad = pPad;
  31. var justifyRight = true;
  32. if (pJustify && pJustify === "-")
  33. justifyRight = false;
  34. var minLength = -1;
  35. if (pMinLength)
  36. minLength = parseInt(pMinLength);
  37. var precision = -1;
  38. if (pPrecision && pType == 'f')
  39. precision = parseInt(pPrecision.substring(1));
  40. subst = param;
  41. switch (pType) {
  42. case 'b':
  43. subst = parseInt(param).toString(2);
  44. break;
  45. case 'c':
  46. subst = String.fromCharCode(parseInt(param));
  47. break;
  48. case 'd':
  49. subst = parseInt(param) ? parseInt(param) : 0;
  50. break;
  51. case 'u':
  52. subst = Math.abs(param);
  53. break;
  54. case 'f':
  55. subst = (precision > -1) ? Math.round(parseFloat(param)
  56. * Math.pow(10, precision))
  57. / Math.pow(10, precision) : parseFloat(param);
  58. break;
  59. case 'o':
  60. subst = parseInt(param).toString(8);
  61. break;
  62. case 's':
  63. subst = param;
  64. break;
  65. case 'x':
  66. subst = ('' + parseInt(param).toString(16)).toLowerCase();
  67. break;
  68. case 'X':
  69. subst = ('' + parseInt(param).toString(16)).toUpperCase();
  70. break;
  71. }
  72. var padLeft = minLength - subst.toString().length;
  73. if (padLeft > 0) {
  74. var arrTmp = new Array(padLeft + 1);
  75. var padding = arrTmp.join(pad ? pad : " ");
  76. } else {
  77. var padding = "";
  78. }
  79. }
  80. str = leftpart + padding + subst + rightPart;
  81. }
  82. return str;
  83. }