如何使用带有固定小数点char的TO_NUMBER函数在Oracle中从字符串转换为数字?

时间:2011-04-05 13:10:20

标签: oracle plsql oracle10g number-formatting

我需要将过程从string转换为decimal,并使用固定的小数点分隔符.与文化设置无关。接下来,我知道十进制数仅限于.后的6位小数,并且.之前的位数没有限制。使用Oracle文档及其格式字符串示例我现在只有这个解决方案:

v_number := TO_NUMBER(v_string, '9999999999999999999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''. ''');

9之前的D个字符数是允许的最大数量。我发现这个格式字符串非常糟糕。是否有更好的格式字符串用于此常规转换或某种方式省略第二个函数参数?一般来说,我只需要传递给函数NLS参数告诉它我只想用小数分隔符.进行转换,但在这种情况下第二个参数也是必需的。

4 个答案:

答案 0 :(得分:8)

您不能使用第三个参数而不是第二个参数调用to_number函数。我建议将“丑陋”的格式字符串放在一个包中,然后忘掉它。

您还可以使用dbms_session.set_nls修改您的NLS设置,并且可以使用to_number而无需参数。

答案 1 :(得分:1)

处理逗号和句号。

FUNCTION to_number2(p_num_str VARCHAR2) RETURN NUMBER AS
BEGIN
  RETURN TO_NUMBER(REPLACE(p_num_str, ',', '.'), '999999999999D999999999999', 'NLS_NUMERIC_CHARACTERS=''.,''');
END;

答案 2 :(得分:0)

CREATE OR REPLACE FUNCTION IS_NUMBER(P_VAR IN VARCHAR2)
RETURN NUMBER
IS
  P_NUMBER NUMBER := 0;
  RIG VARCHAR2(10) := '';
  FORMAT VARCHAR2(100) := '999999999999D999999999999';
  RES VARCHAR2(100) := '';
BEGIN
  SELECT VALUE INTO RIG 
  FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
IF SUBSTR(RIG,1,1) = '.' THEN
 RES := REPLACE(P_VAR,',','.');
ELSE
 RES := REPLACE(P_VAR,'.',',');
END IF;
 P_NUMBER := TO_NUMBER(RES,FORMAT,'NLS_NUMERIC_CHARACTERS='''||RIG||'''');
 P_NUMBER := ROUND(P_NUMBER,5); --FIVE DIGITS AFTER DECIMAL POINT IS ENOUGH
RETURN P_NUMBER;
EXCEPTION
 WHEN OTHERS THEN RETURN -1;
END;

答案 3 :(得分:-3)

select to_number('   12.5   ') + to_number('   12   ') from dual;