数値を取得して、価格として(文字列として)フォーマットしたいと思います。たとえば、250000を取り、$250,000を表示したいとします。正規表現を使用してこれを達成するにはどうすればよいですか?
4 に答える
カンマを追加するには、次のようなものを試してみてください。
/(\d)(?=(?:\d{3})+$)/
次に、すべての一致を。に置き換え\1,
ます。
そのような:
"12345512312".gsub(/(\d)(?=(?:\d{3})+$)/,'\1,') => "12,345,512,312"
これは、任意の数字の後に任意の数の3桁のグループが続く場合に一致します。
たとえば、上記の例の最初のグループの後には、、、および2
の3つのグループが続きます。最初のグループの後には、となどの2つのグループが続きます。345
512
312
5
512
312
$
ただし、同じ正規表現にを追加できるかどうかはわかりません。
これを試してみてください(免責事項-正規表現ではありません):
def prettify(n)
int, dec = n.to_s.split('.')
int = int.reverse.scan(/.{1,3}/).join(',').reverse
[int, dec].reject(&:empty?).join('.')
end
おそらくこの種のもののための宝石がそこにあります
正規表現とのマッチングは#@の苦痛です!この場合、正規表現エンジンは文字列の終わりではなく最初から照合を開始するためです(文字列の終わりから始まり、逆方向に進む3桁のパターンを検索します)。私は次のようなことをすることをお勧めします:
format_int = ->(s) do
str = s.reverse.scan(/\d{1,3}/).join(',').reverse
"$#{str}"
end
format_int['2500600'] => "$2,500,600"
...使用するKernel#sprintf
(これは少し注意が必要な場合があります)または、必要に応じて:私は間違っていましたが、こことここに示すように正規表現で実現できます。
を使用する必要がありますnumber_to_currency helper
number_to_currency(1234567890.50) # => $1,234,567,890.50
number_to_currency(1234567890.506) # => $1,234,567,890.51
number_to_currency(1234567890.506, precision: 3) # => $1,234,567,890.506
number_to_currency(1234567890.506, locale: :fr) # => 1 234 567 890,51 €
number_to_currency("123a456") # => $123a456
number_to_currency("123a456", raise: true) # => InvalidNumberError
number_to_currency(-1234567890.50, negative_format: "(%u%n)")
# => ($1,234,567,890.50)
number_to_currency(1234567890.50, unit: "£", separator: ",", delimiter: "")
# => £1234567890,50
number_to_currency(1234567890.50, unit: "£", separator: ",", delimiter: "", format: "%n %u")
# => 1234567890,50 £
詳細については、http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.htmlを参照してください。