2013-10-25 114 views
1

我试图拆了一些,像拆分成若干部分斯卡拉

20130405 

分为三个部分:年,月,date.One的方法是将其转换为字符串,并使用正则表达式。喜欢的东西:

(\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中使用“变种”。有没有更好的方法来做到这一点?

+0

假设数字格式总是相同的,'substring'是否适合你? –

回答

2

我会去与前:

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 
+0

是不是正则表达式相当重的操作?我想,划分会更好。 –

+1

除非你解析史诗般的日期数量,并发现这是你的性能瓶颈,否则我认为在这个阶段过于担心这是过早的优化。我给出的代码感觉干净而直接(对我来说),如果正则表达式可以在其他地方定义,如果它有助于分离问题等。寻找更好的代码结构而不是直接的性能,直到你知道你的关键代码发生了什么成为。 – Shadowlands

0

不是很斯卡拉十岁上下,但。 ...

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

scala> val format = new java.text.SimpleDateFormat("yyyyMMdd") 
format: java.text.SimpleDateFormat = [email protected] 

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 
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即使我确认输入将永远是合法的。唯一可以肯定的是我错了,投入有一天会是非法的。