在Scala中将数字拆分为多个部分

时间:2013-10-25 13:22:31

标签: scala numbers split

我想分割一个数字,比如

20130405

分为三个部分:年,月和日。一种方法是将其转换为字符串并使用正则表达式。类似的东西:

(\d{4})(\d{2})(\d{2}).r

更好的方法是将它除以100.类似于:

var date = dateNumber
val day = date % 100
date /= 100
val month = date % 100
date /= 100
val year = date

我在Scala中使用'var'时会发痒。有没有更好的方法呢?

4 个答案:

答案 0 :(得分:3)

我会选择前者:

scala> val regex = """(\d{4})(\d{2})(\d{2})""".r
regex: scala.util.matching.Regex = (\d{4})(\d{2})(\d{2})

scala> val regex(year, month, day) = "20130405"
year: String = 2013
month: String = 04
day: String = 05

答案 1 :(得分:1)

这可能不比您自己的解决方案好多少,但它不使用var并且不需要将数字转换为字符串。另一方面,它不是很安全 - 如果你不是100%确定你的号码格式正确,最好使用SimpleDateFormat - 授予,它更贵,但至少你是安全的来自非法输入。

val num = 20130405
val (date, month, year) = (num % 100, num / 100 % 100, num / 10000)

println(date)  // Prints 5
println(month) // Prints 4
println(year)  // Prints 2013

我个人使用SimpleDateFormat,即使我确信输入始终合法。唯一确定的是我错了,有一天输入将是非法的。

答案 2 :(得分:0)

优于substring将使用java DateSimpleDateFormat类,请参阅:

https://stackoverflow.com/a/4216767/88588

答案 3 :(得分:0)

不是scala-ish但是......

scala> import java.util.Calendar
import java.util.Calendar

scala> val format = new java.text.SimpleDateFormat("yyyyMMdd")
format: java.text.SimpleDateFormat = java.text.SimpleDateFormat@ef87e460

scala> format.format(new java.util.Date())
res0: String = 20131025

scala> val d=format.parse("20130405")
d: java.util.Date = Fri Apr 05 00:00:00 CEST 2013

scala> val calendar = Calendar.getInstance
calendar: java.util.Calendar = [cut...]

scala> calendar.setTime(d)

scala> calendar.get(Calendar.YEAR)
res1: Int = 2013