Skip to content

Commit f40c75c

Browse files
committed
feat(raw-data): Display file sizes in human-readable format
- Add FileSizeFormatter utility class for byte-to-human-readable conversion - Update RawDataDetailsComponent to use formatted file sizes - Display sizes as B, KB, MB, or GB with 2 decimal precision Addresses #1405
1 parent 5456117 commit f40c75c

2 files changed

Lines changed: 48 additions & 2 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package life.qbic.application.commons;
2+
3+
import java.util.Locale;
4+
5+
/**
6+
* Utility class for formatting file sizes in human-readable format.
7+
* <p>
8+
* Provides methods to convert byte values to human-readable strings
9+
* scaled to the appropriate unit (B, KB, MB, GB).
10+
*/
11+
public class FileSizeFormatter {
12+
13+
private static final long KILOBYTE = 1024L;
14+
private static final long MEGABYTE = KILOBYTE * 1024L;
15+
private static final long GIGABYTE = MEGABYTE * 1024L;
16+
17+
private FileSizeFormatter() {
18+
// Utility class - no instantiation
19+
}
20+
21+
/**
22+
* Formats a byte value into a human-readable string.
23+
* <p>
24+
* The value is scaled to the most appropriate unit (B, KB, MB, or GB)
25+
* and rounded to 2 decimal places.
26+
*
27+
* @param bytes the size in bytes
28+
* @return a formatted string with the appropriate unit (e.g., "3.00 GB", "512.75 MB")
29+
*/
30+
public static String formatBytes(long bytes) {
31+
if (bytes < 0) {
32+
return "0 B";
33+
}
34+
if (bytes < KILOBYTE) {
35+
return bytes + " B";
36+
}
37+
if (bytes < MEGABYTE) {
38+
return String.format(Locale.US, "%.2f KB", bytes / (double) KILOBYTE);
39+
}
40+
if (bytes < GIGABYTE) {
41+
return String.format(Locale.US, "%.2f MB", bytes / (double) MEGABYTE);
42+
}
43+
return String.format(Locale.US, "%.2f GB", bytes / (double) GIGABYTE);
44+
}
45+
}

datamanager-app/src/main/java/life/qbic/datamanager/views/projects/project/rawdata/RawDataDetailsComponent.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.function.Function;
2727
import java.util.stream.Collectors;
2828
import life.qbic.application.commons.FileNameFormatter;
29+
import life.qbic.application.commons.FileSizeFormatter;
2930
import life.qbic.application.commons.time.DateTimeFormat;
3031
import life.qbic.datamanager.files.export.download.DownloadStreamProvider;
3132
import life.qbic.datamanager.files.export.rawdata.RawDataUrlFile;
@@ -401,7 +402,7 @@ private ComponentRenderer<GridDetailsItem, RawDatasetInformationPxP> renderRawDa
401402
BasicSampleInformation::sampleName).toList());
402403
rawDataItem.addEntry("Number of Files",
403404
String.valueOf(rawData.dataset().numberOfFiles()));
404-
rawDataItem.addEntry("File Size", String.valueOf(rawData.dataset().totalSizeBytes()));
405+
rawDataItem.addEntry("File Size", FileSizeFormatter.formatBytes(rawData.dataset().totalSizeBytes()));
405406
rawDataItem.addListEntry("File Suffixes", rawData.dataset().fileTypes());
406407
return rawDataItem;
407408
});
@@ -414,7 +415,7 @@ private ComponentRenderer<GridDetailsItem, RawDatasetInformationNgs> renderRawDa
414415
BasicSampleInformation::sampleName).toList());
415416
rawDataItem.addEntry("Number of Files",
416417
String.valueOf(rawData.dataset().numberOfFiles()));
417-
rawDataItem.addEntry("File Size", String.valueOf(rawData.dataset().totalSizeBytes()));
418+
rawDataItem.addEntry("File Size", FileSizeFormatter.formatBytes(rawData.dataset().totalSizeBytes()));
418419
rawDataItem.addListEntry("File Suffixes", rawData.dataset().fileTypes());
419420
return rawDataItem;
420421
});

0 commit comments

Comments
 (0)