package com.thaiopensource.datatype.xsd;
import org.relaxng.datatype.ValidationContext;
import java.math.BigDecimal;
class DecimalDatatype extends DatatypeBase implements OrderRelation {
boolean lexicallyAllows(String str) {
int len = str.length();
if (len == 0)
return false;
int i = 0;
switch (str.charAt(i)) {
case '+':
case '-':
if (++i == len)
return false;
}
boolean hadDecimalPoint = false;
if (str.charAt(i) == '.') {
hadDecimalPoint = true;
if (++i == len)
return false;
}
do {
switch (str.charAt(i)) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
case '.':
if (hadDecimalPoint)
return false;
hadDecimalPoint = true;
break;
default:
return false;
}
} while (++i < len);
return true;
}
String getLexicalSpaceKey() {
return "decimal";
}
Object getValue(String str, ValidationContext vc) {
if (str.charAt(0) == '+')
str = str.substring(1); // JDK 1.1 doesn't handle leading +
return new BigDecimal(str);
}
OrderRelation getOrderRelation() {
return this;
}
public boolean isLessThan(Object obj1, Object obj2) {
return ((BigDecimal)obj1).compareTo((BigDecimal)obj2) < 0;
}
/**
* BigDecimal.equals considers objects distinct if they have the
* different scales but the same mathematical value. Similarly
* for hashCode.
*/
public boolean sameValue(Object value1, Object value2) {
return ((BigDecimal)value1).compareTo((BigDecimal)value2) == 0;
}
public int valueHashCode(Object value) {
return ((BigDecimal)value).toBigInteger().hashCode();
}
}