Skip to content

Commit 9190d01

Browse files
Fix French decimal separator and apply it to naturalsize (#51)
1 parent c3a124c commit 9190d01

3 files changed

Lines changed: 36 additions & 34 deletions

File tree

src/humanize/filesize.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from math import log
88

99
from humanize.i18n import _gettext as _
10+
from humanize.i18n import decimal_separator
1011

1112
suffixes = {
1213
"decimal": (
@@ -106,5 +107,6 @@ def naturalsize(
106107
if exp < len(suffix) and abs(float(format % (abs_bytes / (base**exp)))) >= base:
107108
exp += 1
108109
space = "" if gnu else " "
109-
ret: str = format % (bytes_ / (base**exp)) + space + _(suffix[exp - 1])
110+
number = (format % (bytes_ / (base**exp))).replace(".", decimal_separator())
111+
ret: str = number + space + _(suffix[exp - 1])
110112
return ret

src/humanize/i18n.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
# Mapping of locale to decimal separator
3232
_DECIMAL_SEPARATOR: dict[str | None, str] = {
3333
"de_DE": ",",
34-
"fr_FR": ".",
34+
"fr_FR": ",",
3535
"it_IT": ",",
3636
"pt_BR": ",",
3737
"hu_HU": ",",

tests/test_i18n.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ def test_intcomma() -> None:
5959

6060
humanize.i18n.activate("fr_FR")
6161
assert humanize.intcomma(number) == "10 000 000"
62-
assert humanize.intcomma(1_234_567.89) == "1 234 567.89"
63-
assert humanize.intcomma("1 234 567.89") == "1 234 567.89"
62+
assert humanize.intcomma(1_234_567.89) == "1 234 567,89"
63+
assert humanize.intcomma("1 234 567,89") == "1 234 567,89"
6464

6565
humanize.i18n.activate("pt_BR")
6666
assert humanize.intcomma(number) == "10.000.000"
@@ -117,46 +117,46 @@ def test_naturaldelta() -> None:
117117
("lv", 2_000_000, "2,0 miljoni"),
118118
("lv", 11_000_000, "11,0 miljoni"),
119119
("lv", 21_000_000, "21,0 miljons"),
120-
("fr_FR", "1_000", "1.0 mille"),
121-
("fr_FR", "12_400", "12.4 milles"),
122-
("fr_FR", "12_490", "12.5 milles"),
123-
("fr_FR", "1_000_000", "1.0 million"),
124-
("fr_FR", "-1_000_000", "-1.0 million"),
125-
("fr_FR", "1_200_000", "1.2 millions"),
126-
("fr_FR", "1_290_000", "1.3 millions"),
127-
("fr_FR", "999_999_999", "1.0 milliard"),
128-
("fr_FR", "1_000_000_000", "1.0 milliard"),
129-
("fr_FR", "-1_000_000_000", "-1.0 milliard"),
130-
("fr_FR", "2_000_000_000", "2.0 milliards"),
131-
("fr_FR", "999_999_999_999", "1.0 billion"),
132-
("fr_FR", "1_000_000_000_000", "1.0 billion"),
133-
("fr_FR", "6_000_000_000_000", "6.0 billions"),
134-
("fr_FR", "-6_000_000_000_000", "-6.0 billions"),
135-
("fr_FR", "999_999_999_999_999", "1.0 billiard"),
136-
("fr_FR", "1_000_000_000_000_000", "1.0 billiard"),
137-
("fr_FR", "1_300_000_000_000_000", "1.3 billiards"),
138-
("fr_FR", "-1_300_000_000_000_000", "-1.3 billiards"),
139-
("fr_FR", "3_500_000_000_000_000_000_000", "3.5 trilliards"),
140-
("fr_FR", "8_100_000_000_000_000_000_000_000_000_000_000", "8.1 quintilliards"),
120+
("fr_FR", "1_000", "1,0 mille"),
121+
("fr_FR", "12_400", "12,4 milles"),
122+
("fr_FR", "12_490", "12,5 milles"),
123+
("fr_FR", "1_000_000", "1,0 million"),
124+
("fr_FR", "-1_000_000", "-1,0 million"),
125+
("fr_FR", "1_200_000", "1,2 millions"),
126+
("fr_FR", "1_290_000", "1,3 millions"),
127+
("fr_FR", "999_999_999", "1,0 milliard"),
128+
("fr_FR", "1_000_000_000", "1,0 milliard"),
129+
("fr_FR", "-1_000_000_000", "-1,0 milliard"),
130+
("fr_FR", "2_000_000_000", "2,0 milliards"),
131+
("fr_FR", "999_999_999_999", "1,0 billion"),
132+
("fr_FR", "1_000_000_000_000", "1,0 billion"),
133+
("fr_FR", "6_000_000_000_000", "6,0 billions"),
134+
("fr_FR", "-6_000_000_000_000", "-6,0 billions"),
135+
("fr_FR", "999_999_999_999_999", "1,0 billiard"),
136+
("fr_FR", "1_000_000_000_000_000", "1,0 billiard"),
137+
("fr_FR", "1_300_000_000_000_000", "1,3 billiards"),
138+
("fr_FR", "-1_300_000_000_000_000", "-1,3 billiards"),
139+
("fr_FR", "3_500_000_000_000_000_000_000", "3,5 trilliards"),
140+
("fr_FR", "8_100_000_000_000_000_000_000_000_000_000_000", "8,1 quintilliards"),
141141
(
142142
"fr_FR",
143143
"-8_100_000_000_000_000_000_000_000_000_000_000",
144-
"-8.1 quintilliards",
144+
"-8,1 quintilliards",
145145
),
146146
(
147147
"fr_FR",
148148
1_000_000_000_000_000_000_000_000_000_000_000_000,
149-
"1000.0 quintilliards",
149+
"1000,0 quintilliards",
150150
),
151151
(
152152
"fr_FR",
153153
1_100_000_000_000_000_000_000_000_000_000_000_000,
154-
"1100.0 quintilliards",
154+
"1100,0 quintilliards",
155155
),
156156
(
157157
"fr_FR",
158158
2_100_000_000_000_000_000_000_000_000_000_000_000,
159-
"2100.0 quintilliards",
159+
"2100,0 quintilliards",
160160
),
161161
],
162162
)
@@ -176,10 +176,10 @@ def test_intword_i18n(locale: str, number: int, expected_result: str) -> None:
176176
[
177177
("fr_FR", 1, "1 octet"),
178178
("fr_FR", 42, "42 octets"),
179-
("fr_FR", 42_000, "42.0 Ko"),
180-
("fr_FR", 42_000_000, "42.0 Mo"),
181-
("fr_FR", 42_000_000_000, "42.0 Go"),
182-
("fr_FR", -42_000, "-42.0 Ko"),
179+
("fr_FR", 42_000, "42,0 Ko"),
180+
("fr_FR", 42_000_000, "42,0 Mo"),
181+
("fr_FR", 42_000_000_000, "42,0 Go"),
182+
("fr_FR", -42_000, "-42,0 Ko"),
183183
],
184184
)
185185
def test_naturalsize_i18n(locale: str, value: float, expected_result: str) -> None:
@@ -199,7 +199,7 @@ def test_naturalsize_i18n_binary() -> None:
199199
except FileNotFoundError:
200200
pytest.skip("Generate .mo with scripts/generate-translation-binaries.sh")
201201
else:
202-
assert humanize.naturalsize(3000, binary=True) == "2.9 Kio"
202+
assert humanize.naturalsize(3000, binary=True) == "2,9 Kio"
203203
finally:
204204
humanize.i18n.deactivate()
205205

0 commit comments

Comments
 (0)