/*
* Copyright (C) 2008 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* Author: Steve Ratcliffe
* Create date: 09-Nov-2008
*/
package uk.me.parabola.mkgmap.osmstyle.eval;
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Represents a number and the units it is in. We want ultimately to be
* able to do things like: is 10km/h > 8mph, and get the right answer
* by converting to a common unit.
*
* To start with we will just compare the numbers.
*
* @author Steve Ratcliffe
*/
public class ValueWithUnit implements Comparable<ValueWithUnit> {
private static final Pattern EXTRACT_NUMBER_UNIT
= Pattern.compile("[ \t]*(-?[0-9.]+)[ \t]*(.*)");
private static final BigDecimal ZERO = new BigDecimal(0);
private final BigDecimal value;
private final String unit;
private final boolean valid;
public ValueWithUnit(String val) {
Matcher m = EXTRACT_NUMBER_UNIT.matcher(val);
boolean found = m.find();
BigDecimal value = ZERO;
String unit = "";
boolean ok = false;
if (found) {
try {
value = new BigDecimal(m.group(1));
unit = m.group(2).trim();
ok = true;
} catch (NumberFormatException e) {
ok = false;
}
}
this.value = value;
this.unit = unit;
this.valid = ok;
}
/**
* Compares this object with the specified object for order. Returns
* a negative integer, zero, or a positive integer as this object
* is less than, equal to, or greater than the specified object.
*
* To start with, just compare the value and ignore the unit.
*/
public int compareTo(ValueWithUnit o) {
return value.compareTo(o.value);
}
public boolean isValid() {
return valid;
}
public String toString() {
return value + unit;
}
}