You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(387): Conversão de Moeda Real para Texto (#525)
* feat(387): Adiciona método monetário 'convert_real_to_text'
* Atualiza o arquivo CHANGELOG.md
* Adiciona nota sobre o uso da lib num2words
* usa Union[str,None] para compatibilidade de versões anteriores do python
* fix readme arguments description
* Apply suggestions from code review
Co-authored-by: Camila Maia <cmaiacd@gmail.com>
* conserta pequenos typos, add mais testes e atualiza docs sobre limitacao de precisao de centavos para grandes valores
---------
Co-authored-by: Camila Maia <cmaiacd@gmail.com>
Copy file name to clipboardExpand all lines: README.md
+37Lines changed: 37 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -97,6 +97,7 @@ False
97
97
-[is_holiday](#is_holiday)
98
98
-[Monetário](#monetário)
99
99
-[format\_currency](#format_currency)
100
+
-[convert\_real\_to\_text](#convert_real_to_text)
100
101
101
102
## CPF
102
103
@@ -1254,6 +1255,42 @@ Exemplo:
1254
1255
None
1255
1256
```
1256
1257
1258
+
### convert_real_to_text
1259
+
1260
+
Converte um valor monetário em reais para sua representação por extenso. Esta função recebe um número decimal representando um valor monetário em reais e o converte para uma string com o valor escrito por extenso em português do Brasil. Ela trata tanto a parte inteira (reais) quanto a parte fracionária (centavos), respeitando a gramática correta para os casos de singular e plural, bem como casos especiais como zero e valores negativos.
1261
+
1262
+
Argumentos:
1263
+
- amount (decimal): O valor monetário a ser convertido por extenso.
1264
+
- A parte inteira representa os reais.
1265
+
- A parte decimal representa os centavos.
1266
+
- 2 casas decimais.
1267
+
1268
+
Retorna:
1269
+
- str: Uma string com o valor monetário escrito por extenso em português do Brasil.
1270
+
- Retorna "Zero reais" para o valor 0,00.
1271
+
- Retorna None se o valor for inválido ou absolutamente maior que 1 quatrilhão.
1272
+
- Trata valores negativos, adicionando "Menos" no início da string.
1273
+
1274
+
Limitações:
1275
+
- Esta função pode perder precisão em ±1 centavo para casos em que o valor absoluto
1276
+
ultrapasse trilhões devido a erros de arredondamento de ponto flutuante.
Copy file name to clipboardExpand all lines: README_EN.md
+39Lines changed: 39 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -97,6 +97,7 @@ False
97
97
-[is_holiday](#is_holiday)
98
98
-[Monetary](#monetary)
99
99
-[format_currency](#format_currency)
100
+
-[convert\_real\_to\_text](#convert_real_to_text)
100
101
101
102
## CPF
102
103
@@ -1257,6 +1258,44 @@ Example:
1257
1258
None
1258
1259
```
1259
1260
1261
+
### convert_real_to_text
1262
+
1263
+
Converts a given monetary value in Brazilian Reais to its textual representation. It takes a decimal number representing a monetary value in Reais and converts it to a string with the amount written out in Brazilian Portuguese. It handles both the integer part (Reais) and the fractional part (centavos), respecting the correct grammar for singular and plural cases, as well as special cases like zero and negative values.
1264
+
1265
+
Args:
1266
+
1267
+
- amount (decimal): The monetary value to be converted into text.
1268
+
- The integer part represents Reais.
1269
+
- The decimal part represents centavos.
1270
+
- 2 decimal places
1271
+
1272
+
Returns:
1273
+
1274
+
- str: A string with the monetary value written out in Brazilian Portuguese.
1275
+
- Returns "Zero reais" for a value of 0.00.
1276
+
- Returns None if the amount is invalid or absolutely greater than 1 quadrillion.
1277
+
- Handles negative values, adding "Menos" at the beginning of the string.
1278
+
1279
+
Limitations:
1280
+
- This function may lose precision by ±1 cent for cases where the absolute value
1281
+
is beyond trillions due to floating-point rounding errors.
convert_real_to_text(-1000000.00), "Menos um milhão de reais"
80
+
)
81
+
self.assertEqual(
82
+
convert_real_to_text(-2000000.50),
83
+
"Menos dois milhões de reais e cinquenta centavos",
84
+
)
85
+
86
+
# billions with cents
87
+
self.assertEqual(
88
+
convert_real_to_text(1000000000.01),
89
+
"Um bilhão de reais e um centavo",
90
+
)
91
+
self.assertEqual(
92
+
convert_real_to_text(1000000000.99),
93
+
"Um bilhão de reais e noventa e nove centavos",
94
+
)
95
+
96
+
self.assertEqual(
97
+
convert_real_to_text(999999999999.99),
98
+
"Novecentos e noventa e nove bilhões, novecentos e noventa e nove milhões, novecentos e noventa e nove mil, novecentos e noventa e nove reais e noventa e nove centavos",
99
+
)
100
+
101
+
# trillions with cents
102
+
self.assertEqual(
103
+
convert_real_to_text(1000000000000.01),
104
+
"Um trilhão de reais e um centavo",
105
+
)
106
+
self.assertEqual(
107
+
convert_real_to_text(1000000000000.99),
108
+
"Um trilhão de reais e noventa e nove centavos",
109
+
)
110
+
self.assertEqual(
111
+
convert_real_to_text(9999999999999.99),
112
+
"Nove trilhões, novecentos e noventa e nove bilhões, novecentos e noventa e nove milhões, novecentos e noventa e nove mil, novecentos e noventa e nove reais e noventa e nove centavos",
113
+
)
114
+
115
+
# 1 quadrillion
116
+
self.assertEqual(
117
+
convert_real_to_text(1000000000000000.00),
118
+
"Um quatrilhão de reais",
119
+
)
120
+
121
+
# Edge cases should return None
122
+
self.assertIsNone(
123
+
convert_real_to_text("invalid_value")
124
+
) # invalid value
125
+
self.assertIsNone(convert_real_to_text(None)) # None value
0 commit comments