Я пытался:
import locale
print(locale.locale_alias)
locale.setlocale(locale.LC_ALL, '')
locale.setlocale(locale.LC_NUMERIC, "french")
print(f"{3.14:.2f}")
Но результат 3.14, тогда как я хотел бы 3,14.
Как это сделать с форматированием строки f"..."?
Примечание: я не хочу использовать .replace(".", ",")
Примечание. Я ищу решение для Windows и решения от Как отформатировать число с запятой в качестве десятичного разделителя в f-строке? не работают (таким образом, это не дубликат в Windows):
locale.setlocale(locale.LC_ALL, 'nl_NL')
# or
locale.setlocale(locale.LC_ALL, 'fr_FR')
locale.Error: неподдерживаемая настройка локали
Я только что протестировал, и все 3 метода в принятом ответе отлично работают в Windows для меня.
Если я воспользуюсь вашим кодом и заменю print(f"{3.14:.2f}") на print(f"{3.14:.3n}"), я получу 3,14, как описано в одном из ответов.
@ user56700 Ты прав. Я думаю, вы можете опубликовать это как ответ.
@matszwecja В моем случае с .3f не работает, а с .3n работает
@Basj Решение взято из связанного вопроса, так что для меня это все еще четкий дубликат. Несмотря на это, имейте в виду, что опция n использует только текущую локаль. Не гарантируется, что код напечатает его с запятой, если ваша текущая локаль не поддерживает это.
@matszwecja Странно то, что .2f печатает 2 цифры после ., но с .2n у нас есть только 1 цифра после ,. Почему? Таким образом, здесь необходимо .3n.
Я просмотрел ответы на странице с дубликатами и нашел ответ, который сработал:
Замените print(f"{3.14:.2f}") на print(f"{3.14:.3n}") и вы получите результат: 3,14
См. https://docs.python.org/3/library/string.html#format-specification-mini-language:
'n' Номер. Это то же самое, что и 'g', за исключением того, что он использует текущую настройку локали для вставки соответствующих символов-разделителей чисел.
Принимая во внимание, что 'g' описан по адресу:
g Общий формат. Для заданной точности p >= 1 это округляет число до p значащих цифр, а затем форматирует результат либо в формате с фиксированной запятой, либо в экспоненциальном представлении, в зависимости от его величины. Точность 0 считается эквивалентной точности 1. ... Усеченный...
Описание 'f':
'f' Обозначение с фиксированной точкой. Для заданной точности p форматирует число как десятичное число с ровно p цифрами после запятой.
Странно то, что .2f печатает 2 цифры после ., но с .2n у нас есть только 1 цифра после ,. Почему?
@Basj Вы скопировали описание целочисленной записи, где оно должно было быть описанием с плавающей запятой. Я обновил ответ. Кстати, спасибо за добавление ссылки и т. д. n округляет последнюю цифру, поэтому вам нужно 3.
Вы можете использовать «locale.format_string» вместо «f string»
Вместо этого попробуйте это:
import locale
# Set the locale to "french"
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
# Format the number 3.14 with 2 decimal places, using the french locale
print(locale.format_string("%.2f", 3.14, grouping=True))
@matszwecja Нет, я работаю в Windows, и эти методы не работают из коробки.