【问题标题】:java.lang.NumberFormatException: For input string: "0.000" [duplicate]java.lang.NumberFormatException:对于输入字符串:“0.000”[重复]
【发布时间】:2020-03-11 06:11:29
【问题描述】:

我正在尝试创建一个 udf 以将两个字符串作为参数;一个采用 DD-MM-YYYY 格式(例如“14-10-2019”),另一个采用浮点格式(例如“0.000”)。我想将类似浮点的字符串转换为 int 并将其添加到日期对象以获取另一个我想作为字符串返回的日期。

def getEndDate = udf{ (startDate: String, no_of_days : String) =>
  val num_days = no_of_days.trim.toInt //Converts the String value to Integer
  val date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(startDate) //Parses the string date to timestamp
  calObj.setTime(date) //Sets the calendar object instance
  calObj.add(Calendar.DAY_OF_MONTH, num_days) //Adds the number of days to the start date
  val endDate = calObj.getTime().toString //Gets end date in string format
  endDate
}

尝试运行时,我收到以下错误:

原因:java.lang.NumberFormatException:对于输入字符串:“0.000”

【问题讨论】:

  • 尝试调试它。抛出异常时startDateno_of_days的值是多少?
  • 它会在行本身上引发错误。开始日期 = 14-10-2019T00:00:00。 no_of_days = "0.000"
  • 这不是我问的——看看实际值。 " 引号是否可能是 no_of_days 值的一部分?您需要先去掉引号。
  • 不,引号不是值的一部分。我还检查了前导/尾随空格。数据似乎很干净。
  • 请显示完整的堆栈跟踪,异常究竟发生在哪里?单独对您的功能进行单元测试,它是否适用于您提到的输入。如果是这样,您可能没有得到您认为的输入。

标签: java scala apache-spark-sql numberformatexception


【解决方案1】:

"0.0000" 之类的字符串不能直接解析为整数。您可以尝试先使用toDouble,然后使用toInt

no_of_days.trim.toDouble.toInt

它会将值向下舍入。如果您想将值四舍五入到最接近的值,您应该考虑使用round

no_of_days.trim.toDouble.round

您的代码的另一个问题是,您不应该使用SimpleDateFormat,因为它已经过时了。您应该改用LocalDateDateTimeFormatter

val date = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("dd-MM-
yyyy")) 
date.plusDays(num_days)

【讨论】:

  • 您好,我尝试将其转换为 double 然后再转换为 int,但它仍然给出相同的错误。澄清一下,“0.000”在小数点前总是有一个整数,所以我什至尝试在“。”上拆分字符串。并抓取小数点前面的数字,然后将其转换为 int,但仍然是同样的问题。
  • 你总是有同样的例外? Caused by: java.lang.NumberFormatException: For input string: "0.000" ?
  • 是的,完全相同的消息。
【解决方案2】:

我不建议这样做,但这里有一些示例可以解决您的问题。

scala> "0.00".toDouble.toInt
res0: Int = 0

scala> "2.45".toDouble.toInt
res1: Int = 2

scala> "2.5".toDouble.toInt
res2: Int = 2

scala> "2.6".toDouble.toInt
res3: Int = 2

scala> "-1".toDouble.toInt
res4: Int = -1

scala> "-1.5".toDouble.toInt
res5: Int = -1

【讨论】:

  • 谢谢。我尝试了其中的大多数,但它们每次都产生相同的异常。将集群重新附加到 Databricks 笔记本解决了这个问题。
猜你喜欢
  • 2017-09-02
  • 2013-09-16
  • 2015-04-19
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多