Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed

- `format_voter_id` [#742](https://github.com/brazilian-utils/python/pull/742)

## [2.4.0] - 2026-04-20

### Added
Expand Down
15 changes: 14 additions & 1 deletion brutils/voter_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,24 @@ def format_voter_id(voter_id: str) -> str | None:
'6908 4709 28 28'
>>> format_voter_id("163204010922")
'1632 0401 09 22'
>>> format_voter_id("3244567800167")
'32445 6780 01 67'
"""

if not is_valid(voter_id):
return None

# The sequential number has 8 digits, except for the SP and MG edge case,
# where it can have 9 digits (making the voter id 13 digits long). The
# federative union and verifying digits are always the last 4 digits.
sequential_number = voter_id[:-4]
federative_union = _get_federative_union(voter_id)
verifying_digits = _get_verifying_digits(voter_id)

split = len(sequential_number) - 4
return "{} {} {} {}".format(
voter_id[:4], voter_id[4:8], voter_id[8:10], voter_id[10:12]
sequential_number[:split],
sequential_number[split:],
federative_union,
verifying_digits,
)
10 changes: 10 additions & 0 deletions tests/test_voter_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,16 @@ def test_format_voter_id(self):
self.assertIsNone(format_voter_id("000000000000"))
self.assertIsNone(format_voter_id("800911840197"))

def test_format_voter_id_special_case(self):
# SP & MG voter ids can have a 9-digit sequential number, making the
# voter id 13 digits long. Formatting must keep every digit and place
# the federative union and verifying digits correctly.
voter_id = "3244567800167"
self.assertIs(is_valid(voter_id), True)
formatted = format_voter_id(voter_id)
self.assertEqual(formatted, "32445 6780 01 67")
self.assertEqual(formatted.replace(" ", ""), voter_id)


if __name__ == "__main__":
main()
Loading