我想分割一个数字,比如
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'时会发痒。有没有更好的方法呢?
答案 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 Date
和SimpleDateFormat
类,请参阅:
答案 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