我需要将过程从string
转换为decimal
,并使用固定的小数点分隔符.
与文化设置无关。接下来,我知道十进制数仅限于.
后的6位小数,并且.
之前的位数没有限制。使用Oracle文档及其格式字符串示例我现在只有这个解决方案:
v_number := TO_NUMBER(v_string, '9999999999999999999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''. ''');
9
之前的D
个字符数是允许的最大数量。我发现这个格式字符串非常糟糕。是否有更好的格式字符串用于此常规转换或某种方式省略第二个函数参数?一般来说,我只需要传递给函数NLS参数告诉它我只想用小数分隔符.
进行转换,但在这种情况下第二个参数也是必需的。
答案 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;