select to_number(replace(nvl('-100,000',0),'',','),'999,999,999.99')from dual;
。产生输出:100000
现在,我在带有表列的过程中使用相同的表达式:
select to_number(replace(nvl(TABLEA.VOLUME,0),'',','),'999,999,999.99')from TABLEA;
。并获取输出:无效号码
TABLEA
中的列 VOLUME
的类型为 VARCHAR2
。
最肯定的是,列VOLUME
的内容存储为没有分组字符(,
(的字符串。因此,字符串违反了转换中的格式 to_number
.
此外,REPLACE
中的参数顺序毫无意义。
最后,您希望将调用交换为 NVL
和 REPLACE
。
因此 - 假设您要解析以字符串形式给出的 2 个小数数字的数字 - 使用以下方法:
select to_number ( nvl ( replace (TABLEA.VOLUME, ',', ''), 0), '999999999.99') from TABLEA;
似乎您想将字符串值转换为货币格式。
首先,考虑像在参数顺序中切换''
和','
参数以删除逗号一样替换,并使数字转换适合:
to_number(replace(nvl(str,0),',',''))
,
然后将货币格式应用为:
with tableA as
(
select '-100,000' as volume
from dual
)
select to_char(
to_number(replace(nvl(volume,0),',',''))
,'fm999G999G990D00','NLS_NUMERIC_CHARACTERS = ''.,''')
as Money
from tableA;
MONEY
-----------
-100,000.00
根据货币显示样式,点和逗号的顺序可以切换为 'NLS_NUMERIC_CHARACTERS = '',.'''
将钱显示为-100.000,00
。
附言:首先,您需要确保volume
列的所有数据都可以转换为数字,以便能够使用to_number()
转换。
演示