@@ -1250,10 +1250,24 @@ defmodule Calendar.ISO do
12501250 [
12511251 time_to_iodata_format ( hour , minute , second , format ) ,
12521252 "." ,
1253- microsecond |> zero_pad ( 6 ) |> IO . iodata_to_binary ( ) |> binary_part ( 0 , precision )
1253+ microseconds_to_iodata ( microsecond , precision )
12541254 ]
12551255 end
12561256
1257+ defp microseconds_to_iodata ( _microsecond , 0 ) , do: [ ]
1258+ defp microseconds_to_iodata ( microsecond , 6 ) , do: zero_pad ( microsecond , 6 )
1259+
1260+ defp microseconds_to_iodata ( microsecond , precision ) do
1261+ num = div ( microsecond , div_factor ( precision ) )
1262+ zero_pad ( num , precision )
1263+ end
1264+
1265+ defp div_factor ( 1 ) , do: 100_000
1266+ defp div_factor ( 2 ) , do: 10_000
1267+ defp div_factor ( 3 ) , do: 1_000
1268+ defp div_factor ( 4 ) , do: 100
1269+ defp div_factor ( 5 ) , do: 10
1270+
12571271 defp time_to_iodata_format ( hour , minute , second , :extended ) do
12581272 [ zero_pad ( hour , 2 ) , ":" , zero_pad ( minute , 2 ) , ":" , zero_pad ( second , 2 ) ]
12591273 end
@@ -1577,7 +1591,7 @@ defmodule Calendar.ISO do
15771591 defp sign ( total ) when total < 0 , do: "-"
15781592 defp sign ( _ ) , do: "+"
15791593
1580- defp zero_pad ( val , count ) when val >= 0 do
1594+ defp zero_pad ( val , count ) when val >= 0 and count <= 6 do
15811595 num = Integer . to_string ( val )
15821596
15831597 case max ( count - byte_size ( num ) , 0 ) do
@@ -1587,7 +1601,6 @@ defmodule Calendar.ISO do
15871601 3 -> [ "000" , num ]
15881602 4 -> [ "0000" , num ]
15891603 5 -> [ "00000" , num ]
1590- 6 -> [ "000000" , num ]
15911604 end
15921605 end
15931606
0 commit comments