QString RealFormat::doFormat(const Variant& val) const { QString result; const LongReal* vr = dynamic_cast<const LongReal*>((const VariantData*)val); if (!vr) return result; if (vr->isNaN()) return formatNaN(); if (vr->isZero()) return formatZero(); int usedigits = significandbase == base || precision == 0? getDigits() : (precision - 1) / _digitsz(base) + 1; RawFloatIO RawFloatIO = vr->convert(usedigits, mode, base); if (RawFloatIO.error != Success) return result; result = getSignificandPrefix(RawFloatIO) + formatInt(RawFloatIO) + formatFrac(RawFloatIO) + getSignificandSuffix(RawFloatIO); if (useScale(RawFloatIO)) result += getScalePrefix(RawFloatIO) + formatScale(RawFloatIO) + getScaleSuffix(RawFloatIO); return result; }
UnicodeString &DigitFormatter::format( const VisibleDigits &digits, const DigitGrouping &grouping, const DigitFormatterOptions &options, FieldPositionHandler &handler, UnicodeString &appendTo) const { if (digits.isNaN()) { return formatNaN(handler, appendTo); } if (digits.isInfinite()) { return formatInfinity(handler, appendTo); } const DigitInterval &interval = digits.getInterval(); int32_t digitsLeftOfDecimal = interval.getMostSignificantExclusive(); int32_t lastDigitPos = interval.getLeastSignificantInclusive(); int32_t intBegin = appendTo.length(); int32_t fracBegin; // Emit "0" instead of empty string. if (digitsLeftOfDecimal == 0 && lastDigitPos == 0) { appendTo.append(fLocalizedDigits[0]); handler.addAttribute(UNUM_INTEGER_FIELD, intBegin, appendTo.length()); if (options.fAlwaysShowDecimal) { appendField( UNUM_DECIMAL_SEPARATOR_FIELD, fDecimal, handler, appendTo); } return appendTo; } { UnicodeStringAppender appender(appendTo); for (int32_t i = interval.getMostSignificantExclusive() - 1; i >= interval.getLeastSignificantInclusive(); --i) { if (i == -1) { appender.flush(); appendField( UNUM_DECIMAL_SEPARATOR_FIELD, fDecimal, handler, appendTo); fracBegin = appendTo.length(); } appender.append(fLocalizedDigits[digits.getDigitByExponent(i)]); if (grouping.isSeparatorAt(digitsLeftOfDecimal, i)) { appender.flush(); appendField( UNUM_GROUPING_SEPARATOR_FIELD, fGroupingSeparator, handler, appendTo); } if (i == 0) { appender.flush(); if (digitsLeftOfDecimal > 0) { handler.addAttribute(UNUM_INTEGER_FIELD, intBegin, appendTo.length()); } } } if (options.fAlwaysShowDecimal && lastDigitPos == 0) { appender.flush(); appendField( UNUM_DECIMAL_SEPARATOR_FIELD, fDecimal, handler, appendTo); } } // lastDigitPos is never > 0 so we are guaranteed that kIntegerField // is already added. if (lastDigitPos < 0) { handler.addAttribute(UNUM_FRACTION_FIELD, fracBegin, appendTo.length()); } return appendTo; }