All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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