package com.basgeekball.awesomevalidation.model; import android.support.annotation.Nullable; import com.google.common.collect.Range; import java.math.BigDecimal; import java.util.regex.Pattern; public class NumericRange { private Range mRange; public NumericRange(Range range) { mRange = range; } private static boolean isNumberFormat(String text) { return Pattern.compile("^-?(([1-9]\\d*(\\.\\d+)?)||(0\\.\\d+)||0)$").matcher(text).find(); } public boolean isValid(String valueText) { if (!isNumberFormat(valueText)) return false; BigDecimal value; try { value = new BigDecimal(valueText); } catch (Exception e) { return false; } Boolean validityAsInteger = isInteger(value); if (validityAsInteger != null) return validityAsInteger; Boolean validityAsDecimal = isDecimal(value); if (validityAsDecimal != null) return validityAsDecimal; return false; } @Nullable private Boolean isInteger(BigDecimal value) { if (value.scale() == 0) { try { return mRange.contains(value.intValueExact()); } catch (Exception e) { } try { return mRange.contains(value.longValueExact()); } catch (Exception e) { } } return null; } @Nullable private Boolean isDecimal(BigDecimal value) { try { return mRange.contains(value.floatValue()); } catch (Exception e) { } try { return mRange.contains(value.doubleValue()); } catch (Exception e) { } return null; } }