Rev 3353 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* 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
;
}
}
}