package org.orbeon.oxf.processor.sql.interpreters;
public class Util {
/**
* Convert a double into a String without scientific notation.
*
* This is useful for XPath 1.0, which does not understand the scientific notation.
*/
static String removeScientificNotation(double value) {
String result = Double.toString(value);
int eIndex = result.indexOf('E');
if (eIndex == -1) {
// No scientific notation, return value as is
return stripZeros(result);
} else {
// Scientific notation, convert value
// Parse string representation
String mantissa = result.substring(0, eIndex);
boolean negative = mantissa.charAt(0) == '-';
String sign = negative ? "-" : "";
String mantissa1 = mantissa.substring(negative ? 1 : 0, negative ? 2 : 1);
String mantissa2 = mantissa.substring(negative ? 3 : 2);
int exponent = Integer.parseInt(result.substring(eIndex + 1));
// Calculate result
if (exponent > 0) {
// Positive exponent, shift decimal point to the right
int mantissa2Length = mantissa2.length();
if (exponent > mantissa2Length) {
result = sign + mantissa1 + mantissa2 + nZeros(exponent - mantissa2Length);
} else if (exponent == mantissa2Length) {
result = sign + mantissa1 + mantissa2;
} else {
result = sign + mantissa1 + mantissa2.substring(0, exponent) + '.' + mantissa2.substring(exponent);
}
} else if (exponent == 0) {
// Not sure if this can happen
result = mantissa;
} else {
// Negative exponent, shift decimal point to the left
result = sign + '0' + '.' + nZeros(-exponent - 1) + mantissa1 + mantissa2;
}
return stripZeros(result);
}
}
/**
* Remove unnecessary zeros after the decimal point, e.g. "12.000" becomes "12".
*/
private static String stripZeros(String s) {
int index = s.lastIndexOf('.');
if (index == -1) return s;
for (int i = index + 1; i < s.length(); i++) {
char c = s.charAt(i);
if (c != '0')
return s;
}
return s.substring(0, index);
}
private static String nZeros(int n) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++)
sb.append('0');
return sb.toString();
}
}