【问题标题】:How to convert String to long without NumberFormatException?如何在没有 NumberFormatException 的情况下将 String 转换为 long?
【发布时间】:2017-09-26 15:14:28
【问题描述】:

我想附加这些长变量,所以我先把它们变成了字符串。当我将它们返回 long 时,它会引发 NumberFormatException。

public long BLZ = 12345678l;
public long KNr = 1234567890l;
public String landCode = "1314";
long fedor = Long.parseLong(String.valueOf(BLZ) + String.valueOf(KNr) + 
landCode + "00"); 

【问题讨论】:

标签: java numberformatexception


【解决方案1】:
long BLZ = 12345678l;
long KNr = 1234567890l;
String landCode = "1314";
System.out.println(Long.MAX_VALUE);
System.out.println(String.valueOf(BLZ) + String.valueOf(KNr) + landCode + "00"); 

导致输出

9223372036854775807

123456781234567890131400

您尝试解析的数字大于long 可以处理的数字。

编辑:您问如何解决您的问题。在您的问题的 cmets 中,有一个理论是您要计算 IBAN 的校验和。你可以使用java.math.BigInteger

System.out.println(Long.MAX_VALUE);
long BLZ = 12345678l;
long KNr = 1234567890l;
String landCode = "1314";
String val = String.valueOf(BLZ) + String.valueOf(KNr) + landCode + "00";
System.out.println(val); 
System.out.println(BigInteger.valueOf(98).subtract(new BigInteger(val).mod(BigInteger.valueOf(97))));

这导致以下输出:

9223372036854775807

123456781234567890131400

87

或者,您可以检查IBAN Documentation(它是德语,但我想这对您来说应该不是问题;-)在第 4 章中描述了一种计算校验和的方法(如果您受到限制)(例如这里)。您仍然需要longs 才能实现该功能,因为 9 位数字可能超出 int 的范围。

【讨论】:

  • 谢谢,虽然我不知道如何解决我的问题。你有什么想法吗?
  • @Fledormaus 在不知道您到底想要实现什么以及问题出在哪里的情况下,这是一项艰巨的任务。你的实现根本行不通,所以为了告诉你,你需要做什么,我们需要在这里了解更多关于实际场景的信息。
  • @Fledormaus 如果您真的想将给定的数字解析成某些东西,java.math.BigInteger 是您的朋友(在您的问题的 cmets 中已经提到过)。您可以通过调用new BigInteger(concatenatedString) 进行转换
  • 应该注意,将片段视为数字会承担丢失重要零位的风险。强烈建议使用String.format("%08d%010d", BLZ, KNr) 的东西。
  • @Lothar: 好吧,1234567890KNr 是一个人为的例子,显然是在使用这种幼稚的方法,但只要考虑123456 也是一个有效的KNr(是的,我们在德国有较小的银行),甚至我自己的帐户也有更少的数字,因此需要零填充,因此不需要合并其他国家和字母来打破这种情况。
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2022-01-20
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多