В качестве альтернативы, вы также можете достичь этого, используя регулярное выражение , например:
([\d\.]+)\s*(\D*)
состоит из трех частей
1. ([\d\.]+)
- Найти любую последовательность символов, содержащую только цифры и точку
2. \s*
- Разрешить пробелы между числом и единицей
3. (\D*)
- Единица измерения: все, что не является цифрой
Вы можете поиграть с этим регулярным выражением на regex101.com
А вот как вы используете регулярное выражение в Java:
List<String> inputs = Arrays.asList("100", "500b", "1.2kb", "100 mb", "4.5Gb", "3.45tb");
//Lookup map for the factors
Map<String, Double> factors = new HashMap<>();
factors.put("kb", Math.pow(10,3));
factors.put("mb", Math.pow(10,6));
factors.put("gb", Math.pow(10,9));
factors.put("tb", Math.pow(10,12));
//Create the regex pattern
Pattern pattern = Pattern.compile("(?<size>[\\d\\.]+)\\s*(?<unit>\\D*)");
for(String input : inputs){
//Apply the regex pattern to the input string
Matcher matcher = pattern.matcher(input);
//If it matches
if(matcher.find()){
//get the contents of our named groups
String size = matcher.group("size");
String unit = matcher.group("unit");
//Parse and calculate the result
Double factor = factors.getOrDefault(unit.toLowerCase(), 1d);
double calculatedSize = Double.parseDouble(size) * factor;
//Print the result
System.out.printf("%s\t= %.0f bytes\n", input, calculatedSize);
}
}
Выход:
100 = 100 bytes
500b = 500 bytes
1.2kb = 1200 bytes
100 mb = 100000000 bytes
4.5Gb = 4500000000 bytes
3.45tb = 3450000000000 bytes