将带括号的数字解析为负数

Parse number with parentheses as negative

我有一个 VARCHAR2,它是通过解析最终用户上传的 CSV 文件(很可能是从 Microsoft Excel 转换而来)填充的。其中一列必须是美元金额,我们希望程序接受最明确的数字金额(正数或负数)但拒绝任何看起来不像数字的东西(例如,如果用户上传了错误的电子表格)。

接受的值:

12345.6789
12345.67
12345.6
12345.
12345
12,345.67
345.67
-12345.67
-12,345.67
(12,345.67)

要拒绝的值:

FRED
12%345
BLAH123
£12345.67

面议*:

(12345.67
12)345.67
125.67
1,23,4,5.67
12,345.67-
12 345.67

这是我们之前的代码,没有涵盖所有情况:

TO_NUMBER(TRANSLATE(val,'0$,','0'))

如果这引发异常(VALUE_ERRORORA-01858 "non-numeric character"),我们会向用户报告适当的错误消息。它正确处理了上述所有情况(括号除外)。

* (可协商,因为我不想编写一页长的代码来尝试处理所有可能的排列;它需要可维护并处理用户可能会使用的更可能的格式使用)

TL;DR 有一个 PR 数字格式元素用于显示带括号的负数(<> 实际上)但它不适用于 TO_NUMBER将字符串转换为数字。

SQLFiddle

到目前为止,这是我天真的方法:

TO_NUMBER(
   RTRIM(LTRIM(
     TRANSLATE(val,'0$ ','0')
     ,'('),')')
   ,'999999999999999999990D000000'
   ,'NLS_NUMERIC_CHARACTERS=''.,''')
* CASE WHEN val LIKE '(%)' THEN -1 ELSE 1 END