136 lines
3.9 KiB
JavaScript
136 lines
3.9 KiB
JavaScript
|
|
function exponentialFormat(num, precision, mantissa = true) {
|
|
let e = num.log10().floor();
|
|
let m = num.div(Decimal.pow(10, e));
|
|
if(m.toStringWithDecimalPlaces(precision) === 10) {
|
|
m = decimalOne;
|
|
e = e.add(1);
|
|
}
|
|
e = (e.gte(1e9) ? format(e, 3) : (e.gte(10000) ? commaFormat(e, 0) : e.toStringWithDecimalPlaces(0)))
|
|
if (mantissa) {
|
|
return m.toStringWithDecimalPlaces(precision)+"e"+e;
|
|
} else {
|
|
return "e"+e;
|
|
}
|
|
}
|
|
|
|
function commaFormat(num, precision) {
|
|
if (num === null || num === undefined) {
|
|
return "NaN";
|
|
}
|
|
if (num.mag < 0.001) {
|
|
return (0).toFixed(precision);
|
|
}
|
|
let init = num.toStringWithDecimalPlaces(precision)
|
|
let portions = init.split(".")
|
|
portions[0] = portions[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")
|
|
if (portions.length == 1) return portions[0]
|
|
return portions[0] + "." + portions[1]
|
|
}
|
|
|
|
function regularFormat(num, precision) {
|
|
if (num === null || num === undefined) {
|
|
return "NaN";
|
|
}
|
|
if (num.mag < 0.0001) {
|
|
return (0).toFixed(precision);
|
|
}
|
|
if (num.mag < 0.1 && precision !== 0) {
|
|
precision = Math.max(precision, 4);
|
|
}
|
|
return num.toStringWithDecimalPlaces(precision);
|
|
}
|
|
|
|
function format(decimal, precision=2, small) {
|
|
small = small || modInfo.allowSmall;
|
|
decimal = new Decimal(decimal);
|
|
if (isNaN(decimal.sign)||isNaN(decimal.layer)||isNaN(decimal.mag)) {
|
|
player.hasNaN = true;
|
|
return "NaN";
|
|
}
|
|
if (decimal.sign<0) {
|
|
return "-"+format(decimal.neg(), precision);
|
|
}
|
|
if (decimal.mag === Number.POSITIVE_INFINITY) {
|
|
return "Infinity";
|
|
}
|
|
if (decimal.gte("eeee1000")) {
|
|
const slog = decimal.slog();
|
|
if (slog.gte(1e6)) {
|
|
return "F" + format(slog.floor());
|
|
} else {
|
|
return Decimal.pow(10, slog.sub(slog.floor())).toStringWithDecimalPlaces(3) + "F" + commaFormat(slog.floor(), 0);
|
|
}
|
|
} else if (decimal.gte("1e100000")) {
|
|
return exponentialFormat(decimal, 0, false);
|
|
} else if (decimal.gte("1e1000")) {
|
|
return exponentialFormat(decimal, 0);
|
|
} else if (decimal.gte(1e9)) {
|
|
return exponentialFormat(decimal, precision);
|
|
} else if (decimal.gte(1e3)) {
|
|
return commaFormat(decimal, 0);
|
|
} else if (decimal.gte(0.001) || !small) {
|
|
return regularFormat(decimal, precision);
|
|
} else if (decimal.eq(0)) {
|
|
return (0).toFixed(precision);
|
|
}
|
|
|
|
decimal = invertOOM(decimal);
|
|
if (decimal.lt("1e1000")){
|
|
const val = exponentialFormat(decimal, precision);
|
|
return val.replace(/([^(?:e|F)]*)$/, '-$1');
|
|
} else {
|
|
return format(decimal, precision) + "⁻¹";
|
|
}
|
|
}
|
|
|
|
function formatWhole(decimal) {
|
|
decimal = new Decimal(decimal);
|
|
if (decimal.sign<0) {
|
|
return "-"+formatWhole(decimal.neg());
|
|
}
|
|
if (decimal.gte(1e9)) {
|
|
return format(decimal, 2);
|
|
}
|
|
if (decimal.lte(0.98) && !decimal.eq(0)) {
|
|
return format(decimal, 2);
|
|
}
|
|
return format(decimal, 0);
|
|
}
|
|
|
|
function formatTime(s) {
|
|
if (s<60) {
|
|
return format(s)+"s";
|
|
} else if (s<3600) {
|
|
return formatWhole(Math.floor(s/60))+"m "+format(s%60)+"s";
|
|
} else if (s<86400) {
|
|
return formatWhole(Math.floor(s/3600))+"h "+formatWhole(Math.floor(s/60)%60)+"m "+format(s%60)+"s";
|
|
} else if (s<31536000) {
|
|
return formatWhole(Math.floor(s/84600)%365)+"d " + formatWhole(Math.floor(s/3600)%24)+"h "+formatWhole(Math.floor(s/60)%60)+"m "+format(s%60)+"s";
|
|
} else {
|
|
return formatWhole(Math.floor(s/31536000))+"y "+formatWhole(Math.floor(s/84600)%365)+"d " + formatWhole(Math.floor(s/3600)%24)+"h "+formatWhole(Math.floor(s/60)%60)+"m "+format(s%60)+"s";
|
|
}
|
|
}
|
|
|
|
function toPlaces(x, precision, maxAccepted) {
|
|
x = new Decimal(x);
|
|
let result = x.toStringWithDecimalPlaces(precision);
|
|
if (new Decimal(result).gte(maxAccepted)) {
|
|
result = new Decimal(maxAccepted - Math.pow(0.1, precision)).toStringWithDecimalPlaces(precision);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// Will also display very small numbers
|
|
function formatSmall(x, precision=2) {
|
|
return format(x, precision, true);
|
|
}
|
|
|
|
function invertOOM(x){
|
|
let e = x.log10().ceil();
|
|
let m = x.div(Decimal.pow(10, e));
|
|
e = e.neg();
|
|
x = new Decimal(10).pow(e).times(m);
|
|
|
|
return x;
|
|
}
|