295 lines
6.6 KiB
JavaScript
295 lines
6.6 KiB
JavaScript
|
// polyfill.number.toLocaleDateString
|
||
|
// Copied from: https://github.com/willsp/polyfill-Number.toLocaleString-with-Locales
|
||
|
// Got this from MDN:
|
||
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString#Example:_Checking_for_support_for_locales_and_options_arguments
|
||
|
function toLocaleStringSupportsLocales() {
|
||
|
var number = 0;
|
||
|
try {
|
||
|
number.toLocaleString("i");
|
||
|
} catch (e) {
|
||
|
return e.name === "RangeError";
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
var replaceSeparators = function(sNum, separators) {
|
||
|
var sNumParts = sNum.split('.');
|
||
|
if (separators && separators.thousands) {
|
||
|
sNumParts[0] = sNumParts[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1" + separators.thousands);
|
||
|
}
|
||
|
sNum = sNumParts.join(separators.decimal);
|
||
|
|
||
|
return sNum;
|
||
|
};
|
||
|
|
||
|
var renderFormat = function(template, props) {
|
||
|
for (var prop in props) {
|
||
|
if (props[prop].indexOf('-') !== -1) {
|
||
|
props[prop] = props[prop].replace('-', '');
|
||
|
template = '-' + template;
|
||
|
}
|
||
|
template = template.replace("{{" + prop + "}}", props[prop]);
|
||
|
}
|
||
|
|
||
|
return template;
|
||
|
};
|
||
|
|
||
|
var mapMatch = function(map, locale) {
|
||
|
var match = locale;
|
||
|
var language = locale && locale.toLowerCase().match(/^\w+/);
|
||
|
|
||
|
if (!map.hasOwnProperty(locale)) {
|
||
|
if (map.hasOwnProperty(language)) {
|
||
|
match = language;
|
||
|
} else {
|
||
|
match = "en";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return map[match];
|
||
|
};
|
||
|
|
||
|
var dotThousCommaDec = function(sNum) {
|
||
|
var separators = {
|
||
|
decimal: ',',
|
||
|
thousands: '.'
|
||
|
};
|
||
|
|
||
|
return replaceSeparators(sNum, separators);
|
||
|
};
|
||
|
|
||
|
var commaThousDotDec = function(sNum) {
|
||
|
var separators = {
|
||
|
decimal: '.',
|
||
|
thousands: ','
|
||
|
};
|
||
|
|
||
|
return replaceSeparators(sNum, separators);
|
||
|
};
|
||
|
|
||
|
var spaceThousCommaDec = function(sNum) {
|
||
|
var seperators = {
|
||
|
decimal: ',',
|
||
|
thousands: '\u00A0'
|
||
|
};
|
||
|
|
||
|
return replaceSeparators(sNum, seperators);
|
||
|
};
|
||
|
|
||
|
var apostrophThousDotDec = function(sNum) {
|
||
|
var seperators = {
|
||
|
decimal: '.',
|
||
|
thousands: '\u0027'
|
||
|
};
|
||
|
|
||
|
return replaceSeparators(sNum, seperators);
|
||
|
};
|
||
|
|
||
|
var transformForLocale = {
|
||
|
en: commaThousDotDec,
|
||
|
'en-GB': commaThousDotDec,
|
||
|
'en-US': commaThousDotDec,
|
||
|
it: dotThousCommaDec,
|
||
|
fr: spaceThousCommaDec,
|
||
|
de: dotThousCommaDec,
|
||
|
"de-DE": dotThousCommaDec,
|
||
|
"de-AT": dotThousCommaDec,
|
||
|
"de-CH": apostrophThousDotDec,
|
||
|
"de-LI": apostrophThousDotDec,
|
||
|
"de-BE": dotThousCommaDec,
|
||
|
"nl": dotThousCommaDec,
|
||
|
"nl-BE": dotThousCommaDec,
|
||
|
"nl-NL": dotThousCommaDec,
|
||
|
ro: dotThousCommaDec,
|
||
|
"ro-RO": dotThousCommaDec,
|
||
|
ru: spaceThousCommaDec,
|
||
|
"ru-RU": spaceThousCommaDec,
|
||
|
hu: spaceThousCommaDec,
|
||
|
"hu-HU": spaceThousCommaDec,
|
||
|
"da-DK": dotThousCommaDec,
|
||
|
"nb-NO": spaceThousCommaDec
|
||
|
};
|
||
|
|
||
|
var currencyFormatMap = {
|
||
|
en: "pre",
|
||
|
'en-GB': "pre",
|
||
|
'en-US': "pre",
|
||
|
it: "post",
|
||
|
fr: "post",
|
||
|
de: "post",
|
||
|
"de-DE": "post",
|
||
|
"de-AT": "prespace",
|
||
|
"de-CH": "prespace",
|
||
|
"de-LI": "post",
|
||
|
"de-BE": "post",
|
||
|
"nl": "post",
|
||
|
"nl-BE": "post",
|
||
|
"nl-NL": "post",
|
||
|
ro: "post",
|
||
|
"ro-RO": "post",
|
||
|
ru: "post",
|
||
|
"ru-RU": "post",
|
||
|
hu: "post",
|
||
|
"hu-HU": "post",
|
||
|
"da-DK": "post",
|
||
|
"nb-NO": "post"
|
||
|
};
|
||
|
|
||
|
var currencySymbols = {
|
||
|
"afn": "؋",
|
||
|
"ars": "$",
|
||
|
"awg": "ƒ",
|
||
|
"aud": "$",
|
||
|
"azn": "₼",
|
||
|
"bsd": "$",
|
||
|
"bbd": "$",
|
||
|
"byr": "p.",
|
||
|
"bzd": "BZ$",
|
||
|
"bmd": "$",
|
||
|
"bob": "Bs.",
|
||
|
"bam": "KM",
|
||
|
"bwp": "P",
|
||
|
"bgn": "лв",
|
||
|
"brl": "R$",
|
||
|
"bnd": "$",
|
||
|
"khr": "៛",
|
||
|
"cad": "$",
|
||
|
"kyd": "$",
|
||
|
"clp": "$",
|
||
|
"cny": "¥",
|
||
|
"cop": "$",
|
||
|
"crc": "₡",
|
||
|
"hrk": "kn",
|
||
|
"cup": "₱",
|
||
|
"czk": "Kč",
|
||
|
"dkk": "kr",
|
||
|
"dop": "RD$",
|
||
|
"xcd": "$",
|
||
|
"egp": "£",
|
||
|
"svc": "$",
|
||
|
"eek": "kr",
|
||
|
"eur": "€",
|
||
|
"fkp": "£",
|
||
|
"fjd": "$",
|
||
|
"ghc": "¢",
|
||
|
"gip": "£",
|
||
|
"gtq": "Q",
|
||
|
"ggp": "£",
|
||
|
"gyd": "$",
|
||
|
"hnl": "L",
|
||
|
"hkd": "$",
|
||
|
"huf": "Ft",
|
||
|
"isk": "kr",
|
||
|
"inr": "₹",
|
||
|
"idr": "Rp",
|
||
|
"irr": "﷼",
|
||
|
"imp": "£",
|
||
|
"ils": "₪",
|
||
|
"jmd": "J$",
|
||
|
"jpy": "¥",
|
||
|
"jep": "£",
|
||
|
"kes": "KSh",
|
||
|
"kzt": "лв",
|
||
|
"kpw": "₩",
|
||
|
"krw": "₩",
|
||
|
"kgs": "лв",
|
||
|
"lak": "₭",
|
||
|
"lvl": "Ls",
|
||
|
"lbp": "£",
|
||
|
"lrd": "$",
|
||
|
"ltl": "Lt",
|
||
|
"mkd": "ден",
|
||
|
"myr": "RM",
|
||
|
"mur": "₨",
|
||
|
"mxn": "$",
|
||
|
"mnt": "₮",
|
||
|
"mzn": "MT",
|
||
|
"nad": "$",
|
||
|
"npr": "₨",
|
||
|
"ang": "ƒ",
|
||
|
"nzd": "$",
|
||
|
"nio": "C$",
|
||
|
"ngn": "₦",
|
||
|
"nok": "kr",
|
||
|
"omr": "﷼",
|
||
|
"pkr": "₨",
|
||
|
"pab": "B/.",
|
||
|
"pyg": "Gs",
|
||
|
"pen": "S/.",
|
||
|
"php": "₱",
|
||
|
"pln": "zł",
|
||
|
"qar": "﷼",
|
||
|
"ron": "lei",
|
||
|
"rub": "₽",
|
||
|
"shp": "£",
|
||
|
"sar": "﷼",
|
||
|
"rsd": "Дин.",
|
||
|
"scr": "₨",
|
||
|
"sgd": "$",
|
||
|
"sbd": "$",
|
||
|
"sos": "S",
|
||
|
"zar": "R",
|
||
|
"lkr": "₨",
|
||
|
"sek": "kr",
|
||
|
"chf": "CHF",
|
||
|
"srd": "$",
|
||
|
"syp": "£",
|
||
|
"tzs": "TSh",
|
||
|
"twd": "NT$",
|
||
|
"thb": "฿",
|
||
|
"ttd": "TT$",
|
||
|
"try": "",
|
||
|
"trl": "₤",
|
||
|
"tvd": "$",
|
||
|
"ugx": "USh",
|
||
|
"uah": "₴",
|
||
|
"gbp": "£",
|
||
|
"usd": "$",
|
||
|
"uyu": "$U",
|
||
|
"uzs": "лв",
|
||
|
"vef": "Bs",
|
||
|
"vnd": "₫",
|
||
|
"yer": "﷼",
|
||
|
"zwd": "Z$"
|
||
|
};
|
||
|
|
||
|
var currencyFormats = {
|
||
|
pre: "{{code}}{{num}}",
|
||
|
post: "{{num}} {{code}}",
|
||
|
prespace: "{{code}} {{num}}"
|
||
|
};
|
||
|
|
||
|
function toLocaleString(val, locale, options) {
|
||
|
if (locale && locale.length < 2)
|
||
|
throw new RangeError("Invalid language tag: " + locale);
|
||
|
|
||
|
var sNum;
|
||
|
|
||
|
if (options && (options.minimumFractionDigits || options.minimumFractionDigits === 0)) {
|
||
|
sNum = Number(val).toFixed(options.minimumFractionDigits);
|
||
|
} else {
|
||
|
sNum = Number(val).toString();
|
||
|
}
|
||
|
|
||
|
sNum = mapMatch(transformForLocale, locale)(sNum, options);
|
||
|
|
||
|
if(options && options.currency && options.style === "currency") {
|
||
|
var format = currencyFormats[mapMatch(currencyFormatMap, locale)];
|
||
|
var symbol = currencySymbols[options.currency.toLowerCase()];
|
||
|
if(options.currencyDisplay === "code" || !symbol) {
|
||
|
sNum = renderFormat(format, {
|
||
|
num: sNum,
|
||
|
code: options.currency.toUpperCase()
|
||
|
});
|
||
|
} else {
|
||
|
sNum = renderFormat(format, {
|
||
|
num: sNum,
|
||
|
code: symbol
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return sNum;
|
||
|
};
|
||
|
|