在 Phoenix Framework 中为整数添加定界符
Add a delimiter to an integer in Phoenix Framework
所以假设我有一个像 123456789
这样的数字,我想将它转换为字符串并将其显示为 123,456,789
或 123 456 789
等。最好的方法是什么这样做?
我认为没有内置方法。对于一般格式,您可以使用 :io.format/2
以下是一种方法:
123456789
|> Integer.to_char_list
|> Enum.reverse
|> Enum.chunk_every(3)
|> Enum.join(",")
|> String.reverse
# "123,456,789"
编辑:这是一个也适用于小数的解决方案。它可以选择允许设置自定义分隔符:
defmodule Formatter do
@doc """
## Examples
iex> Formatter.format_number(1)
"1"
iex> Formatter.format_number(123)
"123"
iex> Formatter.format_number(1234)
"1,234"
iex> Formatter.format_number(123456789)
"123,456,789"
iex> Formatter.format_number(-123456789)
"-123,456,789"
iex> Formatter.format_number(12345.6789)
"12,345.6789"
iex> Formatter.format_number(-12345.6789)
"-12,345.6789"
iex> Formatter.format_number(123456789, thousands_separator: "")
"123456789"
iex> Formatter.format_number(-123456789, thousands_separator: "")
"-123456789"
iex> Formatter.format_number(12345.6789, thousands_separator: "")
"12345.6789"
iex> Formatter.format_number(-12345.6789, thousands_separator: "")
"-12345.6789"
iex> Formatter.format_number(123456789, decimal_separator: ",", thousands_separator: ".")
"123.456.789"
iex> Formatter.format_number(-123456789, decimal_separator: ",", thousands_separator: ".")
"-123.456.789"
iex> Formatter.format_number(12345.6789, decimal_separator: ",", thousands_separator: ".")
"12.345,6789"
iex> Formatter.format_number(-12345.6789, decimal_separator: ",", thousands_separator: ".")
"-12.345,6789"
"""
@regex ~r/(?<sign>-?)(?<int>\d+)(\.(?<frac>\d+))?/
def format_number(number, options \ []) do
thousands_separator = Keyword.get(options, :thousands_separator, ",")
parts = Regex.named_captures(@regex, to_string(number))
formatted_int =
parts["int"]
|> String.graphemes
|> Enum.reverse
|> Enum.chunk_every(3)
|> Enum.join(thousands_separator)
|> String.reverse
decimal_separator =
if parts["frac"] == "" do
""
else
Keyword.get(options, :decimal_separator, ".")
end
to_string [parts["sign"], formatted_int, decimal_separator, parts["frac"]]
end
end
所以假设我有一个像 123456789
这样的数字,我想将它转换为字符串并将其显示为 123,456,789
或 123 456 789
等。最好的方法是什么这样做?
我认为没有内置方法。对于一般格式,您可以使用 :io.format/2
以下是一种方法:
123456789
|> Integer.to_char_list
|> Enum.reverse
|> Enum.chunk_every(3)
|> Enum.join(",")
|> String.reverse
# "123,456,789"
编辑:这是一个也适用于小数的解决方案。它可以选择允许设置自定义分隔符:
defmodule Formatter do
@doc """
## Examples
iex> Formatter.format_number(1)
"1"
iex> Formatter.format_number(123)
"123"
iex> Formatter.format_number(1234)
"1,234"
iex> Formatter.format_number(123456789)
"123,456,789"
iex> Formatter.format_number(-123456789)
"-123,456,789"
iex> Formatter.format_number(12345.6789)
"12,345.6789"
iex> Formatter.format_number(-12345.6789)
"-12,345.6789"
iex> Formatter.format_number(123456789, thousands_separator: "")
"123456789"
iex> Formatter.format_number(-123456789, thousands_separator: "")
"-123456789"
iex> Formatter.format_number(12345.6789, thousands_separator: "")
"12345.6789"
iex> Formatter.format_number(-12345.6789, thousands_separator: "")
"-12345.6789"
iex> Formatter.format_number(123456789, decimal_separator: ",", thousands_separator: ".")
"123.456.789"
iex> Formatter.format_number(-123456789, decimal_separator: ",", thousands_separator: ".")
"-123.456.789"
iex> Formatter.format_number(12345.6789, decimal_separator: ",", thousands_separator: ".")
"12.345,6789"
iex> Formatter.format_number(-12345.6789, decimal_separator: ",", thousands_separator: ".")
"-12.345,6789"
"""
@regex ~r/(?<sign>-?)(?<int>\d+)(\.(?<frac>\d+))?/
def format_number(number, options \ []) do
thousands_separator = Keyword.get(options, :thousands_separator, ",")
parts = Regex.named_captures(@regex, to_string(number))
formatted_int =
parts["int"]
|> String.graphemes
|> Enum.reverse
|> Enum.chunk_every(3)
|> Enum.join(thousands_separator)
|> String.reverse
decimal_separator =
if parts["frac"] == "" do
""
else
Keyword.get(options, :decimal_separator, ".")
end
to_string [parts["sign"], formatted_int, decimal_separator, parts["frac"]]
end
end