В Scala 2.8 как получить доступ к подстроке по ее длине и начальному индексу? - PullRequest
3 голосов
/ 03 сентября 2010

У меня есть дата и время в отдельных полях, в форматах yyyyMMdd и HHmmss соответственно. Чтобы разобрать их, я думаю создать строку yyyy-MM-ddTHH: mm: ss и передать ее конструктору joda-time. Итак, я ищу, чтобы получить первые 4 цифры, затем 2 цифры, начиная с индекса 5 и т. Д. Как этого добиться? List.fromString (String) (который я нашел здесь ), похоже, не работает.

Ответы [ 4 ]

15 голосов
/ 03 сентября 2010

Метод substring, безусловно, может помочь вам, но String в Scala 2.8 также поддерживает все другие методы для последовательностей. ScalaDoc для класса StringOps дает полный список.

В частности, метод splitAt пригодится.Вот взаимодействие REPL, которое показывает, как.

scala> val ymd = "yyyyMMdd"
ymd: java.lang.String = yyyyMMdd

scala> val (y, md) = ymd splitAt 4
y: String = yyyy
md: String = MMdd

scala> val (m, d) = md splitAt 2
m: String = MM
d: String = dd

scala> y+"-"+m+"-"+d
res3: java.lang.String = yyyy-MM-dd
8 голосов
/ 03 сентября 2010

Просто используйте метод substring() в строке.Обратите внимание, что строки Scala ведут себя как строки Java (с некоторыми дополнительными методами), поэтому все, что находится в java.lang.String, также может использоваться в строках Scala.

val s = "20100903"
val t = s.substring(0, 4) // t will contain "2010"

(Обратите внимание, что аргументы не являются длиной и начальным индексом, но начальный индекс (включительно) и конечный индекс (исключение)).

Но если речь идет о разборе дат, почему бы вам просто не использовать java.text.SimpleDateFormat, как в Java?

val s = "20100903"
val fmt = new SimpleDateFormat("yyyyMMdd")
val date = fmt.parse(s)  // will give you a java.util.Date object
7 голосов
/ 03 сентября 2010

Если вы используете Joda Time, вы сможете использовать

val date = DateTimeFormat.forPattern("yyyyMMdd, HHmmss")
                         .parseDateTime(field1 + ", " + field2)

Для более общей проблемы синтаксического анализа строк, подобных этой, может быть полезно использовать Regex (хотя я бы не рекомендовал его в этом случае):

scala> val Date = "(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)".r
Date: scala.util.matching.Regex = (\d\d\d\d)(\d\d)(\d\d)

scala> "20100903" match { 
     |    case Date(year, month, day) => year + "-" + month + "-" + day 
     | }
res1: java.lang.String = 2010-09-03
2 голосов
/ 03 сентября 2010
val field1="20100903"
val field2="100925"
val year = field1.substring(1,5)
val month = field1.substring(5,7)
val day = ...
...
val toYodaTime = year + "-" + month+"-"+day+ ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...