将字符串行3.14M转换为Long

时间:2014-05-11 09:44:11

标签: java

我有一种尝试将字符串转换为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的输入则抛出异常,所以我必须删除十进制后的数字(我不想这样做)

3 个答案:

答案 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;
        }

这个乘数是正确的。