在Java 6中,如果我有一个长度为11的String
,其中包含一个用零填充的负数,我想将其转换为Long
,我该怎么做此?
String x = "000000-3946";
try {
Long.parseLong(x)
} catch (ParseException e) {
e.printStackTrace();
}
...抛出NumberFormatException
。
通过删除前导零是我实现此功能的唯一方法。我尝试使用NumberFormat
和DecimalFormat
类进行解析。
答案 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,那么这里不能替换零