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

时间:2019-11-15 05:55:00

标签: java scala apache-spark-sql numberformatexception

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

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”

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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