Created
May 31, 2017 13:54
-
-
Save leandro/25441cfe2297b25a2c9dbbc4ec49c834 to your computer and use it in GitHub Desktop.
Brazilian cardinality in ruby
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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