in src/axis/axis.ts [922:984]
export function createFormatter(
scaleDomain: any[],
dataDomain: any[],
dataType,
isScalar: boolean,
formatString: string,
bestTickCount: number,
tickValues: any[],
getValueFn: any,
useTickIntervalForDisplayUnits: boolean = false,
axisDisplayUnits?: number,
axisPrecision?: number): IValueFormatter {
let formatter: IValueFormatter;
if (dataType.dateTime) {
if (isScalar) {
let value = new Date(scaleDomain[0]);
let value2 = new Date(scaleDomain[1]);
// datetime with only one value needs to pass the same value
// (from the original dataDomain value, not the adjusted scaleDomain)
// so formatting works correctly.
if (bestTickCount === 1)
value = value2 = new Date(dataDomain[0]);
// this will ignore the formatString and create one based on the smallest non-zero portion of the values supplied.
formatter = valueFormatter.create({
format: formatString,
value: value,
value2: value2,
tickCount: bestTickCount,
});
}
else {
// Use the model formatString for ordinal datetime
formatter = valueFormatter.createDefaultFormatter(formatString, true);
}
}
else {
if (useTickIntervalForDisplayUnits && isScalar && tickValues.length > 1) {
let value1 = axisDisplayUnits ? axisDisplayUnits : tickValues[1] - tickValues[0];
let options: ValueFormatterOptions = {
format: formatString,
value: value1,
value2: 0, // force tickInterval or display unit to be used
allowFormatBeautification: true,
};
if (axisPrecision)
options.precision = axisPrecision;
else
options.precision = calculateAxisPrecision(tickValues[0], tickValues[1], axisDisplayUnits, formatString);
formatter = valueFormatter.create(options);
}
else {
// do not use display units, just the basic value formatter
// datetime is handled above, so we are ordinal and either boolean, numeric, or text.
formatter = valueFormatter.createDefaultFormatter(formatString, true);
}
}
return formatter;
}