powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / перевод 7.012345678E9 в varchar2 и в number
24 сообщений из 49, страница 2 из 2
перевод 7.012345678E9 в varchar2 и в number
    #39603059
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousи таки действительно - не обязательно:


как задать нлс параметры для TO_NUMBER не указывая маску?

....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603076
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxElic, спросил пробовол ли to_number, я ответил пробовал, но мне неудобноТы попробовал неправильно. А автор вообще никак не начал пробовать.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603093
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousboobyкакой вообще смысл этого решения?
см. первое сообщение топика.
ага, спасибо. вроде понял.

без учета возможности присутствия "разделителей разрядов"
что-то такое без replace можно предложить:

Код: plsql
1.
2.
3.
4.
5.
6.
select
  to_number(translate( ' -7.012345678E9'
                     , '.,-+E0123456789 '
                     , rpad(to_char(0,'fmd'),2,to_char(0,'fmd'))||'-+E0123456789')
                 )
from dual
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603123
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxавторto_number, чудак , не пробовал?

не вижу там намека на пробование друхих ф-ций

А в ЭТОМ ответе оно и не требовалось - для решения конкретной проблемы преобразования конкретной строки в число достаточно to_number с маской формата и, возможно, nls-параметром

Далее суматоху вносит Stax:
Staxавтор чтобы задать нлс параметры для TO_NUMBER необходимо указывать маску, что вызывет неудобства


ответа в
Код: plsql
1.
Не нужно. 21185206


не нашел


А я нашел.
Не поленился сделать тесткейс и представить.
"Ручник" же выражался в попытках использовать fmd в to_number непосредственно.
Однако, согласно
Staxя догадывался как получить 7012345678

начинаю подозревать, что аккаунт Stax взломан каким-то троллем :)
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603271
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousДалее суматоху вносит Stax:
начинаю подозревать, что аккаунт Stax взломан каким-то троллем :)

не взломан
я не считаю ето суматохой
повторюсь

мне не удобно, что при использовании to_number c нлс параметром надо указывать маску

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603273
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicStaxElic, спросил пробовол ли to_number, я ответил пробовал, но мне неудобноТы попробовал неправильно. А автор вообще никак не начал пробовать.

я попробовал (может и неправильно 21196907 ) решить задачу пользуя to_number , мне не понравилось решение оракля для третьего параметра

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603275
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  1  select
  2    to_number(translate( ' -7.012345678E+9'
  3                       , '.,-+E0123456789 '
  4                       , rpad(to_char(0,'fmd'),2,to_char(0,'fmd'))||'-+E0123456789')
  5                   ) n
  6* from dual
SQL> /

         N
----------
-7,012E+09



авторкак получить 7012345678

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603284
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без маски:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as
 (select '7.012345678E9' as str from DUAL)
select str,
       regexp_replace(substr(str, 1, instr(str, 'E') - 1),
                      '\.|,',
                      (select trim(value)
                         from nls_session_parameters
                        where parameter = 'NLS_NUMERIC_CHARACTERS')),
       to_number(regexp_replace(substr(str, 1, instr(str, 'E') - 1),
                                '\.|,',
                                (select trim(value)
                                   from nls_session_parameters
                                  where parameter = 'NLS_NUMERIC_CHARACTERS'))) *
       power(10, to_number(substr(str, instr(str, 'E') + 1)))
  from t


так удобней? )))))
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603428
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelтак удобней? )))))

xml не хватает

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603839
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxbooby,

Код: plsql
1.
2.
3.
4.
  ...
         N
----------
-7,012E+09



авторкак получить 7012345678

.....
stax

это воазращает к вопросу - кто такая 7012345678.
Если оно число, то to_number и точка,
а если она строка - то полученное число требует обратного форматирования.
здесь до предела в 64 знака работает TM9, дальше вопрос о возможной пользовательской функции.

Код: plsql
1.
2.
3.
4.
5.
6.
select
  to_char(to_number(translate( ' -7.012345678E62'  --' -7.012345678E9'
                     , '.,-+E0123456789 '
                     , rpad(to_char(0,'fmd'),2,to_char(0,'fmd'))||'-+E0123456789')
             ), 'TM9')
from dual



но 63 степень перескочит на научное представление.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603856
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

TRANSLATE оставляет в покое символы не в FROM, посему достаточно:

Код: plaintext
1.
2.
3.
4.
5.
 select
  to_char(to_number(translate( ' -7.012345678E62'  --' -7.012345678E9'
                     , '.,-+E0123456789 '
                     , rpad(to_char(0,'fmd'),2,to_char(0,'fmd'))||'-+E0123456789')
             ), 'TM9')
from dual 

SY.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39603860
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

ок. Это пример простого вопроса на работу интуиции.
но пробел во from я бы, вероятно, оставил.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604037
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyэто воазращает к вопросу - кто такая 7012345678.
Если оно число, то to_number и точка,



to_number никак не превращает строку '7.012345678E9' в "как получить 7012345678 в виде varchar2 и number"

авторTO_NUMBER converts expr to a value of NUMBER datatype
и точка

to_number превращает '7.012345678E9' примерно в такое
Код: plsql
1.
2.
3.
4.
5.
6.
  1* select dump('7.012345678E9'+0,16) d from dual
SQL> /

D
----------------------------------------
Typ=2 Len=6: c5,47,d,23,39,4f



причем если речь о хранении на диске, то еще зависит и от ОС

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604277
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

booby исходит из того что числовая строка может иметь только разделитель дробной части и не может иметь разделитель груп (group separator). Нам неизвестно какой (. или ,) разделитель дробной части использован в числовой строке. А вот TO_CHAR(0,FMD) дает нам разделитель дробной части текущей сессии и TRANSLATE преобразует разделитель дробной части числовой строки в разделитель дробной части текущей сессии. В результате TO_NUMBER преобразует числовую строку в число а TO_CHAR с форматом TM9 преобразует число в строку используя экспоненциальную запись только если вывод > 64 знаков.

SY.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604302
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStax,

Нам неизвестно какой (. или ,) разделитель дробной части использован в числовой строке.

SY.
известно (крапка)

авторэто значение 7 . 012345678E9 хранится в поле varchar2

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604312
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxизвестно

Ну если ты хочешь делать вывод по одному примеру, то да известно. Но сути не меняет - нужно преобразовать точку в разделитель дробной части текущей сессии.

SY.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604326
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStaxизвестно

Ну если ты хочешь делать вывод по одному примеру, то да известно. Но сути не меняет - нужно преобразовать точку в разделитель дробной части текущей сессии.

SY.
можно не преобразовывать, если указать маску
мы ж решаем конкретное задание ( 21195590 )

зы
вместо rpad, мне кажется проще to_char(0,'fmd')||to_char(0,'fmd')
с учетом что разделитель групп не запятая, а десятичный разднлитель . или ,
....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604331
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxвместо rpad, мне кажется проще to_char(0,'fmd')||to_char(0,'fmd')Вместо replace и translate проще regexp_replace.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604336
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВместо replace и translate проще regexp_replace.

Проще, о медленнее.

SY.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604339
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicStaxвместо rpad, мне кажется проще to_char(0,'fmd')||to_char(0,'fmd')Вместо replace и translate проще regexp_replace.
ходят шлюхи что regexp_replace более тормозной (да и его еще и знать/понимать надо)


вопрос в другом, точно известно что в строке точка, если указать маску
(или NLS_NUMERIC_CHARACTERS) то ничего менять в строке не надо

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604341
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYElicВместо replace и translate проще regexp_replace.

Проще, о медленнее.

SY.
мне кажется что translate(s,'.',to_char(0,fmd)) проще

.....
stax
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604342
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYПроще, о медленнее.Постоянно параноидально "оптимизировать" в ущерб простоте/сопровождаемости - это коробком спичек "спасать" лес.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604352
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicПостоянно параноидально "оптимизировать" в ущерб простоте/сопровождаемости - это коробком спичек "спасать" лес.

Ну и чем

Код: plsql
1.
regexp_replace(str,'\.|,',to_char(0,'fmd'))



так проще/сопровождаем чем

Код: plsql
1.
translate(str,'.,',to_char(0,'fmd') || to_char(0,'fmd'))



SY.
...
Рейтинг: 0 / 0
перевод 7.012345678E9 в varchar2 и в number
    #39604371
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYНу и чемТем, что не дублируется код.
Код: plsql
1.
'[.,]'

...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / перевод 7.012345678E9 в varchar2 и в number
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]