зеркало из https://github.com/mozilla/pjs.git
305 строки
8.7 KiB
JavaScript
305 строки
8.7 KiB
JavaScript
|
/***
|
||
|
|
||
|
MochiKit.Format 1.4
|
||
|
|
||
|
See <http://mochikit.com/> for documentation, downloads, license, etc.
|
||
|
|
||
|
(c) 2005 Bob Ippolito. All rights Reserved.
|
||
|
|
||
|
***/
|
||
|
|
||
|
if (typeof(dojo) != 'undefined') {
|
||
|
dojo.provide('MochiKit.Format');
|
||
|
}
|
||
|
|
||
|
if (typeof(MochiKit) == 'undefined') {
|
||
|
MochiKit = {};
|
||
|
}
|
||
|
|
||
|
if (typeof(MochiKit.Format) == 'undefined') {
|
||
|
MochiKit.Format = {};
|
||
|
}
|
||
|
|
||
|
MochiKit.Format.NAME = "MochiKit.Format";
|
||
|
MochiKit.Format.VERSION = "1.4";
|
||
|
MochiKit.Format.__repr__ = function () {
|
||
|
return "[" + this.NAME + " " + this.VERSION + "]";
|
||
|
};
|
||
|
MochiKit.Format.toString = function () {
|
||
|
return this.__repr__();
|
||
|
};
|
||
|
|
||
|
MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) {
|
||
|
return function (num) {
|
||
|
num = parseFloat(num);
|
||
|
if (typeof(num) == "undefined" || num === null || isNaN(num)) {
|
||
|
return placeholder;
|
||
|
}
|
||
|
var curheader = header;
|
||
|
var curfooter = footer;
|
||
|
if (num < 0) {
|
||
|
num = -num;
|
||
|
} else {
|
||
|
curheader = curheader.replace(/-/, "");
|
||
|
}
|
||
|
var me = arguments.callee;
|
||
|
var fmt = MochiKit.Format.formatLocale(locale);
|
||
|
if (isPercent) {
|
||
|
num = num * 100.0;
|
||
|
curfooter = fmt.percent + curfooter;
|
||
|
}
|
||
|
num = MochiKit.Format.roundToFixed(num, precision);
|
||
|
var parts = num.split(/\./);
|
||
|
var whole = parts[0];
|
||
|
var frac = (parts.length == 1) ? "" : parts[1];
|
||
|
var res = "";
|
||
|
while (whole.length < leadingZeros) {
|
||
|
whole = "0" + whole;
|
||
|
}
|
||
|
if (separatorAt) {
|
||
|
while (whole.length > separatorAt) {
|
||
|
var i = whole.length - separatorAt;
|
||
|
//res = res + fmt.separator + whole.substring(i, whole.length);
|
||
|
res = fmt.separator + whole.substring(i, whole.length) + res;
|
||
|
whole = whole.substring(0, i);
|
||
|
}
|
||
|
}
|
||
|
res = whole + res;
|
||
|
if (precision > 0) {
|
||
|
while (frac.length < trailingZeros) {
|
||
|
frac = frac + "0";
|
||
|
}
|
||
|
res = res + fmt.decimal + frac;
|
||
|
}
|
||
|
return curheader + res + curfooter;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.numberFormatter */
|
||
|
MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) {
|
||
|
// http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
|
||
|
// | 0 | leading or trailing zeros
|
||
|
// | # | just the number
|
||
|
// | , | separator
|
||
|
// | . | decimal separator
|
||
|
// | % | Multiply by 100 and format as percent
|
||
|
if (typeof(placeholder) == "undefined") {
|
||
|
placeholder = "";
|
||
|
}
|
||
|
var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
|
||
|
if (!match) {
|
||
|
throw TypeError("Invalid pattern");
|
||
|
}
|
||
|
var header = pattern.substr(0, match.index);
|
||
|
var footer = pattern.substr(match.index + match[0].length);
|
||
|
if (header.search(/-/) == -1) {
|
||
|
header = header + "-";
|
||
|
}
|
||
|
var whole = match[1];
|
||
|
var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : "";
|
||
|
var isPercent = (typeof(match[3]) == "string" && match[3] != "");
|
||
|
var tmp = whole.split(/,/);
|
||
|
var separatorAt;
|
||
|
if (typeof(locale) == "undefined") {
|
||
|
locale = "default";
|
||
|
}
|
||
|
if (tmp.length == 1) {
|
||
|
separatorAt = null;
|
||
|
} else {
|
||
|
separatorAt = tmp[1].length;
|
||
|
}
|
||
|
var leadingZeros = whole.length - whole.replace(/0/g, "").length;
|
||
|
var trailingZeros = frac.length - frac.replace(/0/g, "").length;
|
||
|
var precision = frac.length;
|
||
|
var rval = MochiKit.Format._numberFormatter(
|
||
|
placeholder, header, footer, locale, isPercent, precision,
|
||
|
leadingZeros, separatorAt, trailingZeros
|
||
|
);
|
||
|
var m = MochiKit.Base;
|
||
|
if (m) {
|
||
|
var fn = arguments.callee;
|
||
|
var args = m.concat(arguments);
|
||
|
rval.repr = function () {
|
||
|
return [
|
||
|
self.NAME,
|
||
|
"(",
|
||
|
map(m.repr, args).join(", "),
|
||
|
")"
|
||
|
].join("");
|
||
|
};
|
||
|
}
|
||
|
return rval;
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.formatLocale */
|
||
|
MochiKit.Format.formatLocale = function (locale) {
|
||
|
if (typeof(locale) == "undefined" || locale === null) {
|
||
|
locale = "default";
|
||
|
}
|
||
|
if (typeof(locale) == "string") {
|
||
|
var rval = MochiKit.Format.LOCALE[locale];
|
||
|
if (typeof(rval) == "string") {
|
||
|
rval = arguments.callee(rval);
|
||
|
MochiKit.Format.LOCALE[locale] = rval;
|
||
|
}
|
||
|
return rval;
|
||
|
} else {
|
||
|
return locale;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.twoDigitAverage */
|
||
|
MochiKit.Format.twoDigitAverage = function (numerator, denominator) {
|
||
|
if (denominator) {
|
||
|
var res = numerator / denominator;
|
||
|
if (!isNaN(res)) {
|
||
|
return MochiKit.Format.twoDigitFloat(numerator / denominator);
|
||
|
}
|
||
|
}
|
||
|
return "0";
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.twoDigitFloat */
|
||
|
MochiKit.Format.twoDigitFloat = function (someFloat) {
|
||
|
var sign = (someFloat < 0 ? '-' : '');
|
||
|
var s = Math.floor(Math.abs(someFloat) * 100).toString();
|
||
|
if (s == '0') {
|
||
|
return s;
|
||
|
}
|
||
|
if (s.length < 3) {
|
||
|
while (s.charAt(s.length - 1) == '0') {
|
||
|
s = s.substring(0, s.length - 1);
|
||
|
}
|
||
|
return sign + '0.' + s;
|
||
|
}
|
||
|
var head = sign + s.substring(0, s.length - 2);
|
||
|
var tail = s.substring(s.length - 2, s.length);
|
||
|
if (tail == '00') {
|
||
|
return head;
|
||
|
} else if (tail.charAt(1) == '0') {
|
||
|
return head + '.' + tail.charAt(0);
|
||
|
} else {
|
||
|
return head + '.' + tail;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.lstrip */
|
||
|
MochiKit.Format.lstrip = function (str, /* optional */chars) {
|
||
|
str = str + "";
|
||
|
if (typeof(str) != "string") {
|
||
|
return null;
|
||
|
}
|
||
|
if (!chars) {
|
||
|
return str.replace(/^\s+/, "");
|
||
|
} else {
|
||
|
return str.replace(new RegExp("^[" + chars + "]+"), "");
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.rstrip */
|
||
|
MochiKit.Format.rstrip = function (str, /* optional */chars) {
|
||
|
str = str + "";
|
||
|
if (typeof(str) != "string") {
|
||
|
return null;
|
||
|
}
|
||
|
if (!chars) {
|
||
|
return str.replace(/\s+$/, "");
|
||
|
} else {
|
||
|
return str.replace(new RegExp("[" + chars + "]+$"), "");
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.strip */
|
||
|
MochiKit.Format.strip = function (str, /* optional */chars) {
|
||
|
var self = MochiKit.Format;
|
||
|
return self.rstrip(self.lstrip(str, chars), chars);
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.truncToFixed */
|
||
|
MochiKit.Format.truncToFixed = function (aNumber, precision) {
|
||
|
aNumber = Math.floor(aNumber * Math.pow(10, precision));
|
||
|
var res = (aNumber * Math.pow(10, -precision)).toFixed(precision);
|
||
|
if (res.charAt(0) == ".") {
|
||
|
res = "0" + res;
|
||
|
}
|
||
|
return res;
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.roundToFixed */
|
||
|
MochiKit.Format.roundToFixed = function (aNumber, precision) {
|
||
|
return MochiKit.Format.truncToFixed(
|
||
|
aNumber + 0.5 * Math.pow(10, -precision),
|
||
|
precision
|
||
|
);
|
||
|
};
|
||
|
|
||
|
/** @id MochiKit.Format.percentFormat */
|
||
|
MochiKit.Format.percentFormat = function (someFloat) {
|
||
|
return MochiKit.Format.twoDigitFloat(100 * someFloat) + '%';
|
||
|
};
|
||
|
|
||
|
MochiKit.Format.EXPORT = [
|
||
|
"truncToFixed",
|
||
|
"roundToFixed",
|
||
|
"numberFormatter",
|
||
|
"formatLocale",
|
||
|
"twoDigitAverage",
|
||
|
"twoDigitFloat",
|
||
|
"percentFormat",
|
||
|
"lstrip",
|
||
|
"rstrip",
|
||
|
"strip"
|
||
|
];
|
||
|
|
||
|
MochiKit.Format.LOCALE = {
|
||
|
en_US: {separator: ",", decimal: ".", percent: "%"},
|
||
|
de_DE: {separator: ".", decimal: ",", percent: "%"},
|
||
|
fr_FR: {separator: " ", decimal: ",", percent: "%"},
|
||
|
"default": "en_US"
|
||
|
};
|
||
|
|
||
|
MochiKit.Format.EXPORT_OK = [];
|
||
|
MochiKit.Format.EXPORT_TAGS = {
|
||
|
':all': MochiKit.Format.EXPORT,
|
||
|
':common': MochiKit.Format.EXPORT
|
||
|
};
|
||
|
|
||
|
MochiKit.Format.__new__ = function () {
|
||
|
// MochiKit.Base.nameFunctions(this);
|
||
|
var base = this.NAME + ".";
|
||
|
var k, v, o;
|
||
|
for (k in this.LOCALE) {
|
||
|
o = this.LOCALE[k];
|
||
|
if (typeof(o) == "object") {
|
||
|
o.repr = function () { return this.NAME; };
|
||
|
o.NAME = base + "LOCALE." + k;
|
||
|
}
|
||
|
}
|
||
|
for (k in this) {
|
||
|
o = this[k];
|
||
|
if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') {
|
||
|
try {
|
||
|
o.NAME = base + k;
|
||
|
} catch (e) {
|
||
|
// pass
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
MochiKit.Format.__new__();
|
||
|
|
||
|
if (typeof(MochiKit.Base) != "undefined") {
|
||
|
MochiKit.Base._exportSymbols(this, MochiKit.Format);
|
||
|
} else {
|
||
|
(function (globals, module) {
|
||
|
if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined')
|
||
|
|| (MochiKit.__export__ === false)) {
|
||
|
var all = module.EXPORT_TAGS[":all"];
|
||
|
for (var i = 0; i < all.length; i++) {
|
||
|
globals[all[i]] = module[all[i]];
|
||
|
}
|
||
|
}
|
||
|
})(this, MochiKit.Format);
|
||
|
}
|