Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将左填充字符串转换为数字_Java - Fatal编程技术网

Java 将左填充字符串转换为数字

Java 将左填充字符串转换为数字,java,Java,在Java 6中,如果我有一个长度为11的字符串,其中包含一个负数,该负数用零填充,我想将其转换为长的,我该如何做呢 String x = "000000-3946"; try { Long.parseLong(x) } catch (ParseException e) { e.printStackTrace(); } …抛出一个NumberFormatException 删除前导零是我实现此功能的唯一方法。我尝试使用NumberFormat和DecimalFormat类进行

在Java 6中,如果我有一个长度为11的
字符串
,其中包含一个负数,该负数用零填充,我想将其转换为
长的
,我该如何做呢

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+-", "-"))