Substr с несколькими ведущими нулями [дубликат]

Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

28
задан contactmatt 14 July 2011 в 16:17
поделиться

5 ответов

Это форматирование по умолчанию, предоставляемое Oracle. Если вам нужны ведущие нули на выходе, вам необходимо явно указать формат. Используйте:

SELECT TO_CHAR(0.56,'0.99') FROM DUAL;

или даже:

SELECT TO_CHAR(.56,'0.99') FROM DUAL;

То же самое верно для конечных нулей:

SQL> SELECT TO_CHAR(.56,'0.990') val FROM DUAL;

VAL
------
 0.560

Общий вид преобразования TO_CHAR функция:

TO_CHAR (число, формат )

30
ответ дан DCookie 26 August 2018 в 04:49
поделиться

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

] Это разочаровывает то, что такое обычное форматирование не может быть легко достигнуто в Oracle.

Даже Том Ките предложил только сложное обходное решение следующим образом:

case when trunc(x)=x
    then to_char(x, 'FM999999999999999999')
    else to_char(x, 'FM999999999999999.99')
end x

Но мне удалось найти более короткое решение, которое упоминает значение только один раз:

rtrim(to_char(x, 'FM999999999999990.99'), '.')

Этот работает как ожидалось для всех возможных значений:

select 
    to_char(num, 'FM99.99') wrong_leading_period,
    to_char(num, 'FM90.99') wrong_trailing_period,
    rtrim(to_char(num, 'FM90.99'), '.') correct
from (
  select num from (select 0.25 c1, 0.1 c2, 1.2 c3, 13 c4, -70 c5 from dual)
  unpivot (num for dummy in (c1, c2, c3, c4, c5))
) sampledata;

    | WRONG_LEADING_PERIOD | WRONG_TRAILING_PERIOD | CORRECT |
    |----------------------|-----------------------|---------|
    |                  .25 |                  0.25 |    0.25 |
    |                   .1 |                   0.1 |     0.1 |
    |                  1.2 |                   1.2 |     1.2 |
    |                  13. |                   13. |      13 |
    |                 -70. |                  -70. |     -70 |

По-прежнему ищет еще более короткое решение.

Существует укороченный подход с пользовательской вспомогательной функцией:

create or replace function str(num in number) return varchar2
as
begin
    return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;

Но пользовательские функции pl / sql имеют значительную производительность накладные расходы , которые не подходят для тяжелых запросов.

16
ответ дан Community 26 August 2018 в 04:49
поделиться

Кажется, что единственный способ получить десятичную форму в симпатичной (для меня) форме требует какого-то смешного кода.

Единственное решение, которое я получил до сих пор:

CASE WHEN xy>0 and xy<1 then '0' || to_char(xy) else to_char(xy)

xy является decimial.

xy             query result
0.8            0.8  --not sth like .80
10             10  --not sth like 10.00

, пожалуйста, ответьте на этот вопрос, если для этого существует опция реального формата.

5
ответ дан mkb 26 August 2018 в 04:49
поделиться

Это работает только для чисел, меньших 1.

select to_char(12.34, '0D99') from dual;
-- Result: #####

Это не сработает.

Вы можете сделать что-то подобное, но это приводит к ведущим пробелам:

select to_char(12.34, '999990D99') from dual;
-- Result: '     12,34'

В конечном итоге вы можете добавить TRIM, чтобы избавиться от пробелов, но я не стал бы считать, что это правильное решение ...

select trim(to_char(12.34, '999990D99')) from dual;
-- Result: 12,34

Опять же, это будет только для чисел с максимальным числом в 6 цифр.

Редактирование: я хотел добавить это как комментарий к предложению DCookie, но я не могу.

3
ответ дан rawberto 26 August 2018 в 04:49
поделиться

Попробуйте это, чтобы избежать ограничений to_char:

SELECT 
regexp_replace(regexp_replace(n,'^-\'||s,'-0'||s),'^\'||s,'0'||s)
FROM (SELECT -0.89 n,RTrim(1/2,5) s FROM dual);
1
ответ дан Tadas Balaišis 26 August 2018 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: