У меня есть 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 для преобразования строк в числа не работает.