2010-06-26 35 views
6

Tôi có một bảng với 3 cột:Format độ chính xác gấp đôi trong PostgreSQL

customer_name varchar 
,account_type varchar 
,current_balance double precision 

Ví dụ giá trị cho current_balance:

 
1200 
1500.5 
1500 

Tôi muốn họ để hiển thị như thế này:

 
1200.00 
1500.50 
1500.00 

Tôi đã thử truy vấn sau:

SELECT to_char(current_balance,'9999999999999999D99') 
    FROM bank; 

Định dạng theo cách tôi muốn nhưng thêm khoảng trắng ngay từ đầu. Làm thế nào để giải quyết điều này? Có cách nào tốt hơn để định dạng?

+8

Dừng lại đúng nơi bạn đang ở. Cẩn thận [đọc phần về cách xử lý gấp đôi trong Postgres] (http://www.postgresql.org/docs/8.4/interactive/datatype-numeric.html#DATATYPE-FLOAT). Đôi được coi là giá trị dấu phẩy động. Nổi được lưu trữ và tính toán theo cách mà chúng có thể mất độ chính xác. Không sử dụng giá trị dấu phẩy động để lưu trữ giá trị tiền tệ. Sử dụng các loại 'NUMERIC' hoặc' DECIMAL'. – Charles

Trả lời

6

Bạn có thể sử dụng trim để loại bỏ các khoảng trống thừa. Không có đối số, nó chỉ xóa các khoảng trống.

charles=# SELECT to_char(12345.67,'99999999999999999D99'); 
     to_char 
----------------------- 
       12345.67 
(1 row) 

charles=# SELECT trim(to_char(12345.67,'99999999999999999D99')); 
    btrim 
---------- 
12345.67 
(1 row) 
+0

hi Charles .. nếu bản ghi đầu vào của tôi là 0 (Zero) vào thời điểm nó chỉ cung cấp .00. nhưng tôi muốn 0,00 làm thế nào tôi có thể làm điều này ..? – ungalnanban

+0

Tôi không biết, thực sự. Tôi vẫn đang học hỏi tất cả những điều khó hiểu của Postgres. Nếu thất bại, bạn có thể thử 'CASE' để kiểm tra xem số đó có bằng không và trả về '0.00' nếu có. – Charles

+2

Muộn cho bữa tiệc, nhưng ai đó có lẽ nên đề cập đến '99 ... 0D99 'như một giải pháp khả thi cho yêu cầu 0.00. – VoiceOfUnreason

2
to_char(current_balance, 'FM9999999999999999D99') 

Từ the docs:

FM: Chế độ tiền tố lấp đầy (ngăn chặn đệm khoảng trống và zero)

Nếu bạn muốn có một biểu tượng tiền tệ bản địa đặc thù, hãy thử L:

to_char(current_balance, 'FML9999999999999999D99') 

L: ký hiệu tiền tệ (sử dụng locale)

Kết quả từ PG 8.4 chống lại cột gọi là dbl với giá trị của 12.345,678 nơi id = 1:

>>> import psycopg2 
>>> conn = psycopg2.connect(host='localhost', database='scratch', user='',password='') 
>>> c = conn.cursor() 

>>> c.execute("select to_char(dbl, '9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # with padding 
[('   12345.68',)] 

>>> c.execute("select to_char(dbl, 'FM9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # no padding 
[('12345.68',)] 

>>> c.execute("select to_char(dbl, 'FML9999999999999999D99') from practice where id = 1;") 
>>> c.fetchall() # with locale-specific currency symbol 
[('$12345.68',)] 
+0

không có định dạng sai. – ungalnanban

6

Như đã nêu trong một nhận xét, it's bad design to use a floating point type (real, double, float) for a money balance. Điều này sẽ dẫn bạn đến gặp rắc rối. Sử dụng DECIMAL để thay thế.

+0

Ok cảm ơn bạn ... Tôi lưu ý điểm của bạn và ở đây sau khi tôi sẽ sử dụng số thập phân. – ungalnanban

+0

@ fungnanban: Điều này phải làm với các lỗi làm tròn khi bạn không sử dụng số thập phân, vì vậy bạn nên làm, bởi vì nếu các khoản tiền kế toán sai, bất kỳ chuyển đổi float-to-string nào sẽ là vấn đề nhỏ hơn của bạn ... –

Các vấn đề liên quan