Saya mencoba untuk mencetak integer di Python 2.6.1 dengan koma sebagai pemisah ribuan. Sebagai contoh, saya ingin menunjukkan nomor tersebut 1234567
sebagai 1,234,567
. Bagaimana saya bisa melakukan ini? Saya telah melihat banyak contoh di Google, tetapi saya mencari cara praktis yang paling sederhana.
Tidak perlu spesifik lokal untuk memutuskan antara periode dan koma. Saya lebih suka sesuatu yang sesederhana mungkin.
python
number-formatting
Elias Zamaria
sumber
sumber
{val:,}.format(val=val)
f"{2 ** 64 - 1:,}"
Saya mendapatkan ini untuk bekerja:
Tentu, Anda tidak memerlukan dukungan internasionalisasi, tetapi jelas, ringkas, dan menggunakan perpustakaan bawaan.
PS Itu "% d" adalah formatter%-style biasa. Anda hanya dapat memiliki satu formatter, tetapi dapat berupa apa pun yang Anda perlukan dalam hal lebar bidang dan pengaturan presisi.
PPS Jika Anda tidak bisa mulai
locale
bekerja, saya akan menyarankan versi modifikasi dari jawaban Mark:Rekursi berguna untuk kasus negatif, tetapi satu rekursi per koma tampaknya agak berlebihan bagi saya.
sumber
locale
, saya menggunakan sesedikit mungkin.setlocale
menggunakan default, yang diharapkan akan sesuai.Untuk inefisiensi dan keterbacaan sulit dikalahkan:
sumber
lambda x: (lambda s: ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-'))(str(x))
hanya untuk menjaga tema kebingungan.Berikut adalah kode pengelompokan lokal setelah menghapus bagian yang tidak relevan dan membersihkannya sedikit:
(Berikut ini hanya berfungsi untuk bilangan bulat)
Sudah ada beberapa jawaban bagus di sini. Saya hanya ingin menambahkan ini untuk referensi di masa mendatang. Dalam python 2.7 akan ada penentu format untuk pemisah ribuan. Menurut python docs berfungsi seperti ini
Di python3.1 Anda dapat melakukan hal yang sama seperti ini:
sumber
Saya terkejut bahwa tidak ada yang menyebutkan bahwa Anda dapat melakukan ini dengan f-string di Python 3.6 semudah ini:
... di mana bagian setelah titik dua adalah penentu format. Koma adalah karakter pemisah yang Anda inginkan, jadi
f"{num:_}"
gunakan garis bawah alih-alih koma.Ini sama dengan menggunakan
format(num, ",")
untuk versi python 3 yang lebih lama.sumber
Berikut ini adalah penggantian satu baris regex:
Hanya berfungsi untuk output inegral:
Atau untuk pelampung dengan kurang dari 4 digit, ubah penentu format ke
%.3f
:NB: Tidak berfungsi dengan benar dengan lebih dari tiga digit desimal karena akan mencoba mengelompokkan bagian desimal:
Bagaimana itu bekerja
Mari kita jabarkan:
sumber
Inilah yang saya lakukan untuk kendaraan hias. Meskipun, jujur, saya tidak yakin versi kerjanya - Saya menggunakan 2.7:
Pengembalian: 4,385,893.38
Pembaruan: Saya baru-baru ini memiliki masalah dengan format ini (tidak dapat memberi tahu Anda alasan yang tepat), tetapi dapat memperbaikinya dengan menjatuhkan
0
:sumber
Anda juga dapat menggunakan
'{:n}'.format( value )
untuk representasi lokal. Saya pikir ini adalah cara paling sederhana untuk solusi lokal.Untuk informasi lebih lanjut, cari
thousands
di Python DOC .Untuk mata uang, Anda dapat menggunakan
locale.currency
, mengatur benderagrouping
:Kode
Keluaran
sumber
Sedikit memperluas jawaban Ian Schneider:
Jika Anda ingin menggunakan pemisah ribuan kustom, solusi paling sederhana adalah:
Contohnya
Jika Anda ingin representasi Jerman seperti ini, itu akan sedikit lebih rumit:
sumber
'{:_.2f}'.format(12345.6789).replace('.', ',').replace('_', '.')
Saya yakin pasti ada fungsi pustaka standar untuk ini, tetapi menyenangkan untuk mencoba menulisnya sendiri menggunakan rekursi jadi inilah yang saya buat:
Karena itu, jika orang lain menemukan cara standar untuk melakukannya, Anda harus menggunakannya.
sumber
Dari komentar hingga resep aktivasi 498181 saya ulang ini:
Ini menggunakan fitur ekspresi reguler: lookahead yaitu
(?=\d)
untuk memastikan hanya grup dari tiga digit yang memiliki digit 'setelah' mereka mendapatkan koma. Saya katakan 'setelah' karena string terbalik pada saat ini.[::-1]
hanya membalikkan sebuah string.sumber
Jawaban yang diterima baik-baik saja, tetapi sebenarnya saya lebih suka
format(number,',')
. Lebih mudah bagi saya untuk menafsirkan dan mengingat.https://docs.python.org/3/library/functions.html#format
sumber
Python 3
-
Integer (tanpa desimal):
"{:,d}".format(1234567)
-
Mengapung (dengan desimal):
"{:,.2f}".format(1234567)
di mana angka sebelumnya
f
menentukan jumlah tempat desimal.-
Bonus
Fungsi starter cepat dan kotor untuk sistem penomoran lakh India / crores (12,34,567):
https://stackoverflow.com/a/44832241/4928578
sumber
dari Python versi 2.6 Anda bisa melakukan ini:
Untuk versi Python <2.6 dan hanya untuk informasi Anda, berikut adalah 2 solusi manual, mereka berubah menjadi mengambang tetapi angka negatif berfungsi dengan benar:
beberapa hal yang perlu diperhatikan di sini:
Dan versi yang lebih hardcore:
sumber
Saya seorang pemula Python, tetapi seorang programmer yang berpengalaman. Saya memiliki Python 3.5, jadi saya hanya bisa menggunakan koma, tetapi ini tetap merupakan latihan pemrograman yang menarik. Pertimbangkan kasus bilangan bulat yang tidak ditandatangani. Program Python yang paling mudah dibaca untuk menambahkan ribuan pemisah tampaknya adalah:
Dimungkinkan juga untuk menggunakan pemahaman daftar:
Ini lebih pendek, dan bisa menjadi liner satu, tetapi Anda harus melakukan beberapa senam mental untuk memahami mengapa itu bekerja. Dalam kedua kasus tersebut kita mendapatkan:
Versi pertama adalah pilihan yang lebih masuk akal, jika Anda ingin program dipahami.
sumber
Ini salah satu yang berfungsi untuk pelampung juga:
Contoh Penggunaan:
sumber
float2comma(12031023.1323)
pengembalian: '12, 031.023.132,3 'Satu liner untuk Python 2.5+ dan Python 3 (hanya int positif):
sumber
Solusi universal
Saya telah menemukan beberapa masalah dengan pemisah titik di jawaban terpilih sebelumnya. Saya telah merancang solusi universal di mana Anda dapat menggunakan apa pun yang Anda inginkan sebagai pemisah seribu tanpa mengubah lokal . Saya tahu itu bukan solusi yang paling elegan, tetapi menyelesaikan pekerjaan. Jangan ragu untuk memperbaikinya!
sumber
Ini menghasilkan uang bersama dengan koma
sumber
Saya memiliki versi python 2 dan python 3 dari kode ini. Saya tahu bahwa pertanyaannya adalah python 2 tetapi sekarang (8 tahun kemudian lol) orang mungkin akan menggunakan python 3.
Python 3 Code:
Kode Python 2: (Edit. Kode python 2 tidak berfungsi. Saya berpikir bahwa sintaksnya berbeda).
sumber
Saya menggunakan python 2.5 jadi saya tidak memiliki akses ke pemformatan bawaan.
Saya melihat kode Django intcomma (intcomma_recurs dalam kode di bawah) dan menyadari itu tidak efisien, karena itu rekursif dan juga menyusun regex pada setiap proses bukanlah hal yang baik juga. Ini tidak perlu menjadi 'masalah' karena Django tidak benar-benar fokus pada kinerja tingkat rendah semacam ini. Juga, saya mengharapkan faktor 10 perbedaan dalam kinerja, tetapi hanya 3 kali lebih lambat.
Karena penasaran, saya menerapkan beberapa versi intcomma untuk melihat apa keunggulan kinerja saat menggunakan regex. Data pengujian saya menyimpulkan sedikit keuntungan untuk tugas ini, tetapi tidak mengejutkan sama sekali.
Saya juga senang melihat apa yang saya duga: menggunakan pendekatan reverse xrange tidak perlu dalam kasus no-regex, tetapi itu membuat kode terlihat sedikit lebih baik dengan biaya kinerja ~ 10%.
Juga, saya menganggap apa yang Anda lewati adalah string dan terlihat agak seperti angka. Hasil tidak ditentukan sebaliknya.
Dan inilah hasil tesnya:
sumber
ini dimasukkan ke dalam python per PEP -> https://www.python.org/dev/peps/pep-0378/
cukup gunakan format (1000, ', d') untuk menunjukkan integer dengan ribuan pemisah
ada lebih banyak format yang dijelaskan dalam PEP, miliki
sumber
Berikut ini varian lain yang menggunakan fungsi generator yang berfungsi untuk bilangan bulat:
Dan inilah tesnya:
sumber
Hanya subkelas
long
(ataufloat
, atau apa pun). Ini sangat praktis, karena dengan cara ini Anda masih dapat menggunakan angka-angka Anda dalam operasi matematika (dan karena itu kode yang ada), tetapi semuanya akan dicetak dengan baik di terminal Anda.sumber
__repr__()
metode yang tepat untuk menimpanya? Saya akan menyarankan mengesampingkan__str__()
dan meninggalkan__repr__()
sendirian, karenaint(repr(number(928374)))
harus bekerja, tetapiint()
akan tersedak koma.number(repr(number(928374)))
tidak bekerja, tidakint(repr(number(928374)))
. Semua sama, untuk membuat pendekatan ini bekerja secara langsung denganprint
, seperti yang diminta OP,__str__()
metode harus menjadi yang ditimpa daripada__repr__()
. Apapun, tampaknya ada bug dalam logika penyisipan koma inti.Italia:
sumber
Untuk mengapung:
Untuk int:
sumber
float('1,234.52'.translate(None, ','))
mungkin lebih mudah dan mungkin lebih cepat.