157 lines
3.9 KiB
JavaScript
157 lines
3.9 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 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"
|
|
};
|
|
|
|
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) {
|
|
sNum = convertToInternationalCurrencySystem(val)
|
|
}
|
|
|
|
return sNum;
|
|
};
|
|
|
|
function convertToInternationalCurrencySystem (val) {
|
|
// Nine 0's - Billions
|
|
return Math.abs(Number(val)) >= 1.0e+9
|
|
? (Math.abs(Number(val)) / 1.0e+9).toFixed(2) + "B"
|
|
// Six 0's - Millions
|
|
: Math.abs(Number(val)) >= 1.0e+6
|
|
? (Math.abs(Number(val)) / 1.0e+6).toFixed(2) + "M"
|
|
: Math.abs(Number(val));
|
|
}
|
|
|