Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 69x 69x 69x 69x 69x 6x 6x 6x 6x 69x 69x 69x 18x 18x 69x 69x 37x 37x 69x 69x 14x 6x 6x 6x 6x 6x 14x 8x 8x 14x 9x 9x 9x 9x 14x 69x 69x 69x 69x 69x 5x 5x 5x 69x 2x 2x 69x 69x 69x 69x 69x 2x 2x 2x 2x 2x | /** * @license Apache-2.0 * * Copyright (c) 2022 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; // MODULES // var isNumber = require( './is_number.js' ); // NOTE: for the following, we explicitly avoid using stdlib packages in this particular package in order to avoid circular dependencies. var abs = Math.abs; // eslint-disable-line stdlib/no-builtin-math var lowercase = String.prototype.toLowerCase; var uppercase = String.prototype.toUpperCase; var replace = String.prototype.replace; // VARIABLES // var RE_EXP_POS_DIGITS = /e\+(\d)$/; var RE_EXP_NEG_DIGITS = /e-(\d)$/; var RE_ONLY_DIGITS = /^(\d+)$/; var RE_DIGITS_BEFORE_EXP = /^(\d+)e/; var RE_TRAILING_PERIOD_ZERO = /\.0$/; var RE_PERIOD_ZERO_EXP = /\.0*e/; var RE_ZERO_BEFORE_EXP = /(\..*[^0])0*e/; // MAIN // /** * Formats a token object argument as a floating-point number. * * @private * @param {Object} token - token object * @throws {Error} must provide a valid floating-point number * @returns {string} formatted token argument */ function formatDouble( token ) { var digits; var out; var f = parseFloat( token.arg ); if ( !isFinite( f ) ) { // NOTE: We use the global `isFinite` function here instead of `@stdlib/math/base/assert/is-finite` in order to avoid circular dependencies. if ( !isNumber( token.arg ) ) { throw new Error( 'invalid floating-point number. Value: ' + out ); } // Case: NaN, Infinity, or -Infinity f = token.arg; } switch ( token.specifier ) { case 'e': case 'E': out = f.toExponential( token.precision ); break; case 'f': case 'F': out = f.toFixed( token.precision ); break; case 'g': case 'G': if ( abs( f ) < 0.0001 ) { digits = token.precision; if ( digits > 0 ) { digits -= 1; } out = f.toExponential( digits ); } else { out = f.toPrecision( token.precision ); } if ( !token.alternate ) { out = replace.call( out, RE_ZERO_BEFORE_EXP, '$1e' ); out = replace.call( out, RE_PERIOD_ZERO_EXP, 'e' ); out = replace.call( out, RE_TRAILING_PERIOD_ZERO, '' ); } break; default: throw new Error( 'invalid double notation. Value: ' + token.specifier ); } out = replace.call( out, RE_EXP_POS_DIGITS, 'e+0$1' ); out = replace.call( out, RE_EXP_NEG_DIGITS, 'e-0$1' ); if ( token.alternate ) { out = replace.call( out, RE_ONLY_DIGITS, '$1.' ); out = replace.call( out, RE_DIGITS_BEFORE_EXP, '$1.e' ); } if ( f >= 0 && token.sign ) { out = token.sign + out; } out = ( token.specifier === uppercase.call( token.specifier ) ) ? uppercase.call( out ) : lowercase.call( out ); return out; } // EXPORTS // module.exports = formatDouble; |