in util/src/main/java/com/epam/deltix/util/text/DecimalFormatter.java [86:152]
private static String format (double number, int precision, int maxLength, long factor) {
if (precision < 0 || precision > MAX_PRECISION)
throw new IllegalArgumentException("Precision");
if (maxLength < 0 || maxLength > MAX_WIDTH)
throw new IllegalArgumentException("Length");
if (Double.isNaN(number)) // Infinity will be checked a bit later
throw new IllegalArgumentException("NaN");
boolean sign = false;
double factoredNumber = number;
if (number < 0) {
sign = true;
factoredNumber = Math.abs(number);
}
factoredNumber = factoredNumber*factor;
if (Double.isInfinite(factoredNumber) || factoredNumber > MAX)
return formatLargeNumber (number);
//long numberAsDecimal = Math.round(factoredNumber); // this call costs 8% of total time we spend in this method on avg.
long numberAsDecimal;
{
factoredNumber = factoredNumber * 10;
numberAsDecimal = (long) factoredNumber;
int smallestDigit = (int) (numberAsDecimal % 10);
numberAsDecimal = numberAsDecimal / 10;
if (smallestDigit >=5 )
numberAsDecimal ++; // round up;
}
if (numberAsDecimal == 0)
return "0";
char [] buffer = new char [MAX_WIDTH];
int i = MAX_WIDTH;
int fractional_part = precision;
boolean needLeadingZero = (fractional_part > 0);
while (numberAsDecimal > 0) {
int digit = (int) (numberAsDecimal % 10);
if (digit != 0 || i != MAX_WIDTH || fractional_part == 0) // skip trailing zeros
buffer [--i] = DIGITS [digit];
numberAsDecimal = numberAsDecimal / 10;
if (fractional_part > 0) {
fractional_part --;
if (fractional_part == 0) {
if (i != MAX_WIDTH)
buffer [--i] = '.';
needLeadingZero = (numberAsDecimal == 0);
}
}
}
if (needLeadingZero) {
if (fractional_part > 0) { // if number was less than zero
while (fractional_part-- > 0)
buffer [--i] = '0';
buffer [--i] = '.';
}
buffer [--i] = '0';
}
if (sign)
buffer [--i] = '-';
int len = Math.min(MAX_WIDTH - i, maxLength);
return new String (buffer, i, len);
}