module Billing class EuroAmount class Error < StandardError; end def self.to_cents(value) raw = value.to_s.strip raise Error, "Indica l'importo in euro" if raw.blank? normalized = raw.gsub(/\s+/, "") if normalized.match?(/\A\d{1,3}(\.\d{3})*,\d{1,2}\z/) normalized = normalized.gsub(".", "").tr(",", ".") elsif normalized.match?(/\A\d+,\d{1,2}\z/) normalized = normalized.tr(",", ".") elsif normalized.match?(/\A\d{1,3}(,\d{3})*\.\d{1,2}\z/) normalized = normalized.gsub(",", "") end raise Error, "Importo non valido" unless normalized.match?(/\A\d+(\.\d{1,2})?\z/) cents = (BigDecimal(normalized) * 100).round raise Error, "L'importo deve essere maggiore di zero" unless cents.positive? cents.to_i end end end