1

我正在尝试拆分一个数字,例如

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

4 回答 4

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
于 2013-10-25T13:26:52.957 回答
1

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

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即使我确定输入总是合法的,我也会亲自使用。唯一可以确定的是,我错了,输入有一天会是非法的。

于 2013-10-25T14:15:32.127 回答
0

substring使用 javaDateSimpleDateFormat类更好,请参阅:

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

于 2013-10-25T13:29:29.097 回答
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
于 2013-10-25T14:08:40.360 回答