package de.saring.util.unitcalc;
import java.text.NumberFormat;
/**
* This class contains methods for converting data in different formats to
* Strings.
*
* @author Stefan Saring, Jacob Ilsoe Christensen (parts of C# version)
* @version 1.0
*/
public class FormatUtils {
/**
* This is the list of possible unit systems. Metric units are e.g.
* kilometers for distance or celcius for temperature. English units are
* e.g. miles for distance and fahrenheit for temperature.
*/
public enum UnitSystem {
Metric, English
}
/**
* This is the list of possible speed unit views. Distance per hour (e.g.
* km/h) is mostly used for all kind of sports, but minutes per distance
* (e.g. m/km) is very common for runners.
*/
public enum SpeedView {
DistancePerHour, MinutesPerDistance
}
/**
* The current unit system used by the formater.
*/
private final UnitSystem unitSystem;
/**
* The current speed view used by the formater.
*/
private final SpeedView speedView;
/**
* The number format instance.
*/
private final NumberFormat numberFormat;
/**
* Creates a new FormatUtils instance for the specified unit system.
*
* @param unitSystem the unit system to be used
* @param speedView the speed view to be used
*/
public FormatUtils(UnitSystem unitSystem, SpeedView speedView) {
this.unitSystem = unitSystem;
this.speedView = speedView;
this.numberFormat = NumberFormat.getInstance();
}
/**
* Returns the current unit system.
*
* @return the current unit system
*/
public UnitSystem getUnitSystem() {
return unitSystem;
}
/**
* Returns the current speed view.
*
* @return the current speed view
*/
public SpeedView getSpeedView() {
return speedView;
}
/**
* Returns the String representation of the current distance unit.
*
* @return the current distance unit name
*/
public String getDistanceUnitName() {
switch (this.unitSystem) {
case English:
return "m";
case Metric:
default:
return "km";
}
}
/**
* Returns the String representation of the current speed unit.
*
* @return the current speed unit name
*/
public String getSpeedUnitName() {
switch (this.unitSystem) {
case English:
switch (this.speedView) {
case MinutesPerDistance:
return "min/m";
case DistancePerHour:
default:
return "mph";
}
case Metric:
default:
switch (this.speedView) {
case MinutesPerDistance:
return "min/km";
case DistancePerHour:
default:
return "km/h";
}
}
}
/**
* Returns the String representation of the current temperature unit.
*
* @return the current temperature unit name
*/
public String getTemperatureUnitName() {
switch (this.unitSystem) {
case English:
return "F";
case Metric:
default:
return "C";
}
}
/**
* Returns the String representation of the current altitude unit.
*
* @return the current temperature unit name
*/
public String getAltitudeUnitName() {
switch (this.unitSystem) {
case English:
return "ft";
case Metric:
default:
return "m";
}
}
/**
* Returns the String representation of the current weight unit.
*
* @return the current temperature unit name
*/
public String getWeightUnitName() {
switch (this.unitSystem) {
case English:
return "lbs";
case Metric:
default:
return "kg";
}
}
/**
* Converts the specified minutes value to a time String (hh:mm).
*
* @param minutes minutes to convert
* @return the created time String
*/
public String minutes2TimeString(int minutes) {
int hourPart = minutes / 60;
int minutePart = minutes % 60;
StringBuilder sBuilder = new StringBuilder();
if (hourPart < 10) {
sBuilder.append("0");
}
sBuilder.append(hourPart);
sBuilder.append(":");
if (minutePart < 10) {
sBuilder.append("0");
}
sBuilder.append(minutePart);
return sBuilder.toString();
}
/**
* Converts the specified seconds value to a time String (hh:mm:ss).
*
* @param seconds seconds to convert
* @return the created time String
*/
public String seconds2TimeString(int seconds) {
int secondPart = seconds % 60;
StringBuilder sBuilder = new StringBuilder();
sBuilder.append(minutes2TimeString(seconds / 60));
sBuilder.append(":");
if (secondPart < 10) {
sBuilder.append("0");
}
sBuilder.append(secondPart);
return sBuilder.toString();
}
/**
* Converts the specified seconds value to a time String (mm:ss).
*
* @param seconds seconds to convert
* @return the created time String
*/
public String seconds2MinuteTimeString(int seconds) {
int secondPart = seconds % 60;
int minutePart = seconds / 60;
StringBuilder stringBuilder = new StringBuilder();
if (minutePart < 10) {
stringBuilder.append("0");
}
stringBuilder.append(minutePart);
stringBuilder.append(":");
if (secondPart < 10) {
stringBuilder.append("0");
}
stringBuilder.append(secondPart);
return stringBuilder.toString();
}
/**
* Converts the specified 1/10 seconds value to a time String (hh:mm:ss.t).
*
* @param tenthSeconds 1/10 seconds to convert
* @return the created time String
*/
public String tenthSeconds2TimeString(int tenthSeconds) {
int tenthSecondPart = tenthSeconds % 10;
StringBuilder sBuilder = new StringBuilder();
sBuilder.append(seconds2TimeString(tenthSeconds / 10));
sBuilder.append(".");
sBuilder.append(tenthSecondPart);
return sBuilder.toString();
}
/**
* Converts the specified time String to number of total seconds. The String
* has the format "h:m:s". The hour and minute parts of the Strings are
* optional. The minute and second parts must be in range from 0 to 59. The
* hour value can be greater. On conversion errors -1 will be returned.
*
* @param time the time String to convert
* @return the number of seconds represented by the time String or -1 on
* errors
*/
public int timeString2TotalSeconds(String time) {
if ((time == null) || (time.length() == 0)) {
return -1;
}
// split time String to hour, minute and second parts
String[] timeSplitted = time.split(":");
if ((timeSplitted.length == 0) || (timeSplitted.length > 3)) {
return -1;
}
// get int values of hours, minutes and seconds parts
int hours = 0, minutes = 0, seconds = 0;
try {
seconds = Integer.parseInt(timeSplitted[timeSplitted.length - 1]);
if (timeSplitted.length >= 2) {
minutes = Integer.parseInt(timeSplitted[timeSplitted.length - 2]);
}
if (timeSplitted.length >= 3) {
hours = Integer.parseInt(timeSplitted[timeSplitted.length - 3]);
}
} catch (Exception e) {
return -1;
}
// check range of hours, minutes and seconds parts
if ((seconds < 0) || (seconds > 59)
|| (minutes < 0) || (minutes > 59)
|| (hours < 0)) {
return -1;
}
// calculate total second
return (hours * 60 * 60) + (minutes * 60) + seconds;
}
/**
* Converts the heart rate to a String.
*
* @param heartRate heart rate in beats per minute
* @return a String representation of the heart rate
*/
public String heartRateToString(int heartRate) {
numberFormat.setMaximumFractionDigits(0);
return numberFormat.format(heartRate) + " bpm";
}
/**
* Converts the temperature to a String in the correct unit depending on
* what unit options are currently chosen.
*
* @param temperature temperature in Celsius
* @return a String representation of the temperature
*/
public String temperatureToString(short temperature) {
numberFormat.setMaximumFractionDigits(0);
switch (this.unitSystem) {
case English:
return numberFormat.format(ConvertUtils.convertCelsius2Fahrenheit(
temperature)) + " " + getTemperatureUnitName();
case Metric:
default:
return numberFormat.format(temperature) + " " + getTemperatureUnitName();
}
}
/**
* Converts the distance to a String in the correct unit depending on what
* unit options are currently chosen. The unit name is not included in the
* String.
*
* @param distance distance in km
* @param decimals the number of decimals (fraction digits) to show
* @return a String representation of the distance
*/
public String distanceToStringWithoutUnitName(double distance, int decimals) {
numberFormat.setMaximumFractionDigits(decimals);
switch (this.unitSystem) {
case English:
return numberFormat.format(ConvertUtils.convertKilometer2Miles(distance, false));
case Metric:
default:
return numberFormat.format(distance);
}
}
/**
* Converts the distance to a String in the correct unit depending on what
* unit options are currently chosen.
*
* @param distance distance in km
* @param decimals the number of decimals (fraction digits) to show
* @return a String representation of the distance
*/
public String distanceToString(double distance, int decimals) {
return distanceToStringWithoutUnitName(distance, decimals) + " " + getDistanceUnitName();
}
/**
* Converts the speed to a String in the correct unit depending on what unit
* options and speed view are currently chosen. The unit name is not
* included in the String.
*
* @param speed speed in km/h
* @param decimals the number of decimals (fraction digits) to show
* @return a String representation of the speed
*/
public String speedToStringWithoutUnitName(float speed, int decimals) {
numberFormat.setMaximumFractionDigits(decimals);
switch (this.unitSystem) {
case English:
switch (this.speedView) {
case MinutesPerDistance:
if (speed == 0) {
return "N/A";
}
return seconds2MinuteTimeString((int) (3600 / ConvertUtils.convertKilometer2Miles(speed, false)));
case DistancePerHour:
default:
return numberFormat.format(ConvertUtils.convertKilometer2Miles(speed, false));
}
case Metric:
default:
switch (this.speedView) {
case MinutesPerDistance:
if (speed == 0) {
return "N/A";
}
return seconds2MinuteTimeString((int) (3600 / speed));
case DistancePerHour:
default:
return numberFormat.format(speed);
}
}
}
/**
* Converts the speed to a String in the correct unit depending on what unit
* options and speed view are currently chosen.
*
* @param speed speed in km/h
* @param decimals the number of decimals (fraction digits) to show
* @return a String representation of the speed
*/
public String speedToString(float speed, int decimals) {
if (speed == 0) {
return speedToStringWithoutUnitName(speed, decimals);
} else {
return speedToStringWithoutUnitName(speed, decimals) + " " + getSpeedUnitName();
}
}
/**
* Converts the height to a String in the correct unit depending on what
* unit options are currently chosen. The unit name is not included in the
* String.
*
* @param height height in meters
* @return a string representation of the height
*/
public String heightToStringWithoutUnitName(int height) {
numberFormat.setMaximumFractionDigits(0);
switch (this.unitSystem) {
case English:
return numberFormat.format(ConvertUtils.convertMeter2Feet(height));
case Metric:
default:
return numberFormat.format(height);
}
}
/**
* Converts the height to a String in the correct unit depending on what
* unit options are currently chosen.
*
* @param height height in meters
* @return a string representation of the height
*/
public String heightToString(int height) {
return heightToStringWithoutUnitName(height) + " " + getAltitudeUnitName();
}
/**
* Converts the cadence to a String.
*
* @param cadence cadence in rounds per minute
* @return a String representation of the cadence incl. unit name
*/
public String cadenceToString(int cadence) {
numberFormat.setMaximumFractionDigits(0);
return numberFormat.format(cadence) + " rpm";
}
/**
* Converts the calorie consumption value to a String.
*
* @param calories the calorie consumption
* @return a String representation of the calorie consumption incl. unit
* name
*/
public String caloriesToString(int calories) {
numberFormat.setMaximumFractionDigits(0);
return numberFormat.format(calories) + " kCal";
}
/**
* Converts the weight to a String in the correct unit depending on what
* unit options are currently chosen. The unit name is not included in the
* String.
*
* @param weight weight in kilograms
* @param maxFractionDigits maximum fraction digits to be shown in the
* String
* @return a string representation of the weight
*/
public String weightToStringWithoutUnitName(float weight, int maxFractionDigits) {
numberFormat.setMaximumFractionDigits(maxFractionDigits);
switch (this.unitSystem) {
case English:
return numberFormat.format(ConvertUtils.convertKilogram2Lbs(weight));
case Metric:
default:
return numberFormat.format(weight);
}
}
/**
* Converts the weight to a String in the correct unit depending on what
* unit options are currently chosen. The String contains the unit name.
*
* @param weight weight in kilograms
* @param maxFractionDigits maximum fraction digits to be shown in the
* String
* @return a string representation of the weight
*/
public String weightToString(float weight, int maxFractionDigits) {
return weightToStringWithoutUnitName(weight, maxFractionDigits) + " " + getWeightUnitName();
}
}