| 'use strict'; | 
| var $ = require('../internals/export'); | 
| var uncurryThis = require('../internals/function-uncurry-this'); | 
| var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); | 
| var thisNumberValue = require('../internals/this-number-value'); | 
| var $repeat = require('../internals/string-repeat'); | 
| var log10 = require('../internals/math-log10'); | 
| var fails = require('../internals/fails'); | 
|   | 
| var $RangeError = RangeError; | 
| var $String = String; | 
| var $isFinite = isFinite; | 
| var abs = Math.abs; | 
| var floor = Math.floor; | 
| var pow = Math.pow; | 
| var round = Math.round; | 
| var nativeToExponential = uncurryThis(1.0.toExponential); | 
| var repeat = uncurryThis($repeat); | 
| var stringSlice = uncurryThis(''.slice); | 
|   | 
| // Edge 17- | 
| var ROUNDS_PROPERLY = nativeToExponential(-6.9e-11, 4) === '-6.9000e-11' | 
|   // IE11- && Edge 14- | 
|   && nativeToExponential(1.255, 2) === '1.25e+0' | 
|   // FF86-, V8 ~ Chrome 49-50 | 
|   && nativeToExponential(12345, 3) === '1.235e+4' | 
|   // FF86-, V8 ~ Chrome 49-50 | 
|   && nativeToExponential(25, 0) === '3e+1'; | 
|   | 
| // IE8- | 
| var throwsOnInfinityFraction = function () { | 
|   return fails(function () { | 
|     nativeToExponential(1, Infinity); | 
|   }) && fails(function () { | 
|     nativeToExponential(1, -Infinity); | 
|   }); | 
| }; | 
|   | 
| // Safari <11 && FF <50 | 
| var properNonFiniteThisCheck = function () { | 
|   return !fails(function () { | 
|     nativeToExponential(Infinity, Infinity); | 
|     nativeToExponential(NaN, Infinity); | 
|   }); | 
| }; | 
|   | 
| var FORCED = !ROUNDS_PROPERLY || !throwsOnInfinityFraction() || !properNonFiniteThisCheck(); | 
|   | 
| // `Number.prototype.toExponential` method | 
| // https://tc39.es/ecma262/#sec-number.prototype.toexponential | 
| $({ target: 'Number', proto: true, forced: FORCED }, { | 
|   toExponential: function toExponential(fractionDigits) { | 
|     var x = thisNumberValue(this); | 
|     if (fractionDigits === undefined) return nativeToExponential(x); | 
|     var f = toIntegerOrInfinity(fractionDigits); | 
|     if (!$isFinite(x)) return String(x); | 
|     // TODO: ES2018 increased the maximum number of fraction digits to 100, need to improve the implementation | 
|     if (f < 0 || f > 20) throw new $RangeError('Incorrect fraction digits'); | 
|     if (ROUNDS_PROPERLY) return nativeToExponential(x, f); | 
|     var s = ''; | 
|     var m, e, c, d; | 
|     if (x < 0) { | 
|       s = '-'; | 
|       x = -x; | 
|     } | 
|     if (x === 0) { | 
|       e = 0; | 
|       m = repeat('0', f + 1); | 
|     } else { | 
|       // this block is based on https://gist.github.com/SheetJSDev/1100ad56b9f856c95299ed0e068eea08 | 
|       // TODO: improve accuracy with big fraction digits | 
|       var l = log10(x); | 
|       e = floor(l); | 
|       var w = pow(10, e - f); | 
|       var n = round(x / w); | 
|       if (2 * x >= (2 * n + 1) * w) { | 
|         n += 1; | 
|       } | 
|       if (n >= pow(10, f + 1)) { | 
|         n /= 10; | 
|         e += 1; | 
|       } | 
|       m = $String(n); | 
|     } | 
|     if (f !== 0) { | 
|       m = stringSlice(m, 0, 1) + '.' + stringSlice(m, 1); | 
|     } | 
|     if (e === 0) { | 
|       c = '+'; | 
|       d = '0'; | 
|     } else { | 
|       c = e > 0 ? '+' : '-'; | 
|       d = $String(abs(e)); | 
|     } | 
|     m += 'e' + c + d; | 
|     return s + m; | 
|   } | 
| }); |