Skip to content

Commit 9303f84

Browse files
committed
optimize_microseconds_conversion
1 parent 621cef0 commit 9303f84

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

lib/elixir/lib/calendar/iso.ex

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)