@@ -1279,15 +1279,16 @@ defmodule Calendar.ISO do
1279
1279
def microseconds_to_iodata ( microsecond , 6 ) , do: zero_pad ( microsecond , 6 )
1280
1280
1281
1281
def microseconds_to_iodata ( microsecond , precision ) do
1282
- num = div ( microsecond , div_factor ( precision ) )
1282
+ num = div ( microsecond , scale_factor ( precision ) )
1283
1283
zero_pad ( num , precision )
1284
1284
end
1285
1285
1286
- defp div_factor ( 1 ) , do: 100_000
1287
- defp div_factor ( 2 ) , do: 10_000
1288
- defp div_factor ( 3 ) , do: 1_000
1289
- defp div_factor ( 4 ) , do: 100
1290
- defp div_factor ( 5 ) , do: 10
1286
+ defp scale_factor ( 1 ) , do: 100_000
1287
+ defp scale_factor ( 2 ) , do: 10_000
1288
+ defp scale_factor ( 3 ) , do: 1_000
1289
+ defp scale_factor ( 4 ) , do: 100
1290
+ defp scale_factor ( 5 ) , do: 10
1291
+ defp scale_factor ( 6 ) , do: 1
1291
1292
1292
1293
defp time_to_iodata_format ( hour , minute , second , :extended ) do
1293
1294
[ zero_pad ( hour , 2 ) , ?: , zero_pad ( minute , 2 ) , ?: | zero_pad ( second , 2 ) ]
@@ -1988,16 +1989,13 @@ defmodule Calendar.ISO do
1988
1989
end
1989
1990
1990
1991
defp parse_microsecond ( "." <> rest ) do
1991
- case parse_microsecond ( rest , 0 , "" ) do
1992
- { "" , 0 , _ } ->
1992
+ case parse_microsecond ( rest , 0 , [ ] ) do
1993
+ { [ ] , 0 , _ } ->
1993
1994
:error
1994
1995
1995
- { microsecond , precision , rest } when precision in 1 .. 6 ->
1996
- pad = String . duplicate ( "0" , 6 - byte_size ( microsecond ) )
1997
- { { String . to_integer ( microsecond <> pad ) , precision } , rest }
1998
-
1999
- { microsecond , _precision , rest } ->
2000
- { { String . to_integer ( binary_part ( microsecond , 0 , 6 ) ) , 6 } , rest }
1996
+ { microsecond , precision , rest } ->
1997
+ scale = scale_factor ( precision )
1998
+ { { :erlang . list_to_integer ( microsecond ) * scale , precision } , rest }
2001
1999
end
2002
2000
end
2003
2001
@@ -2009,34 +2007,42 @@ defmodule Calendar.ISO do
2009
2007
{ { 0 , 0 } , rest }
2010
2008
end
2011
2009
2010
+ defp parse_microsecond ( << head , tail :: binary >> , 6 , acc ) when head in ?0 .. ?9 ,
2011
+ do: parse_microsecond ( tail , 6 , acc )
2012
+
2012
2013
defp parse_microsecond ( << head , tail :: binary >> , precision , acc ) when head in ?0 .. ?9 ,
2013
- do: parse_microsecond ( tail , precision + 1 , << acc :: binary , head >> )
2014
+ do: parse_microsecond ( tail , precision + 1 , [ head | acc ] )
2014
2015
2015
- defp parse_microsecond ( rest , precision , acc ) , do: { acc , precision , rest }
2016
+ defp parse_microsecond ( rest , precision , acc ) do
2017
+ { :lists . reverse ( acc ) , precision , rest }
2018
+ end
2016
2019
2017
2020
defp parse_offset ( "" ) , do: { nil , "" }
2018
2021
defp parse_offset ( "Z" ) , do: { 0 , "" }
2019
2022
defp parse_offset ( "-00:00" ) , do: :error
2020
2023
2021
- defp parse_offset ( << ?+ , hour :: 2 - bytes , ?: , min :: 2 - bytes , rest :: binary >> ) ,
2022
- do: parse_offset ( 1 , hour , min , rest )
2024
+ defp parse_offset ( << ?+ , h1 , h2 , ?: , m1 , m2 , rest :: binary >> ) ,
2025
+ do: parse_offset ( 1 , h1 , h2 , m1 , m2 , rest )
2023
2026
2024
- defp parse_offset ( << ?- , hour :: 2 - bytes , ?: , min :: 2 - bytes , rest :: binary >> ) ,
2025
- do: parse_offset ( - 1 , hour , min , rest )
2027
+ defp parse_offset ( << ?- , h1 , h2 , ?: , m1 , m2 , rest :: binary >> ) ,
2028
+ do: parse_offset ( - 1 , h1 , h2 , m1 , m2 , rest )
2026
2029
2027
- defp parse_offset ( << ?+ , hour :: 2 - bytes , min :: 2 - bytes , rest :: binary >> ) ,
2028
- do: parse_offset ( 1 , hour , min , rest )
2030
+ defp parse_offset ( << ?+ , h1 , h2 , m1 , m2 , rest :: binary >> ) ,
2031
+ do: parse_offset ( 1 , h1 , h2 , m1 , m2 , rest )
2029
2032
2030
- defp parse_offset ( << ?- , hour :: 2 - bytes , min :: 2 - bytes , rest :: binary >> ) ,
2031
- do: parse_offset ( - 1 , hour , min , rest )
2033
+ defp parse_offset ( << ?- , h1 , h2 , m1 , m2 , rest :: binary >> ) ,
2034
+ do: parse_offset ( - 1 , h1 , h2 , m1 , m2 , rest )
2032
2035
2033
- defp parse_offset ( << ?+ , hour :: 2 - bytes , rest :: binary >> ) , do: parse_offset ( 1 , hour , "00" , rest )
2034
- defp parse_offset ( << ?- , hour :: 2 - bytes , rest :: binary >> ) , do: parse_offset ( - 1 , hour , "00" , rest )
2036
+ defp parse_offset ( << ?+ , h1 , h2 , rest :: binary >> ) , do: parse_offset ( 1 , h1 , h2 , ?0 , ?0 , rest )
2037
+ defp parse_offset ( << ?- , h1 , h2 , rest :: binary >> ) , do: parse_offset ( - 1 , h1 , h2 , ?0 , ?0 , rest )
2035
2038
defp parse_offset ( _ ) , do: :error
2036
2039
2037
- defp parse_offset ( sign , hour , min , rest ) do
2038
- with { hour , "" } when hour < 24 <- Integer . parse ( hour ) ,
2039
- { min , "" } when min < 60 <- Integer . parse ( min ) do
2040
+ defp parse_offset ( sign , h1 , h2 , m1 , m2 , rest ) do
2041
+ with true <- h1 in ?0 .. ?2 and h2 in ?0 .. ?9 ,
2042
+ true <- m1 in ?0 .. ?5 and m2 in ?0 .. ?9 ,
2043
+ hour = ( h1 - ?0 ) * 10 + h2 - ?0 ,
2044
+ min = ( m1 - ?0 ) * 10 + m2 - ?0 ,
2045
+ true <- hour < 24 do
2040
2046
{ ( hour * 60 + min ) * 60 * sign , rest }
2041
2047
else
2042
2048
_ -> :error
0 commit comments