in src/main/java/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java [384:494]
private String formatDecimal(String start, SchemaType sType) {
BigDecimal result = new BigDecimal(start);
XmlDecimal xmlD;
xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MIN_INCLUSIVE);
BigDecimal min = xmlD != null ? xmlD.getBigDecimalValue() : null;
xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MAX_INCLUSIVE);
BigDecimal max = xmlD != null ? xmlD.getBigDecimalValue() : null;
boolean minInclusive = true, maxInclusive = true;
xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MIN_EXCLUSIVE);
if (xmlD != null) {
BigDecimal minExcl = xmlD.getBigDecimalValue();
if (min == null || min.compareTo(minExcl) < 0) {
min = minExcl;
minInclusive = false;
}
}
xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_MAX_EXCLUSIVE);
if (xmlD != null) {
BigDecimal maxExcl = xmlD.getBigDecimalValue();
if (max == null || max.compareTo(maxExcl) > 0) {
max = maxExcl;
maxInclusive = false;
}
}
xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_TOTAL_DIGITS);
int totalDigits = -1;
if (xmlD != null) {
totalDigits = xmlD.getBigDecimalValue().intValue();
StringBuilder sb = new StringBuilder(totalDigits);
for (int i = 0; i < totalDigits; i++) {
sb.append('9');
}
BigDecimal digitsLimit = new BigDecimal(sb.toString());
if (max != null && max.compareTo(digitsLimit) > 0) {
max = digitsLimit;
maxInclusive = true;
}
digitsLimit = digitsLimit.negate();
if (min != null && min.compareTo(digitsLimit) < 0) {
min = digitsLimit;
minInclusive = true;
}
}
int sigMin = min == null ? 1 : result.compareTo(min);
int sigMax = max == null ? -1 : result.compareTo(max);
boolean minOk = sigMin > 0 || sigMin == 0 && minInclusive;
boolean maxOk = sigMax < 0 || sigMax == 0 && maxInclusive;
// Compute the minimum increment
xmlD = (XmlDecimal) sType.getFacet(SchemaType.FACET_FRACTION_DIGITS);
int fractionDigits = -1;
BigDecimal increment;
if (xmlD == null) {
increment = new BigDecimal(1);
} else {
fractionDigits = xmlD.getBigDecimalValue().intValue();
if (fractionDigits > 0) {
StringBuilder sb = new StringBuilder("0.");
for (int i = 1; i < fractionDigits; i++) {
sb.append('0');
}
sb.append('1');
increment = new BigDecimal(sb.toString());
} else {
increment = BigDecimal.ONE;
}
}
//noinspection StatementWithEmptyBody
if (minOk && maxOk) {
// OK
} else if (minOk && !maxOk) {
// TOO BIG
if (maxInclusive) {
result = max;
} else {
result = max.subtract(increment);
}
} else if (!minOk && maxOk) {
// TOO SMALL
if (minInclusive) {
result = min;
} else {
result = min.add(increment);
}
} else {
// MIN > MAX!!
}
// We have the number
// Adjust the scale according to the totalDigits and fractionDigits
int digits = 0;
BigDecimal ONE = new BigDecimal(BigInteger.ONE);
for (BigDecimal n = result; n.abs().compareTo(ONE) >= 0; digits++) {
n = n.movePointLeft(1);
}
if (fractionDigits > 0) {
if (totalDigits >= 0) {
result = result.setScale(Math.max(fractionDigits, totalDigits - digits));
} else {
result = result.setScale(fractionDigits);
}
} else if (fractionDigits == 0) {
result = result.setScale(0);
}
return result.toString();
}