All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.bower_components.globalize.src.number.pattern-properties.js Maven / Gradle / Ivy

define([
    "./pattern-re",
    "../common/create-error/unsupported-feature"
], function (numberPatternRe, createErrorUnsupportedFeature) {

    /**
     * format( number, pattern )
     *
     * @number [Number].
     *
     * @pattern [String] raw pattern for numbers.
     *
     * Return the formatted number.
     * ref: http://www.unicode.org/reports/tr35/tr35-numbers.html
     */
    return function (pattern) {
        var aux1, aux2, fractionPattern, integerFractionOrSignificantPattern, integerPattern,
            maximumFractionDigits, maximumSignificantDigits, minimumFractionDigits,
            minimumIntegerDigits, minimumSignificantDigits, padding, prefix, primaryGroupingSize,
            roundIncrement, scientificNotation, secondaryGroupingSize, significantPattern, suffix;

        pattern = pattern.match(numberPatternRe);
        if (!pattern) {
            throw new Error("Invalid pattern: " + pattern);
        }

        prefix = pattern[1];
        padding = pattern[4];
        integerFractionOrSignificantPattern = pattern[5];
        significantPattern = pattern[9];
        scientificNotation = pattern[10];
        suffix = pattern[11];

        // Significant digit format
        if (significantPattern) {
            significantPattern.replace(/(@+)(#*)/, function (match, minimumSignificantDigitsMatch, maximumSignificantDigitsMatch) {
                minimumSignificantDigits = minimumSignificantDigitsMatch.length;
                maximumSignificantDigits = minimumSignificantDigits +
                    maximumSignificantDigitsMatch.length;
            });

            // Integer and fractional format
        } else {
            fractionPattern = pattern[8];
            integerPattern = pattern[7];

            if (fractionPattern) {

                // Minimum fraction digits, and rounding.
                fractionPattern.replace(/[0-9]+/, function (match) {
                    minimumFractionDigits = match;
                });
                if (minimumFractionDigits) {
                    roundIncrement = +("0." + minimumFractionDigits);
                    minimumFractionDigits = minimumFractionDigits.length;
                } else {
                    minimumFractionDigits = 0;
                }

                // Maximum fraction digits
                // 1: ignore decimal character
                maximumFractionDigits = fractionPattern.length - 1 /* 1 */;
            }

            // Minimum integer digits
            integerPattern.replace(/0+$/, function (match) {
                minimumIntegerDigits = match.length;
            });
        }

        // Scientific notation
        if (scientificNotation) {
            throw createErrorUnsupportedFeature({
                feature: "scientific notation (not implemented)"
            });
        }

        // Padding
        if (padding) {
            throw createErrorUnsupportedFeature({
                feature: "padding (not implemented)"
            });
        }

        // Grouping
        if ((aux1 = integerFractionOrSignificantPattern.lastIndexOf(",")) !== -1) {

            // Primary grouping size is the interval between the last group separator and the end of
            // the integer (or the end of the significant pattern).
            aux2 = integerFractionOrSignificantPattern.split(".")[0];
            primaryGroupingSize = aux2.length - aux1 - 1;

            // Secondary grouping size is the interval between the last two group separators.
            if ((aux2 = integerFractionOrSignificantPattern.lastIndexOf(",", aux1 - 1)) !== -1) {
                secondaryGroupingSize = aux1 - 1 - aux2;
            }
        }

        // Return:
        //  0: @prefix String
        //  1: @padding Array [ ,  ] TODO
        //  2: @minimumIntegerDigits non-negative integer Number value indicating the minimum integer
        //        digits to be used. Numbers will be padded with leading zeroes if necessary.
        //  3: @minimumFractionDigits and
        //  4: @maximumFractionDigits are non-negative integer Number values indicating the minimum and
        //        maximum fraction digits to be used. Numbers will be rounded or padded with trailing
        //        zeroes if necessary.
        //  5: @minimumSignificantDigits and
        //  6: @maximumSignificantDigits are positive integer Number values indicating the minimum and
        //        maximum fraction digits to be shown. Either none or both of these properties are
        //        present; if they are, they override minimum and maximum integer and fraction digits
        //        – the formatter uses however many integer and fraction digits are required to display
        //        the specified number of significant digits.
        //  7: @roundIncrement Decimal round increment or null
        //  8: @primaryGroupingSize
        //  9: @secondaryGroupingSize
        // 10: @suffix String
        return [
            prefix,
            padding,
            minimumIntegerDigits,
            minimumFractionDigits,
            maximumFractionDigits,
            minimumSignificantDigits,
            maximumSignificantDigits,
            roundIncrement,
            primaryGroupingSize,
            secondaryGroupingSize,
            suffix
        ];
    };

});




© 2015 - 2025 Weber Informatics LLC | Privacy Policy