简体   繁体   中英

How to format a float with a comma as decimal separator in an f-string?

For some machine control in python, I write the results to a text-file, that someone else can copy into Excel (this is the most convenient way in this situation). However, in the Netherlands, Excel has a comma as decimal separator and thus I want to have the result "position" in the text-file as 123,456, but when I use the f-string method like this:

    resultfile.write(f"Position\t{position:.5}")

This will obviously result in a dot decimal separator.

How can I change this to a comma without iterating through the whole file int the end and replace the dots with commas?

If you want to format floats with a comma within the f-string, you can either use replace after casting the float to a string:

position = 123.456
f"Position\t{str(position).replace('.',',')}"

A second option is to use the Python standard library module locale ( but it is not thread-safe ):

import locale
locale.setlocale(locale.LC_ALL, 'nl_NL')
f"Position\t{locale.format('%.3f', position)}"

A third option is to use the library babel (preferred in case of library routines):

from babel.numbers import format_decimal
f"Position\t{format_decimal(position, locale='nl_NL')}"

All three options return the same result for the given example:

'Position\t123,456'

As @michel-de-ruiter mentioned , the f format does not work with locale. On the other hand, you can't set the precision using n format. For example, if you want 4 digits after decimal separator:

import locale
locale.setlocale(locale.LC_ALL, 'nl_NL')

position = 123.45678999
print(f'{position:.4n}')  # output: 123,4 (not quite what we wanted!)

However, you can round the number with the desired precision before formatting it:

print(f'{round(position, 4):n}')  # output: 123,4567 (that's it!)

If you prefer to avoid dependencies, the following simple function might fit your needs:

def comma_num(n,f=''):
    return ('{'+f+'}').format(n).replace('.',',')

n = 1.23

f'Whatever {comma_num(n)}'
'Whatever {}'.format(comma_num(n))
>>>'Whatever 1,23'

f'Whatever {comma_num(n,":6.4f")}'
'Whatever {}'.format(comma_num(n,':6.4f'))
>>>'Whatever 1,2300'

If the g format is good enough for you, use n instead:

resultfile.write(f"Position\t{position:.7n}")

While n works (uses the current locale setting when used) instead of both d and g , there is no such thing for the f format unfortunately...

一个更简单的解决方案可能是:

f"Position\t{position:,.5f}"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM