将左边填充的String转换为数字

时间:2015-10-19 19:25:12

标签: java

在Java 6中,如果我有一个长度为11的String,其中包含一个用零填充的负数,我想将其转换为Long,我该怎么做此?

String x = "000000-3946";

try {
    Long.parseLong(x)
} catch (ParseException e) {
    e.printStackTrace();
}

...抛出NumberFormatException

通过删除前导零是我实现此功能的唯一方法。我尝试使用NumberFormatDecimalFormat类进行解析。

4 个答案:

答案 0 :(得分:2)

第二个语句将使用正则表达式删除所有前面的零,并为您提供一个可以解析为Long值的有效字符串。 (处理正数和负数)

String x = "000000-3946";
String xWithoutLeadingZeros = x.replaceFirst("^0+", "");
System.out.println(Long.parseLong(xWithoutLeadingZeros));

来自评论:

上面的代码replaceFirst实际上会在每次调用时在内部创建Pattern对象。

//code of String.replaceFirst
return Pattern.compile(regex).matcher(this).replaceFirst(replacement);

由于我们对大量输入使用此方法,因此每次创建模式对象都不正确,因为所有输入的regEx都相同。

因此我们只创建一次模式对象,希望它能提供更好的性能结果。

private static final Pattern leadingZeroPattern = Pattern.compile("^0+");
private static final String EMPTY_STRING = "";

public static void main(String[] args) {
    String x = "-232330000809";
    String xWithoutZeros = leadingZeroPattern.matcher(x).replaceFirst(EMPTY_STRING);
    System.out.println(Long.parseLong(xWithoutZeros));
}

#perfmatters

答案 1 :(得分:1)

首先,Long.parseLong(String)可以抛出NumberFormatException。接下来,我检查一个减号,如果存在,则从该位置获取一个子串。像

这样的东西
String x = "000000-3946";
int p = x.indexOf("-") > -1 ? x.indexOf("-") : 0;
try {
    long l = Long.parseLong(x.substring(p));
    System.out.println(l);
} catch (NumberFormatException nfe) {
    nfe.printStackTrace();
}

输出

-3946

答案 2 :(得分:0)

有点矫枉过正,但这会解决问题:

final String x = "000000-3946";
int start = x.indexOf("-");

System.out.printf("%s%n", Long.parseLong(x.substring((start > -1) ? start : 0, x.length())));
// ...or just
//System.out.printf("%s%n", Long.parseLong(x.substring((start > -1) ? start : 0)));

输出-3946

答案 3 :(得分:0)

如果您需要一行,请尝试以下方法:

 Long.parseLong(x.replaceAll("0+-", "-"))

要添加关于你的第二个问题,如果字符串是-1234567809,那么这里不能替换零