status-desktop/ui/shared/polyfill.number.toLocaleStr...

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));
}