// toExponential converts a number to a string, always formatting as an expoential. // This method takes an optional argument specifying a number of *decimal places* // to round the significand to (or, put another way, this method optionally rounds // to argument-plus-one significant figures). EncodedTiValue JSC_HOST_CALL numberProtoFuncToExponential(TiExcState* exec) { // Get x (the double value of this, which should be a Number). double x; if (!toThisNumber(exec->hostThisValue(), x)) return throwVMTypeError(exec); // Get the argument. int decimalPlacesInExponent; bool isUndefined; if (!getIntegerArgumentInRange(exec, 0, 20, decimalPlacesInExponent, isUndefined)) return throwVMError(exec, createRangeError(exec, "toExponential() argument must be between 0 and 20")); // Handle NaN and Infinity. if (isnan(x) || isinf(x)) return TiValue::encode(jsString(exec, UString::number(x))); // Round if the argument is not undefined, always format as exponential. NumberToStringBuffer buffer; unsigned length = isUndefined ? DecimalNumber(x).toStringExponential(buffer, WTI::NumberToStringBufferLength) : DecimalNumber(x, RoundingSignificantFigures, decimalPlacesInExponent + 1).toStringExponential(buffer, WTI::NumberToStringBufferLength); return TiValue::encode(jsString(exec, UString(buffer, length))); }
// 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. EncodedTiValue JSC_HOST_CALL numberProtoFuncToFixed(TiExcState* exec) { // Get x (the double value of this, which should be a Number). TiValue thisValue = exec->hostThisValue(); TiValue v = thisValue.getJSNumber(); if (!v) return throwVMTypeError(exec); double x = v.uncheckedGetNumber(); // 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, "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 TiValue::encode(jsString(exec, UString::number(x))); // The check above will return false for NaN or Infinity, these will be // handled by numberToString. ASSERT(!isnan(x) && !isinf(x)); // Convert to decimal with rounding, and format as decimal. NumberToStringBuffer buffer; unsigned length = DecimalNumber(x, RoundingDecimalPlaces, decimalPlaces).toStringDecimal(buffer, WTI::NumberToStringBufferLength); return TiValue::encode(jsString(exec, UString(buffer, length))); }
String Color::serialized() const { if (!hasAlpha()) { StringBuilder builder; builder.reserveCapacity(7); builder.append('#'); appendByteAsHex(red(), builder, Lowercase); appendByteAsHex(green(), builder, Lowercase); appendByteAsHex(blue(), builder, Lowercase); return builder.toString(); } Vector<LChar> result; result.reserveInitialCapacity(28); const char commaSpace[] = ", "; const char rgbaParen[] = "rgba("; result.append(rgbaParen, 5); appendNumber(result, red()); result.append(commaSpace, 2); appendNumber(result, green()); result.append(commaSpace, 2); appendNumber(result, blue()); result.append(commaSpace, 2); if (!alpha()) result.append('0'); else { NumberToLStringBuffer buffer; unsigned length = DecimalNumber(alpha() / 255.0).toStringDecimal(buffer, WTF::NumberToStringBufferLength); result.append(buffer, length); } result.append(')'); return String::adopt(result); }