将存储大小字符串转换为long?

时间:2019-03-21 11:20:57

标签: java string long-integer

在Java中... 假设我的输入是存储大小可以不同的字符串。 (例如“ 1.2mb”,“ 500kb”,“ 4.5gb”,“ 900b”等),我需要将任何输入转换为字节并将其存储为long。按照我的观察方式,我需要将字符串拆分(例如“ 1.2”和“ mb”,“ 500”和“ kb”等),然后根据第二个字符串,我可以确定要乘以多少通过第一个字符串将其转换为字节。

1。)我不确定如何分割字符串。我的想法是反转字符串然后得到第二个字符,但是如果输入以字节为单位,那将不起作用,因为在这种情况下第二个字符将是一个数字。关于如何适当拆分的任何想法?

2。)如果除了拆分字符串之外,还有其他更好的方法,例如某个库或可以为我完成转换的东西。似乎可能/应该存在。

2 个答案:

答案 0 :(得分:-1)

好吧,我意识到自己对此事完全没有考虑。我想出的解决方案是使用Character.IsLetter()遍历字符串以获取“ kb”,“ b”,“ mb”等。

答案 1 :(得分:-1)

或者,您也可以使用regular expression这样的代码来实现此目的:

([\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