Skip to content

Instantly share code, notes, and snippets.

@leandro
Created May 31, 2017 13:54
Show Gist options
  • Save leandro/25441cfe2297b25a2c9dbbc4ec49c834 to your computer and use it in GitHub Desktop.
Save leandro/25441cfe2297b25a2c9dbbc4ec49c834 to your computer and use it in GitHub Desktop.
Brazilian cardinality in ruby
require 'brazilian_cardinal_number'
class BrazilianCardinalCurrency
class << self
def cardinal(value)
return 'grátis' if value.zero?
abs_value = value.abs
cents = abs_value.to_s.split('.')[1].to_s[0, 2].to_i
integer = abs_value.to_i
expression = raw_cardinal_expression(integer, cents)
expression << ' de real' if integer.zero?
expression << negative_wording(value, cents)
expression
end
private
def negative_wording(value, cents)
negative_word = value.negative? ? ' negativo' : ''
value = value.abs
negative_word << 's' if negative_word.present? && (value > 1 || cents > 1)
negative_word
end
def raw_cardinal_expression(integer, cents)
integer_expression = cardinal_currency_integer_part(integer)
cents_expression = cardinal_cents(cents)
[integer_expression, cents_expression].compact.join(' e ')
end
def cardinal_cents(cents)
return if cents.zero?
expression = BrazilianCardinalNumber.cardinal(cents)
currency_word = cents == 1 ? 'centavo' : 'centavos'
"#{expression} #{currency_word}"
end
def cardinal_currency_integer_part(value)
return if value.zero?
expression = BrazilianCardinalNumber.cardinal(value)
preposition = 'de ' if expression =~ /(ão|ões)$/
"#{expression} #{preposition}#{currency_word(value)}"
end
def currency_word(value)
value <= 1 ? 'real' : 'reais'
end
end
end
require 'spec_helper'
require 'brazilian_cardinal_currency'
RSpec.describe BrazilianCardinalCurrency do
subject { described_class }
context 'positive values' do
it { expect(subject.cardinal(0)).to eq('grátis') }
it { expect(subject.cardinal(0.01)).to eq('um centavo de real') }
it { expect(subject.cardinal(0.02)).to eq('dois centavos de real') }
it { expect(subject.cardinal(0.21)).to eq('vinte e um centavos de real') }
it { expect(subject.cardinal(1.00)).to eq('um real') }
it { expect(subject.cardinal(1)).to eq('um real') }
it { expect(subject.cardinal(1.01)).to eq('um real e um centavo') }
it { expect(subject.cardinal(1.02)).to eq('um real e dois centavos') }
it { expect(subject.cardinal(1_000_000.01)).to eq('um milhão de reais e um centavo') }
it { expect(subject.cardinal(2_000_000.01)).to eq('dois milhões de reais e um centavo') }
it { expect(subject.cardinal(2_000_200.01)).to eq('dois milhões e duzentos reais e um centavo') }
it { expect(subject.cardinal(1_000_000_000.01)).to eq('um bilhão de reais e um centavo') }
it { expect(subject.cardinal(1_000_000_000_000.01)).to eq('um trilhão de reais e um centavo') }
it do
expect(subject.cardinal(128_243.28)).to eq(
'cento e vinte e oito mil e duzentos e quarenta e três reais e vinte e oito centavos'
)
end
it do
expect(subject.cardinal(82_389.19)).to eq(
'oitenta e dois mil e trezentos e oitenta e nove reais e dezenove centavos'
)
end
it do
expect(subject.cardinal(2_347.28)).to eq(
'dois mil e trezentos e quarenta e sete reais e vinte e oito centavos'
)
end
it do
expect(subject.cardinal(92_372.86)).to eq(
'noventa e dois mil e trezentos e setenta e dois reais e oitenta e seis centavos'
)
end
end
context 'negative values' do
it { expect(subject.cardinal(-0)).to eq('grátis') }
it { expect(subject.cardinal(-0.01)).to eq('um centavo de real negativo') }
it { expect(subject.cardinal(-0.02)).to eq('dois centavos de real negativos') }
it { expect(subject.cardinal(-0.21)).to eq('vinte e um centavos de real negativos') }
it { expect(subject.cardinal(-1.00)).to eq('um real negativo') }
it { expect(subject.cardinal(-1)).to eq('um real negativo') }
it { expect(subject.cardinal(-1.01)).to eq('um real e um centavo negativos') }
it { expect(subject.cardinal(-1.02)).to eq('um real e dois centavos negativos') }
it { expect(subject.cardinal(-1_000_000.01)).to eq('um milhão de reais e um centavo negativos') }
it { expect(subject.cardinal(-2_000_000.01)).to eq('dois milhões de reais e um centavo negativos') }
it { expect(subject.cardinal(-2_000_200.01)).to eq('dois milhões e duzentos reais e um centavo negativos') }
it { expect(subject.cardinal(-1_000_000_000.01)).to eq('um bilhão de reais e um centavo negativos') }
it { expect(subject.cardinal(-1_000_000_000_000.01)).to eq('um trilhão de reais e um centavo negativos') }
it do
expect(subject.cardinal(-128_243.28)).to eq(
'cento e vinte e oito mil e duzentos e quarenta e três reais e vinte e oito centavos negativos'
)
end
it do
expect(subject.cardinal(-82_389.19)).to eq(
'oitenta e dois mil e trezentos e oitenta e nove reais e dezenove centavos negativos'
)
end
it do
expect(subject.cardinal(-2_347.28)).to eq(
'dois mil e trezentos e quarenta e sete reais e vinte e oito centavos negativos'
)
end
it do
expect(subject.cardinal(-92_372.86)).to eq(
'noventa e dois mil e trezentos e setenta e dois reais e oitenta e seis centavos negativos'
)
end
end
end
class BrazilianCardinalNumber
NumberTooBigError = Class.new(StandardError)
ONES = {
0 => 'zero',
1 => 'um',
2 => 'dois',
3 => 'três',
4 => 'quatro',
5 => 'cinco',
6 => 'seis',
7 => 'sete',
8 => 'oito',
9 => 'nove'
}.freeze
TENS = {
10 => 'dez',
11 => 'onze',
12 => 'doze',
13 => 'treze',
14 => 'quatorze',
15 => 'quinze',
16 => 'dezesseis',
17 => 'dezessete',
18 => 'dezoito',
19 => 'dezenove',
20 => 'vinte',
30 => 'trinta',
40 => 'quarenta',
50 => 'cinquenta',
60 => 'sessenta',
70 => 'setenta',
80 => 'oitenta',
90 => 'noventa'
}.freeze
HUNDREDS = {
100 => 'cento',
200 => 'duzentos',
300 => 'trezentos',
400 => 'quatrocentos',
500 => 'quinhentos',
600 => 'seiscentos',
700 => 'setecentos',
800 => 'oitocentos',
900 => 'novecentos'
}.freeze
class << self
def cardinal(number)
negative = number.negative? ? 'menos ' : ''
n = number.to_i.abs
expression = case n
when 0..999 then cardinal_for_0_up_to_999(n)
when 1000..999_999_999_999_999 then cardinal_for_thousands_to_trillions(n)
else raise NumberTooBigError, "#{n} is too big"
end
"#{negative}#{expression}"
end
private
def cardinal_for_0_up_to_999(number)
case number
when 0..9 then ONES[number]
when 10..19 then TENS[number]
when 20..99 then cardinal_for_tens_and_hundreds(number, 10)
when 100 then 'cem'
when 101..999 then cardinal_for_tens_and_hundreds(number, 100)
end
end
def cardinal_for_thousands_to_trillions(number)
case number
when 1000..999_999
cardinal_for_scale_of_thousands(number, 1_000, 'mil', 'mil')
when 1_000_000..999_999_999
cardinal_for_scale_of_thousands(number, 1_000_000, 'milhão', 'milhões')
when 1_000_000_000..999_999_999_999
cardinal_for_scale_of_thousands(number, 1_000_000_000, 'bilhão', 'bilhões')
when 1_000_000_000_000..999_999_999_999_999
cardinal_for_scale_of_thousands(number, 1_000_000_000_000, 'trilhão', 'trilhões')
end
end
def cardinal_for_tens_and_hundreds(number, scale)
remainder = number % scale
words_map = scale == 10 ? TENS : HUNDREDS
return words_map[number] if remainder.zero?
"#{words_map[number - remainder]} e #{cardinal(remainder)}"
end
def cardinal_for_scale_of_thousands(number, scale, singular, plural)
quocient = number / scale
remainder = number % scale
word = quocient > 1 ? plural : singular
high_order_units = "#{cardinal(quocient)} #{word}"
return high_order_units if remainder.zero?
"#{high_order_units} e #{cardinal(remainder)}"
end
end
end
require 'spec_helper'
require 'brazilian_cardinal_number'
RSpec.describe BrazilianCardinalNumber do
subject { described_class }
context 'units' do
it { expect(subject.cardinal(0)).to eq('zero') }
it { expect(subject.cardinal(1)).to eq('um') }
it { expect(subject.cardinal(2)).to eq('dois') }
it { expect(subject.cardinal(3)).to eq('três') }
it { expect(subject.cardinal(4)).to eq('quatro') }
it { expect(subject.cardinal(5)).to eq('cinco') }
it { expect(subject.cardinal(6)).to eq('seis') }
it { expect(subject.cardinal(7)).to eq('sete') }
it { expect(subject.cardinal(8)).to eq('oito') }
it { expect(subject.cardinal(9)).to eq('nove') }
end
context 'tens' do
it { expect(subject.cardinal(10)).to eq('dez') }
it { expect(subject.cardinal(11)).to eq('onze') }
it { expect(subject.cardinal(12)).to eq('doze') }
it { expect(subject.cardinal(13)).to eq('treze') }
it { expect(subject.cardinal(14)).to eq('quatorze') }
it { expect(subject.cardinal(15)).to eq('quinze') }
it { expect(subject.cardinal(16)).to eq('dezesseis') }
it { expect(subject.cardinal(17)).to eq('dezessete') }
it { expect(subject.cardinal(18)).to eq('dezoito') }
it { expect(subject.cardinal(19)).to eq('dezenove') }
it { expect(subject.cardinal(20)).to eq('vinte') }
it { expect(subject.cardinal(30)).to eq('trinta') }
it { expect(subject.cardinal(40)).to eq('quarenta') }
it { expect(subject.cardinal(50)).to eq('cinquenta') }
it { expect(subject.cardinal(60)).to eq('sessenta') }
it { expect(subject.cardinal(70)).to eq('setenta') }
it { expect(subject.cardinal(80)).to eq('oitenta') }
it { expect(subject.cardinal(90)).to eq('noventa') }
end
context 'tens with units' do
it { expect(subject.cardinal(21)).to eq('vinte e um') }
it { expect(subject.cardinal(32)).to eq('trinta e dois') }
it { expect(subject.cardinal(43)).to eq('quarenta e três') }
it { expect(subject.cardinal(54)).to eq('cinquenta e quatro') }
it { expect(subject.cardinal(65)).to eq('sessenta e cinco') }
it { expect(subject.cardinal(76)).to eq('setenta e seis') }
it { expect(subject.cardinal(87)).to eq('oitenta e sete') }
it { expect(subject.cardinal(98)).to eq('noventa e oito') }
end
context 'hundreds' do
it { expect(subject.cardinal(100)).to eq('cem') }
it { expect(subject.cardinal(200)).to eq('duzentos') }
it { expect(subject.cardinal(300)).to eq('trezentos') }
it { expect(subject.cardinal(400)).to eq('quatrocentos') }
it { expect(subject.cardinal(500)).to eq('quinhentos') }
it { expect(subject.cardinal(600)).to eq('seiscentos') }
it { expect(subject.cardinal(700)).to eq('setecentos') }
it { expect(subject.cardinal(800)).to eq('oitocentos') }
it { expect(subject.cardinal(900)).to eq('novecentos') }
end
context 'hundreds with tens and units' do
it { expect(subject.cardinal(101)).to eq('cento e um') }
it { expect(subject.cardinal(110)).to eq('cento e dez') }
it { expect(subject.cardinal(111)).to eq('cento e onze') }
it { expect(subject.cardinal(202)).to eq('duzentos e dois') }
it { expect(subject.cardinal(220)).to eq('duzentos e vinte') }
it { expect(subject.cardinal(222)).to eq('duzentos e vinte e dois') }
it { expect(subject.cardinal(303)).to eq('trezentos e três') }
it { expect(subject.cardinal(330)).to eq('trezentos e trinta') }
it { expect(subject.cardinal(333)).to eq('trezentos e trinta e três') }
it { expect(subject.cardinal(404)).to eq('quatrocentos e quatro') }
it { expect(subject.cardinal(440)).to eq('quatrocentos e quarenta') }
it { expect(subject.cardinal(444)).to eq('quatrocentos e quarenta e quatro') }
it { expect(subject.cardinal(505)).to eq('quinhentos e cinco') }
it { expect(subject.cardinal(550)).to eq('quinhentos e cinquenta') }
it { expect(subject.cardinal(555)).to eq('quinhentos e cinquenta e cinco') }
it { expect(subject.cardinal(606)).to eq('seiscentos e seis') }
it { expect(subject.cardinal(660)).to eq('seiscentos e sessenta') }
it { expect(subject.cardinal(666)).to eq('seiscentos e sessenta e seis') }
it { expect(subject.cardinal(707)).to eq('setecentos e sete') }
it { expect(subject.cardinal(770)).to eq('setecentos e setenta') }
it { expect(subject.cardinal(777)).to eq('setecentos e setenta e sete') }
it { expect(subject.cardinal(808)).to eq('oitocentos e oito') }
it { expect(subject.cardinal(880)).to eq('oitocentos e oitenta') }
it { expect(subject.cardinal(888)).to eq('oitocentos e oitenta e oito') }
it { expect(subject.cardinal(909)).to eq('novecentos e nove') }
it { expect(subject.cardinal(990)).to eq('novecentos e noventa') }
it { expect(subject.cardinal(999)).to eq('novecentos e noventa e nove') }
end
context 'thousands' do
it { expect(subject.cardinal(1_000)).to eq('um mil') }
it { expect(subject.cardinal(1_001)).to eq('um mil e um') }
it { expect(subject.cardinal(1_010)).to eq('um mil e dez') }
it { expect(subject.cardinal(1_011)).to eq('um mil e onze') }
it { expect(subject.cardinal(1_100)).to eq('um mil e cem') }
it { expect(subject.cardinal(1_101)).to eq('um mil e cento e um') }
it { expect(subject.cardinal(1_110)).to eq('um mil e cento e dez') }
it { expect(subject.cardinal(1_111)).to eq('um mil e cento e onze') }
it { expect(subject.cardinal(10_000)).to eq('dez mil') }
it { expect(subject.cardinal(100_000)).to eq('cem mil') }
it { expect(subject.cardinal(110_000)).to eq('cento e dez mil') }
end
context 'millions' do
it { expect(subject.cardinal(1_000_000)).to eq('um milhão') }
it { expect(subject.cardinal(1_001_001)).to eq('um milhão e um mil e um') }
it { expect(subject.cardinal(1_010_010)).to eq('um milhão e dez mil e dez') }
it { expect(subject.cardinal(1_011_011)).to eq('um milhão e onze mil e onze') }
it { expect(subject.cardinal(1_100_100)).to eq('um milhão e cem mil e cem') }
it { expect(subject.cardinal(1_101_101)).to eq('um milhão e cento e um mil e cento e um') }
it { expect(subject.cardinal(1_110_110)).to eq('um milhão e cento e dez mil e cento e dez') }
it { expect(subject.cardinal(1_111_111)).to eq('um milhão e cento e onze mil e cento e onze') }
it { expect(subject.cardinal(10_000_000)).to eq('dez milhões') }
it { expect(subject.cardinal(100_000_000)).to eq('cem milhões') }
it { expect(subject.cardinal(110_000_000)).to eq('cento e dez milhões') }
end
context 'billions' do
it { expect(subject.cardinal(1_000_000_000)).to eq('um bilhão') }
it { expect(subject.cardinal(1_001_001_001)).to eq('um bilhão e um milhão e um mil e um') }
it { expect(subject.cardinal(1_010_010_010)).to eq('um bilhão e dez milhões e dez mil e dez') }
it { expect(subject.cardinal(1_011_011_011)).to eq('um bilhão e onze milhões e onze mil e onze') }
it { expect(subject.cardinal(1_100_100_100)).to eq('um bilhão e cem milhões e cem mil e cem') }
it { expect(subject.cardinal(1_101_101_101)).to eq('um bilhão e cento e um milhões e cento e um mil e cento e um') }
it do
expect(subject.cardinal(1_110_110_110)).to eq(
'um bilhão e cento e dez milhões e cento e dez mil e cento e dez'
)
end
it do
expect(subject.cardinal(1_111_111_111)).to eq(
'um bilhão e cento e onze milhões e cento e onze mil e cento e onze'
)
end
it { expect(subject.cardinal(10_000_000_000)).to eq('dez bilhões') }
it { expect(subject.cardinal(100_000_000_000)).to eq('cem bilhões') }
it { expect(subject.cardinal(110_000_000_000)).to eq('cento e dez bilhões') }
end
context 'trillions' do
it { expect(subject.cardinal(1_000_000_000_000)).to eq('um trilhão') }
it { expect(subject.cardinal(1_001_001_001_001)).to eq('um trilhão e um bilhão e um milhão e um mil e um') }
it { expect(subject.cardinal(1_010_010_010_010)).to eq('um trilhão e dez bilhões e dez milhões e dez mil e dez') }
it do
expect(subject.cardinal(1_011_011_011_011)).to eq(
'um trilhão e onze bilhões e onze milhões e onze mil e onze'
)
end
it { expect(subject.cardinal(1_100_100_100_100)).to eq('um trilhão e cem bilhões e cem milhões e cem mil e cem') }
it do
expect(subject.cardinal(1_101_101_101_101)).to eq(
'um trilhão e cento e um bilhões e cento e um milhões e cento e um mil e cento e um'
)
end
it do
expect(subject.cardinal(1_110_110_110_110)).to eq(
'um trilhão e cento e dez bilhões e cento e dez milhões e cento e dez mil e cento e dez'
)
end
it do
expect(subject.cardinal(1_111_111_111_111)).to eq(
'um trilhão e cento e onze bilhões e cento e onze milhões e cento e onze mil e cento e onze'
)
end
it { expect(subject.cardinal(10_000_000_000_000)).to eq('dez trilhões') }
it { expect(subject.cardinal(100_000_000_000_000)).to eq('cem trilhões') }
it { expect(subject.cardinal(110_000_000_000_000)).to eq('cento e dez trilhões') }
end
context 'negative units' do
it { expect(subject.cardinal(-0)).to eq('zero') }
it { expect(subject.cardinal(-1)).to eq('menos um') }
it { expect(subject.cardinal(-2)).to eq('menos dois') }
it { expect(subject.cardinal(-3)).to eq('menos três') }
it { expect(subject.cardinal(-4)).to eq('menos quatro') }
it { expect(subject.cardinal(-5)).to eq('menos cinco') }
it { expect(subject.cardinal(-6)).to eq('menos seis') }
it { expect(subject.cardinal(-7)).to eq('menos sete') }
it { expect(subject.cardinal(-8)).to eq('menos oito') }
it { expect(subject.cardinal(-9)).to eq('menos nove') }
end
context 'negative tens' do
it { expect(subject.cardinal(-10)).to eq('menos dez') }
it { expect(subject.cardinal(-11)).to eq('menos onze') }
it { expect(subject.cardinal(-12)).to eq('menos doze') }
it { expect(subject.cardinal(-13)).to eq('menos treze') }
it { expect(subject.cardinal(-14)).to eq('menos quatorze') }
it { expect(subject.cardinal(-15)).to eq('menos quinze') }
it { expect(subject.cardinal(-16)).to eq('menos dezesseis') }
it { expect(subject.cardinal(-17)).to eq('menos dezessete') }
it { expect(subject.cardinal(-18)).to eq('menos dezoito') }
it { expect(subject.cardinal(-19)).to eq('menos dezenove') }
it { expect(subject.cardinal(-20)).to eq('menos vinte') }
it { expect(subject.cardinal(-30)).to eq('menos trinta') }
it { expect(subject.cardinal(-40)).to eq('menos quarenta') }
it { expect(subject.cardinal(-50)).to eq('menos cinquenta') }
it { expect(subject.cardinal(-60)).to eq('menos sessenta') }
it { expect(subject.cardinal(-70)).to eq('menos setenta') }
it { expect(subject.cardinal(-80)).to eq('menos oitenta') }
end
context 'negative tens with units' do
it { expect(subject.cardinal(-21)).to eq('menos vinte e um') }
it { expect(subject.cardinal(-32)).to eq('menos trinta e dois') }
it { expect(subject.cardinal(-43)).to eq('menos quarenta e três') }
it { expect(subject.cardinal(-54)).to eq('menos cinquenta e quatro') }
it { expect(subject.cardinal(-65)).to eq('menos sessenta e cinco') }
it { expect(subject.cardinal(-76)).to eq('menos setenta e seis') }
it { expect(subject.cardinal(-87)).to eq('menos oitenta e sete') }
it { expect(subject.cardinal(-98)).to eq('menos noventa e oito') }
end
context 'negative hundreds' do
it { expect(subject.cardinal(-100)).to eq('menos cem') }
it { expect(subject.cardinal(-200)).to eq('menos duzentos') }
it { expect(subject.cardinal(-300)).to eq('menos trezentos') }
it { expect(subject.cardinal(-400)).to eq('menos quatrocentos') }
it { expect(subject.cardinal(-500)).to eq('menos quinhentos') }
it { expect(subject.cardinal(-600)).to eq('menos seiscentos') }
it { expect(subject.cardinal(-700)).to eq('menos setecentos') }
it { expect(subject.cardinal(-800)).to eq('menos oitocentos') }
it { expect(subject.cardinal(-900)).to eq('menos novecentos') }
end
context 'negative hundreds with tens and units' do
it { expect(subject.cardinal(-101)).to eq('menos cento e um') }
it { expect(subject.cardinal(-110)).to eq('menos cento e dez') }
it { expect(subject.cardinal(-111)).to eq('menos cento e onze') }
it { expect(subject.cardinal(-202)).to eq('menos duzentos e dois') }
it { expect(subject.cardinal(-220)).to eq('menos duzentos e vinte') }
it { expect(subject.cardinal(-222)).to eq('menos duzentos e vinte e dois') }
it { expect(subject.cardinal(-303)).to eq('menos trezentos e três') }
it { expect(subject.cardinal(-330)).to eq('menos trezentos e trinta') }
it { expect(subject.cardinal(-333)).to eq('menos trezentos e trinta e três') }
it { expect(subject.cardinal(-404)).to eq('menos quatrocentos e quatro') }
it { expect(subject.cardinal(-440)).to eq('menos quatrocentos e quarenta') }
it { expect(subject.cardinal(-444)).to eq('menos quatrocentos e quarenta e quatro') }
it { expect(subject.cardinal(-505)).to eq('menos quinhentos e cinco') }
it { expect(subject.cardinal(-550)).to eq('menos quinhentos e cinquenta') }
it { expect(subject.cardinal(-555)).to eq('menos quinhentos e cinquenta e cinco') }
it { expect(subject.cardinal(-606)).to eq('menos seiscentos e seis') }
it { expect(subject.cardinal(-660)).to eq('menos seiscentos e sessenta') }
it { expect(subject.cardinal(-666)).to eq('menos seiscentos e sessenta e seis') }
it { expect(subject.cardinal(-707)).to eq('menos setecentos e sete') }
it { expect(subject.cardinal(-770)).to eq('menos setecentos e setenta') }
it { expect(subject.cardinal(-777)).to eq('menos setecentos e setenta e sete') }
it { expect(subject.cardinal(-808)).to eq('menos oitocentos e oito') }
it { expect(subject.cardinal(-880)).to eq('menos oitocentos e oitenta') }
it { expect(subject.cardinal(-888)).to eq('menos oitocentos e oitenta e oito') }
it { expect(subject.cardinal(-909)).to eq('menos novecentos e nove') }
it { expect(subject.cardinal(-990)).to eq('menos novecentos e noventa') }
it { expect(subject.cardinal(-999)).to eq('menos novecentos e noventa e nove') }
end
context 'negative thousands' do
it { expect(subject.cardinal(-1_000)).to eq('menos um mil') }
it { expect(subject.cardinal(-1_001)).to eq('menos um mil e um') }
it { expect(subject.cardinal(-1_010)).to eq('menos um mil e dez') }
it { expect(subject.cardinal(-1_011)).to eq('menos um mil e onze') }
it { expect(subject.cardinal(-1_100)).to eq('menos um mil e cem') }
it { expect(subject.cardinal(-1_101)).to eq('menos um mil e cento e um') }
it { expect(subject.cardinal(-1_110)).to eq('menos um mil e cento e dez') }
it { expect(subject.cardinal(-1_111)).to eq('menos um mil e cento e onze') }
it { expect(subject.cardinal(-10_000)).to eq('menos dez mil') }
it { expect(subject.cardinal(-100_000)).to eq('menos cem mil') }
it { expect(subject.cardinal(-110_000)).to eq('menos cento e dez mil') }
end
context 'negative millions' do
it { expect(subject.cardinal(-1_000_000)).to eq('menos um milhão') }
it { expect(subject.cardinal(-1_001_001)).to eq('menos um milhão e um mil e um') }
it { expect(subject.cardinal(-1_010_010)).to eq('menos um milhão e dez mil e dez') }
it { expect(subject.cardinal(-1_011_011)).to eq('menos um milhão e onze mil e onze') }
it { expect(subject.cardinal(-1_100_100)).to eq('menos um milhão e cem mil e cem') }
it { expect(subject.cardinal(-1_101_101)).to eq('menos um milhão e cento e um mil e cento e um') }
it { expect(subject.cardinal(-1_110_110)).to eq('menos um milhão e cento e dez mil e cento e dez') }
it { expect(subject.cardinal(-1_111_111)).to eq('menos um milhão e cento e onze mil e cento e onze') }
it { expect(subject.cardinal(-10_000_000)).to eq('menos dez milhões') }
it { expect(subject.cardinal(-100_000_000)).to eq('menos cem milhões') }
it { expect(subject.cardinal(-110_000_000)).to eq('menos cento e dez milhões') }
end
context 'negative billions' do
it { expect(subject.cardinal(-1_000_000_000)).to eq('menos um bilhão') }
it { expect(subject.cardinal(-1_001_001_001)).to eq('menos um bilhão e um milhão e um mil e um') }
it { expect(subject.cardinal(-1_010_010_010)).to eq('menos um bilhão e dez milhões e dez mil e dez') }
it { expect(subject.cardinal(-1_011_011_011)).to eq('menos um bilhão e onze milhões e onze mil e onze') }
it { expect(subject.cardinal(-1_100_100_100)).to eq('menos um bilhão e cem milhões e cem mil e cem') }
it do
expect(subject.cardinal(-1_101_101_101)).to eq(
'menos um bilhão e cento e um milhões e cento e um mil e cento e um'
)
end
it do
expect(subject.cardinal(-1_110_110_110)).to eq(
'menos um bilhão e cento e dez milhões e cento e dez mil e cento e dez'
)
end
it do
expect(subject.cardinal(-1_111_111_111)).to eq(
'menos um bilhão e cento e onze milhões e cento e onze mil e cento e onze'
)
end
it { expect(subject.cardinal(-10_000_000_000)).to eq('menos dez bilhões') }
it { expect(subject.cardinal(-100_000_000_000)).to eq('menos cem bilhões') }
it { expect(subject.cardinal(-110_000_000_000)).to eq('menos cento e dez bilhões') }
end
context 'negative trillions' do
it { expect(subject.cardinal(-1_000_000_000_000)).to eq('menos um trilhão') }
it { expect(subject.cardinal(-1_001_001_001_001)).to eq('menos um trilhão e um bilhão e um milhão e um mil e um') }
it do
expect(subject.cardinal(-1_010_010_010_010)).to eq(
'menos um trilhão e dez bilhões e dez milhões e dez mil e dez'
)
end
it do
expect(subject.cardinal(-1_011_011_011_011)).to eq(
'menos um trilhão e onze bilhões e onze milhões e onze mil e onze'
)
end
it do
expect(subject.cardinal(-1_100_100_100_100)).to eq(
'menos um trilhão e cem bilhões e cem milhões e cem mil e cem'
)
end
it do
expect(subject.cardinal(-1_101_101_101_101)).to eq(
'menos um trilhão e cento e um bilhões e cento e um milhões e cento e um mil e cento e um'
)
end
it do
expect(subject.cardinal(-1_110_110_110_110)).to eq(
'menos um trilhão e cento e dez bilhões e cento e dez milhões e cento e dez mil e cento e dez'
)
end
it do
expect(subject.cardinal(-1_111_111_111_111)).to eq(
'menos um trilhão e cento e onze bilhões e cento e onze milhões e cento e onze mil e cento e onze'
)
end
it { expect(subject.cardinal(-10_000_000_000_000)).to eq('menos dez trilhões') }
it { expect(subject.cardinal(-100_000_000_000_000)).to eq('menos cem trilhões') }
it { expect(subject.cardinal(-110_000_000_000_000)).to eq('menos cento e dez trilhões') }
end
context 'when number has a scale bigger than trillion' do
it { expect { subject.cardinal(1_000_000_000_000_000) }.to raise_error(BrazilianCardinalNumber::NumberTooBigError) }
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment