blob: 16029212ce3458606eff7e6b4d7afbdd6cb73795 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Willian Mitsuda and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Willian Mitsuda - initial API and implementation
* Tasktop Technologies - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.editors;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
/**
* Format attachment size values originally in bytes to nice messages.
* <p>
* This formatter tries to use the most applicable measure unit based on size magnitude, i.e.:
* <p>
* <ul>
* <li>< 1 KB - byte based: 1 byte, 100 bytes, etc.
* <li>>=1 KB and < 1 MB - KB based: 2.00 KB, 100.76 KB
* <li>>=1 MB and < 1 GB - MB based: 1.00 MB, 33.33 MB
* <li>>=1 GB - GB based: 2.00 GB
* </ul>
* <p>
* This formatter assumes 1 KB == 1024 bytes, <strong>NOT</strong> 1000 bytes.
* <p>
* This formatter always uses 2 decimal places.
* <p>
* The size is provided as a String, because it will probably come from a attachment attribute. If the value cannot be
* decoded, for any reason, it returns {@link #UNKNOWN_SIZE}
*
* @author Willian Mitsuda
* @author Frank Becker
* @author Steffen Pingel
*/
public class AttachmentSizeFormatter {
/**
* Default value returned by this formatter when the size is unparseable, contain errors, etc.
*/
public static final String UNKNOWN_SIZE = "-"; //$NON-NLS-1$
public final static AttachmentSizeFormatter getInstance() {
return new AttachmentSizeFormatter();
}
private final DecimalFormat decimalFormat;
public AttachmentSizeFormatter() {
this(Locale.getDefault());
}
public AttachmentSizeFormatter(Locale locale) {
this.decimalFormat = (DecimalFormat) NumberFormat.getInstance(locale);
}
public String format(String sizeInBytes) {
if (sizeInBytes == null) {
return UNKNOWN_SIZE;
}
try {
return format(Long.parseLong(sizeInBytes));
} catch (NumberFormatException e) {
return UNKNOWN_SIZE;
}
}
public String format(long size) {
if (size < 0) {
return UNKNOWN_SIZE;
}
if (size < 1024) {
// format as byte
if (size == 1) {
return Messages.AttachmentSizeFormatter_1_byte;
}
DecimalFormat fmt = new DecimalFormat(Messages.AttachmentSizeFormatter_0_bytes);
return fmt.format(size);
} else if (size >= 1024 && size <= 1048575) {
// format as KB
double formattedValue = size / 1024.0;
decimalFormat.applyPattern(Messages.AttachmentSizeFormatter_0_KB);
return decimalFormat.format(formattedValue);
} else if (size >= 1048576 && size <= 1073741823) {
// format as MB
double formattedValue = size / 1048576.0;
decimalFormat.applyPattern(Messages.AttachmentSizeFormatter_0_MB);
return decimalFormat.format(formattedValue);
}
// format as GB
double formattedValue = size / 1073741824.0;
decimalFormat.applyPattern(Messages.AttachmentSizeFormatter_0_GB);
return decimalFormat.format(formattedValue);
}
}