在Java中... 假设我的输入是存储大小可以不同的字符串。 (例如“ 1.2mb”,“ 500kb”,“ 4.5gb”,“ 900b”等),我需要将任何输入转换为字节并将其存储为long。按照我的观察方式,我需要将字符串拆分(例如“ 1.2”和“ mb”,“ 500”和“ kb”等),然后根据第二个字符串,我可以确定要乘以多少通过第一个字符串将其转换为字节。
1。)我不确定如何分割字符串。我的想法是反转字符串然后得到第二个字符,但是如果输入以字节为单位,那将不起作用,因为在这种情况下第二个字符将是一个数字。关于如何适当拆分的任何想法?
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