export function create()

in src/valueFormatter.ts [316:401]


export function create(options: ValueFormatterOptions): IValueFormatter {
    const format: string = !!options.allowFormatBeautification
        ? localizationOptions.beautify(options.format)
        : options.format;

    const { cultureSelector } = options;

    if (shouldUseNumericDisplayUnits(options)) {
        let displayUnitSystem = createDisplayUnitSystem(options.displayUnitSystemType);

        let singleValueFormattingMode = !!options.formatSingleValues;

        displayUnitSystem.update(Math.max(Math.abs(options.value || 0), Math.abs(options.value2 || 0)));

        let forcePrecision = options.precision != null;

        let decimals: number;

        if (forcePrecision)
            decimals = -options.precision;
        else if (displayUnitSystem.displayUnit && displayUnitSystem.displayUnit.value > 1)
            decimals = -MaxScaledDecimalPlaces;

        return {
            format: (value: any): string => {
                let formattedValue: string = getStringFormat(value, true /*nullsAreBlank*/);
                if (!StringExtensions.isNullOrUndefinedOrWhiteSpaceString(formattedValue)) {
                    return formattedValue;
                }

                // Round to Double.DEFAULT_PRECISION
                if (value
                    && !displayUnitSystem.isScalingUnit()
                    && Math.abs(value) < MaxValueForDisplayUnitRounding
                    && !forcePrecision) {

                    value = Double.roundToPrecision(value);
                }

                if (singleValueFormattingMode) {
                    return displayUnitSystem.formatSingleValue(
                        value,
                        format,
                        decimals,
                        forcePrecision,
                        cultureSelector);
                } else {
                    return displayUnitSystem.format(
                        value,
                        format,
                        decimals,
                        forcePrecision,
                        cultureSelector);
                }
            },
            displayUnit: displayUnitSystem.displayUnit,
            options: options
        };
    }

    if (shouldUseDateUnits(options.value, options.value2, options.tickCount)) {
        const unit: DateTimeUnit = DateTimeSequence.GET_INTERVAL_UNIT(
            options.value /* minDate */,
            options.value2 /* maxDate */,
            options.tickCount);

        return {
            format: (value: any): string => {
                if (value == null) {
                    return localizationOptions.nullValue;
                }

                let formatString: string = formattingService.dateFormatString(unit);

                return formatCore({
                    value,
                    cultureSelector,
                    format: formatString,
                });
            },
            options: options
        };
    }

    return createDefaultFormatter(format, false, cultureSelector);
}