Преобразование размера хранилища String в long? - PullRequest
0 голосов
/ 21 марта 2019

на Java ... Предполагая, что мой ввод - это строка для размера хранилища, которое может варьироваться. (например, "1.2mb", "500kb", "4.5gb", "900b" и т. д.) Мне нужно преобразовать любой ввод в байты и сохранить его как длинный. Как я вижу, мне нужно разделить строку (например, «1.2» и «mb», «500» и «kb» и т. Д.). Затем, основываясь на второй строке, я могу определить, сколько нужно умножить на первая строка, чтобы получить его в байтах.

1.) Я не уверен, как разбить строку. У меня была идея перевернуть строку, затем получить 2-й символ, но это не сработало бы, если бы ввод был в байтах, поскольку 2-й символ был бы числом в этом случае. Любые идеи о том, как я могу правильно разделить это?

2.) Если есть какой-то лучший способ, кроме разбиения строки, например, какая-нибудь библиотека или что-то, что может просто сделать преобразование для меня. Похоже на то, что может / должно существовать.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

В качестве альтернативы, вы также можете достичь этого, используя регулярное выражение , например:

([\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
0 голосов
/ 21 марта 2019

Хорошо, я понял, что полностью обдумал это. Решением, которое я придумал, было цикл по строке с помощью Character.IsLetter (), чтобы получить «kb», «b», «mb» и т. Д.

...