double DigitList::getDouble() /*const*/ { double value; if (fCount == 0) { value = 0.0; } else { char* end = NULL; if (!gDecimal) { char rep[MAX_DIGITS]; // For machines that decide to change the decimal on you, // and try to be too smart with localization. // This normally should be just a '.'. sprintf(rep, "%+1.1f", 1.0); gDecimal = rep[2]; } *fDecimalDigits = gDecimal; *(fDigits+fCount) = 'e'; // add an e after the digits. formatBase10(fDecimalAt, fDigits + fCount + 1, // skip the 'e' MAX_DEC_DIGITS - fCount - 3); // skip the 'e' and '.' value = uprv_strtod(fDecimalDigits, &end); } return fIsPositive ? value : -value; }
/** * Set an int64, via decnumber */ void DigitList::set(int64_t source) { char str[MAX_DIGITS+2]; // Leave room for sign and trailing nul. formatBase10(source, str); U_ASSERT(uprv_strlen(str) < sizeof(str)); uprv_decNumberFromString(fDecNumber, str, &fContext); internalSetDouble(static_cast<double>(source)); }
// ------------------------------------- void DigitList::set(int64_t source) { char str[MAX_DIGITS+2]; // Leave room for sign and trailing nul. formatBase10(source, str); U_ASSERT(uprv_strlen(str) < sizeof(str)); uprv_decNumberFromString(fDecNumber, str, &fContext); fDouble = (double)source; fHaveDouble = TRUE; }
// ------------------------------------- void DigitList::set(int64_t source, int32_t maximumDigits) { fCount = fDecimalAt = formatBase10(source, fDecimalDigits, MAX_DIGITS); fIsPositive = (*fDecimalDigits == '+'); // Don't copy trailing zeros while (fCount > 1 && fDigits[fCount - 1] == kZero) --fCount; if(maximumDigits > 0) round(maximumDigits); }