Packages
localize
0.38.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.41.3
0.41.2
0.41.1
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.1
0.30.0
retired
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
0.1.0-alpha.1
Localization (parsing, formatting) of numbers, dates/time/calendar, units of measure, messages and lists. Includes localized collation.
Current section
Files
Jump to
Current section
Files
lib/localize/number/string.ex
defmodule Localize.Number.String do
@moduledoc false
# String utilities for number formatting.
# Provides padding, chunking, and character classification
# functions used by the number formatters.
# # latin1/0
# Returns a regex matching all Latin-1 characters.
@latin1 "([\\x00-\\x7F])"
def latin1, do: ~r/#{@latin1}/
# # not_latin1/0
# Returns a regex matching all non-Latin-1 characters.
@not_latin1 "([^\\x00-\\x7F])"
def not_latin1, do: ~r/#{@not_latin1}/
# # hex_string/1
# Converts a string to hex escape representation.
#
# ### Arguments
# * `string` is any string.
#
# ### Returns
# * A string of hex escape sequences.
def hex_string(string) do
String.to_charlist(string)
|> Enum.map(&("\\x" <> Integer.to_string(&1)))
|> Enum.join()
end
# # pad_leading_zeros/2
# Pads a number string with leading "0"s to the specified length.
#
# ### Arguments
# * `number_string` is a string representation of a number.
# * `count` is the final length required.
#
# ### Returns
# * The padded string.
@spec pad_leading_zeros(String.t(), integer()) :: String.t()
def pad_leading_zeros(number_string, count) when count <= 0 do
number_string
end
def pad_leading_zeros(number_string, count) do
:binary.copy("0", count - byte_size(number_string)) <> number_string
end
# # pad_trailing_zeros/2
# Pads a number string with trailing "0"s to the specified length.
#
# ### Arguments
# * `number_string` is a string representation of a number.
# * `count` is the final length required.
#
# ### Returns
# * The padded string.
@spec pad_trailing_zeros(String.t(), integer()) :: String.t()
def pad_trailing_zeros(number_string, count) when count <= 0 do
number_string
end
def pad_trailing_zeros(number_string, count) do
number_string <> :binary.copy("0", count - byte_size(number_string))
end
# # chunk_string/3
# Splits a string into fixed-size chunks.
#
# ### Arguments
# * `string` is the string to split.
# * `size` is the chunk size.
# * `direction` is `:forward` (default) or `:reverse`.
#
# ### Returns
# * A list of string chunks.
#
# ### Examples
# iex> Localize.Number.String.chunk_string("This is a string", 3)
# ["Thi", "s i", "s a", " st", "rin", "g"]
#
# iex> Localize.Number.String.chunk_string("1234", 3, :reverse)
# ["1", "234"]
@spec chunk_string(String.t(), integer(), :forward | :reverse) :: [String.t()]
def chunk_string(string, size, direction \\ :forward)
def chunk_string(string, 0, _direction), do: [string]
def chunk_string("", _size, _direction), do: [""]
def chunk_string(string, size, :forward) do
string
|> String.to_charlist()
|> Enum.chunk_every(size, size, [])
|> Enum.map(&List.to_string/1)
end
def chunk_string(string, size, :reverse) do
length = String.length(string)
remainder = rem(length, size)
if remainder > 0 do
{head, last} = String.split_at(string, remainder)
[head | do_chunk_string(last, size)]
else
do_chunk_string(string, size)
end
end
defp do_chunk_string("", _size), do: []
defp do_chunk_string(string, size) do
{chunk, rest} = String.split_at(string, size)
[chunk | do_chunk_string(rest, size)]
end
end