2015-02-03 3 views
1

У меня есть VARCHAR2, заполненный от разбора CSV-файла, загруженного конечными пользователями (который, скорее всего, был преобразован из Microsoft Excel). Один из столбцов должен быть суммой в долларах, и мы хотим, чтобы программа принимала самые однозначные числовые суммы (положительные или отрицательные), но отклоняла все, что не похоже на число (например, если пользователь загружает неправильную электронную таблицу).Номер парсера с круглыми скобками как отрицательный

Значения принять:

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

значения для отклонения:

FRED 
12%345 
BLAH123 
£12345.67 

договорная *:

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

Это код, который мы имели ранее, которые не охватывают все случаев:

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

Если это вызывает исключение (VALUE_ERROR или ORA-01858 «нечисловой символ»), мы сообщим пользователю подходящее сообщение об ошибке. Он корректно обрабатывает все вышеперечисленные случаи, за исключением круглых скобок.

* (оборотный, потому что я не хочу, чтобы написать страницу длиной кусок кода, чтобы попытаться обработать все возможные перестановки, а она должна быть ремонтопригодны и обрабатывать более вероятные форматы, которые пользователи могут использовать)

TL; DR Элемент формата PR-номера для отображения отрицательного числа с круглыми скобками (<> на самом деле), но для TO_NUMBER для преобразования строк в числа не работает.

SQLFiddle

ответ

0

Вот мой наивный подход до сих пор:

TO_NUMBER(
    RTRIM(LTRIM(
    TRANSLATE(val,'0$ ','0') 
    ,'('),')') 
    ,'999999999999999999990D000000' 
    ,'NLS_NUMERIC_CHARACTERS=''.,''') 
* CASE WHEN val LIKE '(%)' THEN -1 ELSE 1 END 
Смежные вопросы