【问题标题】:Format double precision in PostgreSQL在 PostgreSQL 中格式化双精度
【发布时间】:2010-06-26 05:22:52
【问题描述】:

我有一个包含 3 列的表格:

  customer_name varchar
 ,account_type varchar
 ,current_balance double precision

current_balance 的示例值:

1200 1500.5 1500

我希望它们像这样显示:

1200.00 1500.50 1500.00

我尝试了以下查询:

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

它按照我想要的方式格式化,但在开头添加了一个空格。如何解决这个问题?有没有更好的格式化方式?

【问题讨论】:

标签: postgresql formatting floating-point


【解决方案1】:

您可以使用trim 删除多余的空格。没有参数,它只删除空格。

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(零),那么它只给出 .00。但我想要 0.00 我怎么能这样做..?
  • 其实我不知道。我仍在学习 Postgres 的所有细节。如果一切都失败了,您可以尝试CASE 来检查数字是否为零,如果是则返回“0.00”。
  • 迟到了,但有人可能应该提到 '99...0D99' 作为 0.00 要求的可能解决方案。
【解决方案2】:

正如评论中已经指出的那样,it's bad design to use a floating point type (real, double, float) for a money balance。这会给你带来麻烦。请改用DECIMAL

【讨论】:

  • 好的,谢谢...我记下了您的观点,在此之后我将使用小数。
  • @ungalnanban:这与不使用小数时的舍入错误有关,所以最好这样做,因为如果会计和错误,任何浮点到字符串的转换都将是你的小问题......
【解决方案3】:
to_char(current_balance, 'FM9999999999999999D99')

来自the docs

FM:前缀填充模式(抑制填充 空格和零)

如果您想要特定于语言环境的货币符号,请尝试L

to_char(current_balance, 'FML9999999999999999D99')

L:货币符号(使用区域设置)

PG 8.4 对名为 dbl 的列的结果,其值为 12345.678,其中 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',)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多