/* * This file is part of WhereYouGo. * * WhereYouGo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * WhereYouGo 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. * * You should have received a copy of the GNU General Public License * along with WhereYouGo. If not, see <http://www.gnu.org/licenses/>. * * Copyright (C) 2012 Menion <whereyougo@asamm.cz> */ package menion.android.whereyougo.utils; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Date; import java.util.Locale; import menion.android.whereyougo.settings.SettingValues; import menion.android.whereyougo.settings.Settings; public class UtilsFormat { private static final String TAG = "UtilsFormat"; // degree sign public static String degree = "�"; // angle mi value private static double angleInMi = (2 * Math.PI * 1000.0 / 360.0); /** * Format distance in metres. * @param dist Distance in metres. * @return Formated distance in appropriate units. */ public static String formatAltitude(double altitude, boolean addUnits) { double value = formatAltitudeValue(altitude); String res = formatDouble(value, 0); if (addUnits) return res + formatAltitudeUnits(); else return res; } public static double formatAltitudeValue(double altitude) { if (SettingValues.FORMAT_ALTITUDE == Settings.VALUE_UNITS_ALTITUDE_FEET) { return altitude * 3.2808; } else { return altitude; } } public static String formatAltitudeUnits() { if (SettingValues.FORMAT_ALTITUDE == Settings.VALUE_UNITS_ALTITUDE_FEET) { return "ft"; } else { return "m"; } } public static final double MILE_METERS = 1609.344; /** * Format distance in metres. * @param dist Distance in metres. * @return Formated distance in appropriate units. */ public static String formatDistance(double dist, boolean withoutUnits) { String value = null; if (SettingValues.FORMAT_LENGTH == Settings.VALUE_UNITS_LENGTH_IM) { double feet = dist * 3.2808; if (feet > 1000.0) { double mi = dist / 1609.344; if (mi > 100) { value = formatDouble(mi, 0); } else if (mi > 1) { value = formatDouble(mi, 1); } else { value = formatDouble(mi, 2); } } else { if (feet < 10) value = formatDouble(feet, 1); // to ft else value = formatDouble(feet, 0); // to ft } } else if (SettingValues.FORMAT_LENGTH == Settings.VALUE_UNITS_LENGTH_NA) { if (dist > 1852.0) { double nmi = dist / 1852.0; if (nmi > 100) { value = formatDouble(nmi, 0); } else { value = formatDouble(nmi, 1); } } else { value = formatDouble(dist, 0); } } else { // metric if (dist > 1000.0) { double km = dist / 1000.0; if (km > 100) { value = formatDouble(km, 0); } else { value = formatDouble(km, 1); } } else { if (dist < 10) value = formatDouble(dist, 1); else value = formatDouble(dist, 0); } } if (withoutUnits) return value; else return value + formatDistanceUnits(dist); } public static double formatDistanceValue(double dist) { if (SettingValues.FORMAT_LENGTH == Settings.VALUE_UNITS_LENGTH_IM) { double feet = dist * 3.2808; if (feet > 1000.0) { return dist / 1609.344; } else { return feet; } } else if (SettingValues.FORMAT_LENGTH == Settings.VALUE_UNITS_LENGTH_NA) { if (dist > 1852.0) { return dist / 1852.0; } else { return dist; } } else { // metric if (dist > 1000.0) { return dist / 1000.0; } else { return dist; } } } public static String formatDistanceUnits(double dist) { if (SettingValues.FORMAT_LENGTH == Settings.VALUE_UNITS_LENGTH_IM) { double feet = dist * 3.2808; if (feet > 1000.0) { return "mi"; } else { return "ft"; } } else if (SettingValues.FORMAT_LENGTH == Settings.VALUE_UNITS_LENGTH_NA) { if (dist > 1852.0) { return "nmi"; } else { return "m"; } } else { // metric if (dist > 1000.0) { return "km"; } else { return "m"; } } } /** * Format speed to correct format. * @param Speed Speed in m/s. * @return Formated speed in appropriate units. */ public static String formatSpeed(double speed, boolean withoutUnits) { speed = formatSpeedValue(speed); String result = formatDouble(speed, speed > 100 ? 0 : 1); if (withoutUnits) return result; else return result + getSpeedUnits(); } public static double formatSpeedValue(double speed) { if (SettingValues.FORMAT_SPEED == Settings.VALUE_UNITS_SPEED_MILH) { speed *= 2.237; } else if (SettingValues.FORMAT_SPEED == Settings.VALUE_UNITS_SPEED_KNOTS) { speed *= (3.6 / 1.852); } else { // metric UNITS_LENGTH_METRIC speed *= 3.6; } return speed; } public static String getSpeedUnits() { if (SettingValues.FORMAT_SPEED == Settings.VALUE_UNITS_SPEED_MILH) { return "mi/h"; } else if (SettingValues.FORMAT_SPEED == Settings.VALUE_UNITS_SPEED_KNOTS) { return "nmi/h"; } else { // metric UNITS_LENGTH_METRIC return "km/h"; } } public static String formatAngle(double angle) { try { // fix angle values if (angle < 0) angle += 360.0; if (angle > 360.0) angle -= 360.0f; if (SettingValues.FORMAT_ANGLE == Settings.VALUE_UNITS_ANGLE_DEGREE) { return formatDouble(angle, 0) + degree; } else if (SettingValues.FORMAT_ANGLE == Settings.VALUE_UNITS_ANGLE_MIL) { return formatDouble(angle * angleInMi, 0); } } catch (Exception e) { Logger.e(TAG, "formatAngle(" + angle + ")", e); } return ""; } public static String formatLatitude(double latitude) { StringBuffer out = new StringBuffer(); if (latitude < 0) { out.append("S "); } else { out.append("N "); } latitude = Math.abs(latitude); formatCooLatLon(out, latitude, 2); return out.toString(); } public static String formatLongitude(double longitude) { StringBuffer out = new StringBuffer(); if (longitude < 0) { out.append("W "); } else { out.append("E "); } longitude = Math.abs(longitude); formatCooLatLon(out, longitude, 3); return out.toString(); } public static String formatCooByType(double lat, double lon, boolean twoLines) { StringBuffer out = new StringBuffer(); out.append(formatLatitude(lat)); out.append(twoLines ? "<br />" : " | "); out.append(formatLongitude(lon)); return out.toString(); } private static void formatCooLatLon(StringBuffer out, double value, int minLen) { try { if (SettingValues.FORMAT_COO_LATLON == Settings.VALUE_UNITS_COO_LATLON_DEC) { out.append(formatDouble(value, Const.PRECISION, minLen)).append(degree); } else if (SettingValues.FORMAT_COO_LATLON == Settings.VALUE_UNITS_COO_LATLON_MIN) { double deg = Math.floor(value); double min = (value - deg) * 60; out.append(formatDouble(deg, 0, 2)).append(degree).append(formatDouble(min, Const.PRECISION - 2, 2)).append("'"); } else if (SettingValues.FORMAT_COO_LATLON == Settings.VALUE_UNITS_COO_LATLON_SEC) { double deg = Math.floor(value); double min = Math.floor((value - deg) * 60.0); double sec = (value - deg - min / 60.0) * 3600.0; out.append(formatDouble(deg, 0, 2)).append(degree).append(formatDouble(min, 0, 2)). append("'").append(formatDouble(sec, Const.PRECISION - 2)).append("''"); } } catch (Exception e) { Logger.e(TAG, "formatCoordinates(" + out.toString() + ", " + value + ", " + minLen + "), e:" + e.toString()); } } /** updated function for time formating as in stop watch */ public static String formatTime(boolean full, long tripTime) { return formatTime(full, tripTime, true); } /** updated function for time formating as in stop watch */ public static String formatTime(boolean full, long tripTime, boolean withUnits) { long hours = tripTime / 3600000; long mins = (tripTime - (hours * 3600000)) / 60000; double sec = (tripTime - (hours * 3600000) - mins * 60000) / 1000.0; if (full) { if (withUnits) { return hours + "h:" + formatDouble(mins, 0, 2) + "m:" + formatDouble(sec, 0, 2) + "s"; } else { return formatDouble(hours, 0, 2) + ":" + formatDouble(mins, 0, 2) + ":" + formatDouble(sec, 0, 2); } } else { if (hours == 0) { if (mins == 0) { if (withUnits) return formatDouble(sec, 0) + "s"; else return formatDouble(sec, 0, 2); } else { if (withUnits) return mins + "m:" + formatDouble(sec, 0) + "s"; else return formatDouble(mins, 0, 2) + ":" + formatDouble(sec, 0, 2); } } else { if (withUnits) { return hours + "h:" + mins + "m"; } else { return formatDouble(hours, 0, 2) + ":" + formatDouble(mins, 0, 2) + ":" + formatDouble(sec, 0, 2); } } } } private static Date mDate; public static String formatDate(long time) { if (mDate == null) mDate = new Date(); mDate.setTime(time); return mDate.getHours() + ":" + formatDouble(mDate.getMinutes(), 0, 2) + ":" + formatDouble(mDate.getSeconds(), 0, 2); } /*****************************/ /* FORMAT DOUBLE PART */ /*****************************/ public static String formatDouble(double value, int precision) { return formatDouble(value, precision, 1); } public static String formatDouble(double value, int precision, int minlen) { if (minlen < 0) minlen = 0; else if (minlen > formats.length - 1) minlen = formats.length - 1; if (precision < 0) precision = 0; else if (precision > formats[0].length - 1) precision = formats[0].length - 1; return formats[minlen][precision].format(value); } private static DecimalFormat[][] formats; static { formats = new DecimalFormat[][] { { new DecimalFormat("#"), new DecimalFormat("#.0"), new DecimalFormat("#.00"), new DecimalFormat("#.000"), new DecimalFormat("#.0000"), new DecimalFormat("#.00000"), new DecimalFormat("#.000000") }, { new DecimalFormat("#0"), new DecimalFormat("#0.0"), new DecimalFormat("#0.00"), new DecimalFormat("#0.000"), new DecimalFormat("#0.0000"), new DecimalFormat("#0.00000") , new DecimalFormat("#0.000000") }, { new DecimalFormat("#00"), new DecimalFormat("#00.0"), new DecimalFormat("#00.00"), new DecimalFormat("#00.000"), new DecimalFormat("#00.0000"), new DecimalFormat("#00.00000"), new DecimalFormat("#00.000000") }, { new DecimalFormat("#000"), new DecimalFormat("#000.0"), new DecimalFormat("#000.00"), new DecimalFormat("#000.000"), new DecimalFormat("#000.0000"), new DecimalFormat("#000.00000"), new DecimalFormat("#000.000000") }, { new DecimalFormat("#0000"), new DecimalFormat("#0000.0"), new DecimalFormat("#0000.00"), new DecimalFormat("#0000.000"), new DecimalFormat("#0000.0000"), new DecimalFormat("#0000.00000"), new DecimalFormat("#0000.000000") } }; for (int i = 0; i < formats.length; i++) { for (int j = 0; j < formats[i].length; j++) { formats[i][j].setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ENGLISH)); } } } public static String addZeros(String text, int count) { if (text == null || text.length() > count) return text; String res = new String(text); for (int i = res.length(); i < count; i++) { res = "0" + res; } return res; } }