![JAR search and dependency download from the Maven repository](/logo.png)
eu.unicore.uas.util.UnitParser Maven / Gradle / Ivy
The newest version!
package eu.unicore.uas.util;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* helper for working with common units and multipliers
*
* @author schuller
*/
public class UnitParser {
private static Pattern valueWithUnitsPattern=Pattern.compile("\\s*(\\d*[\\.\\,]?\\d*)\\s*(\\w*)\\s*");
private final String[][]units;
private final int[]conversionFactors;
private final NumberFormat outputFormat;
private final int decimalDigits;
/**
*
* @param units - unit names (with synonyms)
* @param conversionFactors - conversion factors
* @param decimalDigits - the number of decimal digits to use
*/
public UnitParser(String[][]units,int[]conversionFactors, int decimalDigits){
this.units=units;
this.conversionFactors=conversionFactors;
this.outputFormat=NumberFormat.getNumberInstance();
outputFormat.setMaximumFractionDigits(decimalDigits);
outputFormat.setMinimumFractionDigits(decimalDigits);
this.decimalDigits=decimalDigits;
}
public UnitParser(String[][]units,int[]conversionFactors){
this(units,conversionFactors,0);
}
/**
* convert a value with units to the value in default units
* @param valueWithUnits
* @return String representation (without units!)
*/
public String getStringValue(String valueWithUnits){
return outputFormat.format(getDoubleValue(valueWithUnits));
}
/**
* get the value (in default units)
* @param valueWithUnits
* @return double
*/
public double getDoubleValue(String valueWithUnits){
String u=getUnits(valueWithUnits);
int conversion=1;
if(u!=null){
conversion=getConversionFactor(u);
}
return Double.parseDouble(getNumber(valueWithUnits))*conversion;
}
/**
* return the "optimal" string representation of the given value
*
* @param d - the value to represent
* @param forceUnit - to always print the unit, even if the conversion factor is "1"
*/
public String getHumanReadable(double d, boolean forceUnit){
long factor=1;
String unit="";
double converted=d;
for(int c=0;c
*
* understands a number of date/time formats such as ISO8601, HH:mm, etc
*
* @param spec - the date specification
*/
public static synchronized Date extractDateTime(String spec){
Calendar result=null;
try{
Calendar d1 = Calendar.getInstance();
d1.setTime(getHHMMDate().parse(spec));
Calendar c=Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, d1.get(Calendar.HOUR_OF_DAY));
c.set(Calendar.MINUTE, d1.get(Calendar.MINUTE));
c.set(Calendar.SECOND, 0);
if(c.compareTo(Calendar.getInstance())<0){
//interpret time as "on the next day"
c.add(Calendar.DATE, 1);
}
result = c;
}catch(ParseException pe){}
if(result==null){
try{
Calendar c=Calendar.getInstance();
c.setTime(getSimpleDateFormat().parse(spec));
c.set(Calendar.SECOND, 0);
result = c;
}catch(ParseException pe){}
}
if(result==null){
try{
Calendar c = Calendar.getInstance();
c.setTime(getISO8601().parse(spec));
result = c;
}catch(ParseException pe){}
}
if(result!=null)return result.getTime();
else throw new IllegalArgumentException("Specified date string '"+spec+"'could not be parsed!");
}
public static String convertDateToISO8601(String dateSpec){
return getISO8601().format(extractDateTime(dateSpec));
}
private static DateFormat hhmmDate;
/**
* get the static DateFormat instance for the "HH:mm" format
* Not threadsafe!
*/
public static DateFormat getHHMMDate(){
if(hhmmDate==null){
hhmmDate=new SimpleDateFormat("HH:mm");
}
return hhmmDate;
}
private static DateFormat iso8601;
/**
* gets the static DateFormat instance for the ISO8601 "yyyy-MM-dd'T'HH:mm:ssZ" format
* Not threadsafe!
*/
public static DateFormat getISO8601(){
if(iso8601==null){
iso8601=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
}
return iso8601;
}
private static DateFormat simple;
/**
* get the static DateFormat instance for the "yyyy-MM-dd HH:mm" format
* Not threadsafe!
*/
public static DateFormat getSimpleDateFormat(){
if(simple==null){
simple=new SimpleDateFormat("yyyy-MM-dd HH:mm");
}
return simple;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy