Format.js (8874B)
1 /*** 2 3 MochiKit.Format 1.4 4 5 See <http://mochikit.com/> for documentation, downloads, license, etc. 6 7 (c) 2005 Bob Ippolito. All rights Reserved. 8 9 ***/ 10 11 if (typeof(dojo) != 'undefined') { 12 dojo.provide('MochiKit.Format'); 13 } 14 15 if (typeof(MochiKit) == 'undefined') { 16 MochiKit = {}; 17 } 18 19 if (typeof(MochiKit.Format) == 'undefined') { 20 MochiKit.Format = {}; 21 } 22 23 MochiKit.Format.NAME = "MochiKit.Format"; 24 MochiKit.Format.VERSION = "1.4"; 25 MochiKit.Format.__repr__ = function () { 26 return "[" + this.NAME + " " + this.VERSION + "]"; 27 }; 28 MochiKit.Format.toString = function () { 29 return this.__repr__(); 30 }; 31 32 MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) { 33 return function (num) { 34 num = parseFloat(num); 35 if (typeof(num) == "undefined" || num === null || isNaN(num)) { 36 return placeholder; 37 } 38 var curheader = header; 39 var curfooter = footer; 40 if (num < 0) { 41 num = -num; 42 } else { 43 curheader = curheader.replace(/-/, ""); 44 } 45 var me = arguments.callee; 46 var fmt = MochiKit.Format.formatLocale(locale); 47 if (isPercent) { 48 num = num * 100.0; 49 curfooter = fmt.percent + curfooter; 50 } 51 num = MochiKit.Format.roundToFixed(num, precision); 52 var parts = num.split(/\./); 53 var whole = parts[0]; 54 var frac = (parts.length == 1) ? "" : parts[1]; 55 var res = ""; 56 while (whole.length < leadingZeros) { 57 whole = "0" + whole; 58 } 59 if (separatorAt) { 60 while (whole.length > separatorAt) { 61 var i = whole.length - separatorAt; 62 //res = res + fmt.separator + whole.substring(i, whole.length); 63 res = fmt.separator + whole.substring(i, whole.length) + res; 64 whole = whole.substring(0, i); 65 } 66 } 67 res = whole + res; 68 if (precision > 0) { 69 while (frac.length < trailingZeros) { 70 frac = frac + "0"; 71 } 72 res = res + fmt.decimal + frac; 73 } 74 return curheader + res + curfooter; 75 }; 76 }; 77 78 /** @id MochiKit.Format.numberFormatter */ 79 MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) { 80 // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html 81 // | 0 | leading or trailing zeros 82 // | # | just the number 83 // | , | separator 84 // | . | decimal separator 85 // | % | Multiply by 100 and format as percent 86 if (typeof(placeholder) == "undefined") { 87 placeholder = ""; 88 } 89 var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); 90 if (!match) { 91 throw TypeError("Invalid pattern"); 92 } 93 var header = pattern.substr(0, match.index); 94 var footer = pattern.substr(match.index + match[0].length); 95 if (header.search(/-/) == -1) { 96 header = header + "-"; 97 } 98 var whole = match[1]; 99 var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : ""; 100 var isPercent = (typeof(match[3]) == "string" && match[3] != ""); 101 var tmp = whole.split(/,/); 102 var separatorAt; 103 if (typeof(locale) == "undefined") { 104 locale = "default"; 105 } 106 if (tmp.length == 1) { 107 separatorAt = null; 108 } else { 109 separatorAt = tmp[1].length; 110 } 111 var leadingZeros = whole.length - whole.replace(/0/g, "").length; 112 var trailingZeros = frac.length - frac.replace(/0/g, "").length; 113 var precision = frac.length; 114 var rval = MochiKit.Format._numberFormatter( 115 placeholder, header, footer, locale, isPercent, precision, 116 leadingZeros, separatorAt, trailingZeros 117 ); 118 var m = MochiKit.Base; 119 if (m) { 120 var fn = arguments.callee; 121 var args = m.concat(arguments); 122 rval.repr = function () { 123 return [ 124 self.NAME, 125 "(", 126 map(m.repr, args).join(", "), 127 ")" 128 ].join(""); 129 }; 130 } 131 return rval; 132 }; 133 134 /** @id MochiKit.Format.formatLocale */ 135 MochiKit.Format.formatLocale = function (locale) { 136 if (typeof(locale) == "undefined" || locale === null) { 137 locale = "default"; 138 } 139 if (typeof(locale) == "string") { 140 var rval = MochiKit.Format.LOCALE[locale]; 141 if (typeof(rval) == "string") { 142 rval = arguments.callee(rval); 143 MochiKit.Format.LOCALE[locale] = rval; 144 } 145 return rval; 146 } else { 147 return locale; 148 } 149 }; 150 151 /** @id MochiKit.Format.twoDigitAverage */ 152 MochiKit.Format.twoDigitAverage = function (numerator, denominator) { 153 if (denominator) { 154 var res = numerator / denominator; 155 if (!isNaN(res)) { 156 return MochiKit.Format.twoDigitFloat(numerator / denominator); 157 } 158 } 159 return "0"; 160 }; 161 162 /** @id MochiKit.Format.twoDigitFloat */ 163 MochiKit.Format.twoDigitFloat = function (someFloat) { 164 var sign = (someFloat < 0 ? '-' : ''); 165 var s = Math.floor(Math.abs(someFloat) * 100).toString(); 166 if (s == '0') { 167 return s; 168 } 169 if (s.length < 3) { 170 while (s.charAt(s.length - 1) == '0') { 171 s = s.substring(0, s.length - 1); 172 } 173 return sign + '0.' + s; 174 } 175 var head = sign + s.substring(0, s.length - 2); 176 var tail = s.substring(s.length - 2, s.length); 177 if (tail == '00') { 178 return head; 179 } else if (tail.charAt(1) == '0') { 180 return head + '.' + tail.charAt(0); 181 } else { 182 return head + '.' + tail; 183 } 184 }; 185 186 /** @id MochiKit.Format.lstrip */ 187 MochiKit.Format.lstrip = function (str, /* optional */chars) { 188 str = str + ""; 189 if (typeof(str) != "string") { 190 return null; 191 } 192 if (!chars) { 193 return str.replace(/^\s+/, ""); 194 } else { 195 return str.replace(new RegExp("^[" + chars + "]+"), ""); 196 } 197 }; 198 199 /** @id MochiKit.Format.rstrip */ 200 MochiKit.Format.rstrip = function (str, /* optional */chars) { 201 str = str + ""; 202 if (typeof(str) != "string") { 203 return null; 204 } 205 if (!chars) { 206 return str.replace(/\s+$/, ""); 207 } else { 208 return str.replace(new RegExp("[" + chars + "]+$"), ""); 209 } 210 }; 211 212 /** @id MochiKit.Format.strip */ 213 MochiKit.Format.strip = function (str, /* optional */chars) { 214 var self = MochiKit.Format; 215 return self.rstrip(self.lstrip(str, chars), chars); 216 }; 217 218 /** @id MochiKit.Format.truncToFixed */ 219 MochiKit.Format.truncToFixed = function (aNumber, precision) { 220 aNumber = Math.floor(aNumber * Math.pow(10, precision)); 221 var res = (aNumber * Math.pow(10, -precision)).toFixed(precision); 222 if (res.charAt(0) == ".") { 223 res = "0" + res; 224 } 225 return res; 226 }; 227 228 /** @id MochiKit.Format.roundToFixed */ 229 MochiKit.Format.roundToFixed = function (aNumber, precision) { 230 return MochiKit.Format.truncToFixed( 231 aNumber + 0.5 * Math.pow(10, -precision), 232 precision 233 ); 234 }; 235 236 /** @id MochiKit.Format.percentFormat */ 237 MochiKit.Format.percentFormat = function (someFloat) { 238 return MochiKit.Format.twoDigitFloat(100 * someFloat) + '%'; 239 }; 240 241 MochiKit.Format.EXPORT = [ 242 "truncToFixed", 243 "roundToFixed", 244 "numberFormatter", 245 "formatLocale", 246 "twoDigitAverage", 247 "twoDigitFloat", 248 "percentFormat", 249 "lstrip", 250 "rstrip", 251 "strip" 252 ]; 253 254 MochiKit.Format.LOCALE = { 255 en_US: {separator: ",", decimal: ".", percent: "%"}, 256 de_DE: {separator: ".", decimal: ",", percent: "%"}, 257 fr_FR: {separator: " ", decimal: ",", percent: "%"}, 258 "default": "en_US" 259 }; 260 261 MochiKit.Format.EXPORT_OK = []; 262 MochiKit.Format.EXPORT_TAGS = { 263 ':all': MochiKit.Format.EXPORT, 264 ':common': MochiKit.Format.EXPORT 265 }; 266 267 MochiKit.Format.__new__ = function () { 268 // MochiKit.Base.nameFunctions(this); 269 var base = this.NAME + "."; 270 var k, v, o; 271 for (k in this.LOCALE) { 272 o = this.LOCALE[k]; 273 if (typeof(o) == "object") { 274 o.repr = function () { return this.NAME; }; 275 o.NAME = base + "LOCALE." + k; 276 } 277 } 278 for (k in this) { 279 o = this[k]; 280 if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { 281 try { 282 o.NAME = base + k; 283 } catch (e) { 284 // pass 285 } 286 } 287 } 288 }; 289 290 MochiKit.Format.__new__(); 291 292 if (typeof(MochiKit.Base) != "undefined") { 293 MochiKit.Base._exportSymbols(this, MochiKit.Format); 294 } else { 295 (function (globals, module) { 296 if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined') 297 || (MochiKit.__export__ === false)) { 298 var all = module.EXPORT_TAGS[":all"]; 299 for (var i = 0; i < all.length; i++) { 300 globals[all[i]] = module[all[i]]; 301 } 302 } 303 })(this, MochiKit.Format); 304 }