Обсуждение: select to_number('1,000', '999,999');
============================================================================
POSTGRESQL BUG REPORT TEMPLATE
============================================================================
Your name : David Schweikert
Your email address : dws@ee.ethz.ch
System Configuration
---------------------
Architecture (example: Intel Pentium) : Intel Pentium 4
Operating System (example: Linux 2.4.18) : 2.4.25
PostgreSQL version (example: PostgreSQL-7.4.6): PostgreSQL-7.4.6
Compiler used (example: gcc 2.95.2) : gcc 3.3.3
Please enter a FULL description of your problem:
------------------------------------------------
select to_number('1,000', '999,999') returns '100'.
Please describe a way to repeat the problem. Please try to provide a
concise reproducible example, if at all possible:
----------------------------------------------------------------------
Proposed addition to the regression tests:
--- src/test/regress/sql/numeric.sql.orig 2000-04-07 21:17:50.000000000 +0200
+++ src/test/regress/sql/numeric.sql 2004-11-19 12:51:57.071152000 +0100
@@ -701,3 +701,4 @@
SELECT '' AS to_number_11, to_number('.-01', 'S99.99');
SELECT '' AS to_number_12, to_number('.01-', '99.99S');
SELECT '' AS to_number_13, to_number(' . 0 1 -', ' 9 9 . 9 9 S');
+SELECT '' AS to_number_14, to_number(to_char('1000'::int, '999G999'),'999G999');
--- src/test/regress/expected/numeric.out.orig 2003-09-25 08:58:06.000000000 +0200
+++ src/test/regress/expected/numeric.out 2004-11-19 12:56:13.464401000 +0100
@@ -1112,3 +1112,9 @@
| -0.01
(1 row)
+SELECT '' AS to_number_14, to_number(to_char('1000'::int, '999G999'),'999G999');
+ to_number_14 | to_number
+--------------+-----------
+ | 1000
+(1 row)
+
If you know how this problem might be fixed, list the solution below:
---------------------------------------------------------------------
David Schweikert <dws@ee.ethz.ch> writes:
> select to_number('1,000', '999,999') returns '100'.
I'm not entirely convinced this is a bug. I get the right answer from
regression=# select to_number('001,000', '999,999') ;
to_number
-----------
1000
(1 row)
It's arguable that to_number() should throw an error when the input
doesn't match the format, but right now it doesn't ...
regards, tom lane
On Sun, Nov 21, 2004 at 20:10:08 -0500, Tom Lane wrote:
> I'm not entirely convinced this is a bug. I get the right answer from
>
> regression=# select to_number('001,000', '999,999') ;
> to_number
> -----------
> 1000
> (1 row)
>
> It's arguable that to_number() should throw an error when the input
> doesn't match the format, but right now it doesn't ...
It seems strange to me that to_char(1000,'999,999') works (it returns
1,000), but the reverse doesn't.
I want to convert a formatted number with group separators, but I don't
know how many digits it has: should I count the digits myself and adapt
the mask (which is a customization and thus entered by the user)?
Cheers
David
--
David Schweikert | phone: +41 44 632 7019
System manager ISG.EE | walk: ETH Zentrum, ETL F24.1
ETH Zurich, Switzerland | web: http://people.ee.ethz.ch/dws
On Mon, 22 Nov 2004, David Schweikert wrote:
> On Sun, Nov 21, 2004 at 20:10:08 -0500, Tom Lane wrote:
> > I'm not entirely convinced this is a bug. I get the right answer from
> >
> > regression=# select to_number('001,000', '999,999') ;
> > to_number
> > -----------
> > 1000
> > (1 row)
> >
> > It's arguable that to_number() should throw an error when the input
> > doesn't match the format, but right now it doesn't ...
>
> It seems strange to me that to_char(1000,'999,999') works (it returns
> 1,000), but the reverse doesn't.
>
> I want to convert a formatted number with group separators, but I don't
> know how many digits it has: should I count the digits myself and adapt
> the mask (which is a customization and thus entered by the user)?
No, but I think you're supposed to use FM in such cases.
select to_number(1000, 'FM999,999');
On Mon, 22 Nov 2004, Stephan Szabo wrote:
> On Mon, 22 Nov 2004, David Schweikert wrote:
>
> > On Sun, Nov 21, 2004 at 20:10:08 -0500, Tom Lane wrote:
> > > I'm not entirely convinced this is a bug. I get the right answer from
> > >
> > > regression=# select to_number('001,000', '999,999') ;
> > > to_number
> > > -----------
> > > 1000
> > > (1 row)
> > >
> > > It's arguable that to_number() should throw an error when the input
> > > doesn't match the format, but right now it doesn't ...
> >
> > It seems strange to me that to_char(1000,'999,999') works (it returns
> > 1,000), but the reverse doesn't.
> >
> > I want to convert a formatted number with group separators, but I don't
> > know how many digits it has: should I count the digits myself and adapt
> > the mask (which is a customization and thus entered by the user)?
>
> No, but I think you're supposed to use FM in such cases.
>
> select to_number(1000, 'FM999,999');
Of course, I don't think the fact that it does that is actually documented
in the 7.4 docs now that I look. I must have just run into it through
experimentation, so I wonder if that's actually intended behavior or not.
On Mon, Nov 22, 2004 at 05:47:19 -0800, Stephan Szabo wrote: >No, but I think you're supposed to use FM in such cases. > >select to_number(1000, 'FM999,999'); Indeed, it works with 'FM'. Thanks! David -- David Schweikert | phone: +41 44 632 7019 System manager ISG.EE | walk: ETH Zentrum, ETL F24.1 ETH Zurich, Switzerland | web: http://people.ee.ethz.ch/dws
Stephan Szabo <sszabo@megazone.bigpanda.com> writes:
> No, but I think you're supposed to use FM in such cases.
>
> select to_number(1000, 'FM999,999');
Good point --- I had forgot about FM. In that case there *is* a bug
here, but I'm not sure if it's with to_char or to_number:
regression=# select to_number(to_char(1000, 'FM999,999'),'FM999,999');
to_number
-----------
1000
(1 row)
regression=# select to_number(to_char(1000, '999,999'),'999,999');
to_number
-----------
100
(1 row)
Whatever your opinion is about the behavior of the non-FM format, surely
to_char and to_number should be inverses.
regards, tom lane
On Mon, 2004-11-22 at 11:08 -0500, Tom Lane wrote:
> Stephan Szabo <sszabo@megazone.bigpanda.com> writes:
> > No, but I think you're supposed to use FM in such cases.
> >
> > select to_number(1000, 'FM999,999');
>
> Good point --- I had forgot about FM. In that case there *is* a bug
> here, but I'm not sure if it's with to_char or to_number:
>
> regression=# select to_number(to_char(1000, 'FM999,999'),'FM999,999');
> to_number
> -----------
> 1000
> (1 row)
>
> regression=# select to_number(to_char(1000, '999,999'),'999,999');
> to_number
> -----------
> 100
> (1 row)
It's to_number() bug. I'm not sure if now (before release) is good time
to fix it. The code of to_number() is not stable for changes and maybe
we can fix this bug add some other new...
I already work on new version for next release. It will use
unit-tests -- I hope it will prevent a lot of bugs like this.
> Whatever your opinion is about the behavior of the non-FM format, surely
> to_char and to_number should be inverses.
Yes.
Karel
--
Karel Zak
http://home.zf.jcu.cz/~zakkr
Hi Karel, On Tue, Nov 23, 2004 at 09:39:21 +0100, Karel Zak wrote: > It's to_number() bug. I'm not sure if now (before release) is good time > to fix it. The code of to_number() is not stable for changes and maybe > we can fix this bug add some other new... I have the workaround with 'FM' so it is not urgent for me... > I already work on new version for next release. It will use > unit-tests -- I hope it will prevent a lot of bugs like this. Sounds great, thank you. Cheers David -- David Schweikert | phone: +41 44 632 7019 System manager ISG.EE | walk: ETH Zentrum, ETL F24.1 ETH Zurich, Switzerland | web: http://people.ee.ethz.ch/dws