package com.thaiopensource.datatype.xsd; import org.relaxng.datatype.ValidationContext; class DoubleDatatype extends DatatypeBase implements OrderRelation { boolean lexicallyAllows(String str) { if (str.equals("INF") || str.equals("-INF") || str.equals("NaN")) return true; int len = str.length(); boolean hadSign = false; boolean hadDecimalPoint = false; boolean hadDigit = false; boolean hadE = false; for (int i = 0; i < len; i++) { switch (str.charAt(i)) { case '+': case '-': if (hadDigit || hadDecimalPoint || hadSign) return false; hadSign = true; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': hadDigit = true; break; case 'e': case 'E': if (hadE || !hadDigit) return false; hadDigit = false; hadE = true; hadSign = false; hadDecimalPoint = false; break; case '.': if (hadDecimalPoint || hadE) return false; hadDecimalPoint = true; break; default: return false; } } return hadDigit; } String getLexicalSpaceKey() { return "float"; } Object getValue(String str, ValidationContext vc) { if (str.equals("INF")) return Double.POSITIVE_INFINITY; if (str.equals("-INF")) return Double.NEGATIVE_INFINITY; if (str.equals("NaN")) return Double.NaN; return new Double(str); } OrderRelation getOrderRelation() { return this; } public boolean isLessThan(Object obj1, Object obj2) { return (Double)obj1 < (Double)obj2; } public boolean sameValue(Object value1, Object value2) { double d1 = (Double)value1; double d2 = (Double)value2; // NaN = NaN return d1 == d2 || (d1 != d1 && d2 != d2); } }