// toFixed converts a number to a string, always formatting as an a decimal fraction. // This method takes an argument specifying a number of decimal places to round the // significand to. However when converting large values (1e+21 and above) this // method will instead fallback to calling ToString. EncodedJSValue JSC_HOST_CALL numberProtoFuncToFixed(ExecState* exec) { double x; if (!toThisNumber(exec->thisValue(), x)) return throwVMTypeError(exec); // Get the argument. int decimalPlaces; bool isUndefined; // This is ignored; undefined treated as 0. if (!getIntegerArgumentInRange(exec, 0, 20, decimalPlaces, isUndefined)) return throwVMError(exec, createRangeError(exec, ASCIILiteral("toFixed() argument must be between 0 and 20"))); // 15.7.4.5.7 states "If x >= 10^21, then let m = ToString(x)" // This also covers Ininity, and structure the check so that NaN // values are also handled by numberToString if (!(fabs(x) < 1e+21)) return JSValue::encode(jsString(exec, String::numberToStringECMAScript(x))); // The check above will return false for NaN or Infinity, these will be // handled by numberToString. ASSERT(std::isfinite(x)); NumberToStringBuffer buffer; return JSValue::encode(jsString(exec, String(numberToFixedWidthString(x, decimalPlaces, buffer)))); }
String String::numberToStringFixedWidth(double number, unsigned decimalPlaces) { NumberToStringBuffer buffer; return String(numberToFixedWidthString(number, decimalPlaces, buffer)); }