我有一种尝试将字符串转换为long的方法:
public static Long getLong(String str) {
long multiplier = 1;
try {
Long value = -1L;
str = str.replaceAll("\\s", ""); // remove whitespace
str = str.replaceAll("%", "");
str = str.replaceAll(",", "");
if (str.contains("M")) {
str = str.replaceAll("M", "");
multiplier = 1000000;
} else if (str.contains("B")) {
str = str.replaceAll("B", "");
multiplier = 1000000000;
} else if (str.contains("K")){
str = str.replaceAll("K", "");
multiplier = 1000;
}
// an exception is thrown for values like 199.00, so removing
// decimals if any
str = str.contains(".") ? str.substring(0, str.lastIndexOf(".")) : str;
value = Long.valueOf(str);
value = value * multiplier;
return value;
} catch (Exception e) {
throw new RuntimeException(str + " cannot be parsed into long value");
}
此方法可以正常工作,例如" 1K"," 300M"," 2B"," 0"但不适用于3.14M或1.1K等值。如上所述,注释Long.valueOf(str)如果必须接受类似1.24的输入则抛出异常,所以我必须删除十进制后的数字(我不想这样做)
答案 0 :(得分:6)
使用java.math.BigDecimal
代替Long
。这将保留小数部分。
注意:请勿使用float或double。在解析字符串值时,您可能会遇到奇怪的精度问题。
答案 1 :(得分:0)
而不是
value = Long.valueOf(str);
使用:
value = Float.valueOf(str);
或value = Double.valueOf(str);
显然更改value
的类型以匹配您选择的那个。背后的原因是long表示一个长整数,不能包含带小数点的数字。
这里是描述原始Java数据类型的link。
答案 2 :(得分:0)
if (str.contains("M")) {
str = str.replaceAll("M", "");
multiplier = 1000000;
这里的乘数是一百万。
} else if (str.contains("B")) {
str = str.replaceAll("B", "");
multiplier = 1000000000;
所以这里的乘数应该是 1 ,而不是1,000,000,000。
} else if (str.contains("K")){
str = str.replaceAll("K", "");
multiplier = 1000;
}
这个乘数是正确的。