我需要在程序中转换从string到decimal与固定的小数分隔符.独立于文化设置。接下来,我知道十进制数在.之后只有6位小数,在.之前没有位数限制。使用Oracle文档和它的格式化字符串示例,我现在就有了这个解决方案:
v_number := TO_NUMBER(v_string, '9999999999999999999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''. ''');D之前的9字符数是允许的最大字符数。我发现这个格式字符串非常糟糕。对于这个通用的转换,有没有更好的格式字符串或者省略函数的第二个参数的方法?一般来说,我只需要传递给函数NLS参数,告诉它我只想用十进制分隔符.进行转换,但在这种情况下,第二个参数也是必需的。
发布于 2011-04-05 21:18:21
不能使用第三个参数而不是第二个参数调用to_number函数。我建议将“丑陋的”格式字符串放在一个包常量中,然后忘掉它。
您还可以使用dbms_session.set_nls修改您的NLS设置,并能够使用不带参数的to_number。
发布于 2017-12-07 20:34:49
同时处理逗号和句号。
FUNCTION to_number2(p_num_str VARCHAR2) RETURN NUMBER AS
BEGIN
RETURN TO_NUMBER(REPLACE(p_num_str, ',', '.'), '999999999999D999999999999', 'NLS_NUMERIC_CHARACTERS=''.,''');
END;发布于 2012-11-05 00:49:08
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;https://stackoverflow.com/questions/5552359
复制相似问题