/*
* 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: 07-Dec-2008
*/
package uk.me.parabola.mkgmap.osmstyle.actions;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import uk.me.parabola.mkgmap.osmstyle.eval.UnitConversions;
import uk.me.parabola.mkgmap.reader.osm.Element;
/**
* Convert a numeric quantity from one set of units to another.
*
* @author Steve Ratcliffe
*/
public class ConvertFilter extends ValueFilter {
private static final Pattern UNIT_RE = Pattern.compile("\\s*([\\d.]+)\\s*([\\w/]*)\\s*");
private final UnitConversions units;
public ConvertFilter(String arg) {
units = UnitConversions.createConversion(arg);
}
protected String doFilter(String value, Element el) {
if (value == null || !units.isValid())
return value;
String number = value;
Double factor = units.getDefaultFactor();
// If this is not a pure number, then extract the number part and the unit part
// and convert based on the found values. There are also various possible error
// cases.
if (!Character.isDigit(value.charAt(value.length() - 1))) {
// Extract number and unit string
Matcher matcher = UNIT_RE.matcher(value);
if (matcher.matches()) {
number = matcher.group(1);
String source = matcher.group(2);
factor = units.convertFactor(source);
if (factor == null)
return value;
} else {
return value;
}
}
try {
double d = Double.parseDouble(number);
return String.valueOf(Math.round(d * factor));
} catch (NumberFormatException e) {
// Turns out it wasn't a pure number, just return the value unchanged.
return value;
}
}
}