package com.thaiopensource.datatype.xsd; import org.relaxng.datatype.DatatypeException; import java.math.BigDecimal; class PrecisionRestrictDatatype extends ValueRestrictDatatype { private final int precision; PrecisionRestrictDatatype(DatatypeBase base, int precision) { super(base); this.precision = precision; } void checkRestriction(Object obj) throws DatatypeException { final int actualPrecision = getPrecision((BigDecimal)obj); if (actualPrecision > precision) { String message; if (precision == 1) message = localizer().message("precision_1_violation", getDescriptionForRestriction(), actualPrecision); else message = localizer().message("precision_violation", new Object[] { getDescriptionForRestriction(), precision, actualPrecision }); throw new DatatypeException(message); } } static int getPrecision(BigDecimal n) { return n.movePointRight(n.scale()).abs().toString().length(); } }