Как сделать, чтобы форматирование строки f"..." использовало запятую вместо точки в качестве десятичного разделителя?

Я пытался:

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: неподдерживаемая настройка локали

@matszwecja Нет, я работаю в Windows, и эти методы не работают из коробки.

Basj 10.01.2023 11:43

Я только что протестировал, и все 3 метода в принятом ответе отлично работают в Windows для меня.

matszwecja 10.01.2023 11:45

Если я воспользуюсь вашим кодом и заменю print(f"{3.14:.2f}") на print(f"{3.14:.3n}"), я получу 3,14, как описано в одном из ответов.

user56700 10.01.2023 11:47

@ user56700 Ты прав. Я думаю, вы можете опубликовать это как ответ.

Basj 10.01.2023 11:49

@matszwecja В моем случае с .3f не работает, а с .3n работает

Basj 10.01.2023 11:50

@Basj Решение взято из связанного вопроса, так что для меня это все еще четкий дубликат. Несмотря на это, имейте в виду, что опция n использует только текущую локаль. Не гарантируется, что код напечатает его с запятой, если ваша текущая локаль не поддерживает это.

matszwecja 10.01.2023 11:58

@matszwecja Странно то, что .2f печатает 2 цифры после ., но с .2n у нас есть только 1 цифра после ,. Почему? Таким образом, здесь необходимо .3n.

Basj 10.01.2023 12:04
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
2
7
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я просмотрел ответы на странице с дубликатами и нашел ответ, который сработал:

Замените 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 10.01.2023 12:11

@Basj Вы скопировали описание целочисленной записи, где оно должно было быть описанием с плавающей запятой. Я обновил ответ. Кстати, спасибо за добавление ссылки и т. д. n округляет последнюю цифру, поэтому вам нужно 3.

user56700 10.01.2023 12:18

Вы можете использовать «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))

Другие вопросы по теме