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

发布于 2024-10-30 14:44:56 字数 515 浏览 5 评论 0原文

我需要在过程中从 string 转换为 decimal,并使用固定的小数分隔符 . 独立于区域性设置。接下来,我知道 . 之后的小数位数仅限于 6 位小数,而 . 之前的位数没有限制。使用 Oracle 文档及其格式字符串示例,我现在有了这个解决方案:

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

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

I need to convert in procedure from string to decimal with fixed decimal separator . independant on culture settings. Next, I know decimal number is limited just with 6 decimal places after . and there is no limitiation on number of digits before .. Using Oracle documentation and its examples for format strings I have now just this solution:

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

Number of 9 chars before D is maximum number allowed. I find this format string as pretty awful. Is there any better format string for this general conversion or some way to omit second parameter of function? In general I just need to pass to function NLS parameter to tell it i just want to convert with decimal separator ., but second parameter is mandatory in that case as well.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

时光匆匆的小流年 2024-11-06 14:44:56

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

您还可以使用 dbms_session.set_nls< /code>修改您的 NLS 设置并能够使用不带参数的 to_number

You can't call the to_number function with the third parameter and not the second. I would suggest putting the "ugly" format string in a package constant and forget about it.

You could also use dbms_session.set_nls to modify your NLS settings and be able to use to_number without arguments.

仙气飘飘 2024-11-06 14:44:56

处理逗号和句号。

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

Handles both comma and period.

FUNCTION to_number2(p_num_str VARCHAR2) RETURN NUMBER AS
BEGIN
  RETURN TO_NUMBER(REPLACE(p_num_str, ',', '.'), '999999999999D999999999999', 'NLS_NUMERIC_CHARACTERS=''.,''');
END;
っ〆星空下的拥抱 2024-11-06 14:44:56
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;
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;
喜你已久 2024-11-06 14:44:56
select to_number('   12.5   ') + to_number('   12   ') from dual;
select to_number('   12.5   ') + to_number('   12   ') from dual;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文