Java 将左填充字符串转换为数字
在Java 6中,如果我有一个长度为11的Java 将左填充字符串转换为数字,java,Java,在Java 6中,如果我有一个长度为11的字符串,其中包含一个负数,该负数用零填充,我想将其转换为长的,我该如何做呢 String x = "000000-3946"; try { Long.parseLong(x) } catch (ParseException e) { e.printStackTrace(); } …抛出一个NumberFormatException 删除前导零是我实现此功能的唯一方法。我尝试使用NumberFormat和DecimalFormat类进行
字符串
,其中包含一个负数,该负数用零填充,我想将其转换为长的,我该如何做呢
String x = "000000-3946";
try {
Long.parseLong(x)
} catch (ParseException e) {
e.printStackTrace();
}
…抛出一个NumberFormatException
删除前导零是我实现此功能的唯一方法。我尝试使用NumberFormat
和DecimalFormat
类进行解析。首先,可以抛出。接下来,我检查减号,如果有,从那个位置取一个子串。差不多
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
有点过火了,但这会起作用:
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
第二个语句将使用正则表达式删除前面的所有零,并提供一个可以解析为长值的有效字符串。(处理正数和负数)
从评论中:
上面的代码replaceFirst
实际上会在内部为每个调用创建模式对象
//code of String.replaceFirst
return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
由于我们对大量输入使用此方法,因此每次创建模式对象都不是正确的方法,因为正则表达式对所有输入都是相同的
所以我们只创建一次pattern对象,希望它能提供更好的性能结果
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));
}
#如果需要单行,请尝试以下操作:
Long.parseLong(x.replaceAll("0+-", "-"))
再加上你的第二个问题,如果字符串是-1234567809,这里没有要替换的零如果字符串是“-1234567809”,会替换零吗?当然会。只删除前导零。若你们怀疑的话,试试看。我也觉得,解析前导为零的数字字符串会导致歧义。因为前面带零的数字被认为是八进制数。因此,如果我们正确地修剪字符串,一切都会正常工作,看起来也很好。谢谢,我有大约数亿条记录要转换。我需要一个有效的方法,我想这就是方法。如果你处理这么多的记录,那么就使用更新的记录。我希望它能提供更好的性能结果。此外,我建议你尝试其他方法,并记下所花的时间,如果你得到更好的结果,请更新。
Long.parseLong(x.replaceAll("0+-", "-"))