Formatter.java revision 260c5020ae65ddd14668b8ae496c169082aa13f6
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.text.format; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 2007481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilsonimport android.net.NetworkUtils; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Utility class to aid in formatting common values that are not covered 2441e2e1f9919c9ae3593610f7e05f0d9cf69ec9b2Joe Malin * by the {@link java.util.Formatter} class in {@link java.util} 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Formatter { 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Formats a content size to be in the form of bytes, kilobytes, megabytes, etc 3007481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Context to use to load the localized units 3207481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * @param number size value to be formatted 3307481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * @return formatted string with the number 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String formatFileSize(Context context, long number) { 36bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn return formatFileSize(context, number, false); 37bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } 3807481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson 39bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn /** 40bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn * Like {@link #formatFileSize}, but trying to generate shorter numbers 4107481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * (showing fewer digits of precision). 42bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn */ 43bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn public static String formatShortFileSize(Context context, long number) { 44bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn return formatFileSize(context, number, true); 45bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } 4607481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson 47bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn private static String formatFileSize(Context context, long number, boolean shorter) { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (context == null) { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float result = number; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int suffix = com.android.internal.R.string.byteShort; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result > 900) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project suffix = com.android.internal.R.string.kilobyteShort; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = result / 1024; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result > 900) { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project suffix = com.android.internal.R.string.megabyteShort; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = result / 1024; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result > 900) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project suffix = com.android.internal.R.string.gigabyteShort; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = result / 1024; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result > 900) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project suffix = com.android.internal.R.string.terabyteShort; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = result / 1024; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result > 900) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project suffix = com.android.internal.R.string.petabyteShort; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = result / 1024; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn String value; 75bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (result < 1) { 76bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn value = String.format("%.2f", result); 77bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else if (result < 10) { 78bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (shorter) { 79bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn value = String.format("%.1f", result); 80bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else { 81bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn value = String.format("%.2f", result); 82bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } 83bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else if (result < 100) { 84bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (shorter) { 85bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn value = String.format("%.0f", result); 86bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else { 87bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn value = String.format("%.2f", result); 88bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } 89bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else { 90bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn value = String.format("%.0f", result); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 927351dd113f26580f3bcc7500746f3a26aecc4260Eric Fischer return context.getResources(). 937351dd113f26580f3bcc7500746f3a26aecc4260Eric Fischer getString(com.android.internal.R.string.fileSizeSuffix, 947351dd113f26580f3bcc7500746f3a26aecc4260Eric Fischer value, context.getString(suffix)); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9607481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 98fbf37c79bdedbdd7b82ad7d5862dd82e3c068590Elliott Hughes * Returns a string in the canonical IPv4 format ###.###.###.### from a packed integer 99fbf37c79bdedbdd7b82ad7d5862dd82e3c068590Elliott Hughes * containing the IP address. The IPv4 address is expected to be in little-endian 100fbf37c79bdedbdd7b82ad7d5862dd82e3c068590Elliott Hughes * format (LSB first). That is, 0x01020304 will return "4.3.2.1". 10107481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson * 102fbf37c79bdedbdd7b82ad7d5862dd82e3c068590Elliott Hughes * @deprecated Use {@link java.net.InetAddress#getHostAddress()}, which supports both IPv4 and 103fbf37c79bdedbdd7b82ad7d5862dd82e3c068590Elliott Hughes * IPv6 addresses. This method does not support IPv6 addresses. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10507481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson @Deprecated 10607481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson public static String formatIpAddress(int ipv4Address) { 10707481ccd1dcc2912797ec64f0bfa5641b39adceaJesse Wilson return NetworkUtils.intToInetAddress(ipv4Address).getHostAddress(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 109260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn 110260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn private static final int SECONDS_PER_MINUTE = 60; 111260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn private static final int SECONDS_PER_HOUR = 60 * 60; 112260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn private static final int SECONDS_PER_DAY = 24 * 60 * 60; 113260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn 114260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn /** 115260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn * Returns elapsed time for the given millis, in the following format: 116260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn * 1 day 5 hrs; will include at most two units, can go down to seconds precision. 117260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn * @param context the application context 118260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn * @param millis the elapsed time in milli seconds 119260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn * @return the formatted elapsed time 120260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn * @hide 121260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn */ 122260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn public static String formatShortElapsedTime(Context context, long millis) { 123260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn long secondsLong = millis / 1000; 124260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn 125260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn int days = 0, hours = 0, minutes = 0; 126260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn if (secondsLong >= SECONDS_PER_DAY) { 127260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn days = (int)(secondsLong / SECONDS_PER_DAY); 128260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn secondsLong -= days * SECONDS_PER_DAY; 129260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 130260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn if (secondsLong >= SECONDS_PER_HOUR) { 131260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn hours = (int)(secondsLong / SECONDS_PER_HOUR); 132260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn secondsLong -= hours * SECONDS_PER_HOUR; 133260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 134260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn if (secondsLong >= SECONDS_PER_MINUTE) { 135260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn minutes = (int)(secondsLong / SECONDS_PER_MINUTE); 136260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn secondsLong -= minutes * SECONDS_PER_MINUTE; 137260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 138260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn int seconds = (int)secondsLong; 139260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn 140260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn if (days >= 2) { 141260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn days += (hours+12)/24; 142260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationDays, days); 143260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } else if (days > 0) { 144260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn if (hours == 1) { 145260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationDayHour, days, hours); 146260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 147260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationDayHours, days, hours); 148260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } else if (hours >= 2) { 149260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn hours += (minutes+30)/60; 150260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationHours, hours); 151260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } else if (hours > 0) { 152260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn if (minutes == 1) { 153260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationHourMinute, hours, 154260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn minutes); 155260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 156260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationHourMinutes, hours, 157260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn minutes); 158260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } else if (minutes >= 2) { 159260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn minutes += (seconds+30)/60; 160260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationMinutes, minutes); 161260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } else if (minutes > 0) { 162260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn if (seconds == 1) { 163260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationMinuteSecond, minutes, 164260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn seconds); 165260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 166260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationMinuteSeconds, minutes, 167260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn seconds); 168260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } else if (seconds == 1) { 169260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationSecond, seconds); 170260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } else { 171260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn return context.getString(com.android.internal.R.string.durationSeconds, seconds); 172260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 173260c5020ae65ddd14668b8ae496c169082aa13f6Dianne Hackborn } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 175