Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 убрать незначимые нули  [new]
Screen_x
Member

Откуда:
Сообщений: 2
доброго всем времени суток. подскажите, пожалуйста, с таким вопросом. есть столбец с текстовым типом данных. но в нем хранятся дробные числа. количество знаков после запятой равно трем. и ионгда получаются числа вроде таких 25.300, 2.020. можно ли как-то отследить эти незначимые нули и убрать? всм заранее спасиба
17 апр 08, 12:16    [5560064]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
Dima T
Member

Откуда:
Сообщений: 15294
Лучше это делать при конвертации:
Func say_kol
Para k
Return alltrim(iif(k=int(k),str(k,12),iif(k*10=int(k*10),str(k,12,1),iif(k*100=int(k*100),str(k,12,2),str(k,12,3)))))
17 апр 08, 12:33    [5560196]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
Как узнать количество значащих знаков после запятой
http://forum.foxclub.ru/read.php?29,312939,313006#msg-313006
17 апр 08, 12:33    [5560203]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
Погодин
Member

Откуда:
Сообщений: 117
Если VFP9, то так (у меня переменная 9 цифр, 3 после запятой)

ALLTRIM(ALLTRIM(STR(MyVar,9,3),'0'),'.',' ')
17 апр 08, 12:57    [5560479]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
В VFP9 у функций AllTrim(), LTrim(), RTrim() появились дополнительные параметры, показывающие, какие именно ведущие и концевые символы надо отбросить. В частности, можно отбросить и символ 0, и символ точки, если он окажется посленим

?RTrim("   12345.600",1,"0",".")
?RTrim("   12345.000",1,"0",".")

Если используется поле Character и могут быть еще и концевые пробелы, то в список символов надо добавить еще и пробел. Тогда получим такую команду

select MyTab
REPLACE ALL MyField WITH RTrim(MyField, 1, "0", ".", " ")
17 апр 08, 17:13    [5562785]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658

"ВладимирМ" <nospam@sql.ru> сообщил/сообщила в новостях следующее:
news:5562785@sql.ru...
> ?RTrim(" 12345.600",1,"0",".")
> ?RTrim(" 12345.000",1,"0",".")

?RTrim("1234500.000",1,"0"," ",".") && Даст неверныей результат
?RTRIM(RTrim("1234500.100 ",1,"0"," "),1,".")


Posted via ActualForum NNTP Server 1.4

17 апр 08, 17:38    [5563010]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658

> Автор: Погодин
> Если VFP9, то так (у меня переменная 9 цифр, 3 после запятой)
>
> ALLTRIM(ALLTRIM(STR(MyVar,9,3),'0'),'.',' ')


В данном случае поле текстовое и потому могут быть последними пробелы. Думаю
так будет корректнее:

?ALLTRIM(ALLTRIM(STR(1,9,3),'0',' '),'.')



(Пробелы внутри первого alltrim)


Posted via ActualForum NNTP Server 1.4

17 апр 08, 17:41    [5563030]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
Dima T
Member

Откуда:
Сообщений: 15294
Galyamov Rinat
?RTrim("1234500.000",1,"0"," ",".") && Даст неверныей результат

Вариант последовательной замены не даст ошибки:
? RTrim(RTrim("1234500.000", 1, "0", " "), 1, ".")

Но стоит случайно REPLACE дважды сделать, и тут все съедет.

Поэтому надо обрезание делать только в момент преобразования из числа в строку, тогда точка однозначно присутствует.

Чтобы причесать то что есть - надежней преобразовать строку в число, потом обратно с обрезанием:
ALLTRIM(ALLTRIM(STR(val(chrtran("1234500.000", ',.', set('point') + set('point'))), 12, 3),'0',' '), set('point'))
17 апр 08, 17:58    [5563167]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658


> ALLTRIM(ALLTRIM(STR(val(chrtran("1234500.000", ',.', set('point') +
> set('point'))), 12, 3),'0',' '), set('point'))


Ну и еще одна поправка:
lcNum='0.001'

lcNum='0.001'

?ALLTRIM(ALLTRIM(STR(val(chrtran(lcNum, ',.', set('point') + set('point'))),
12, 3),'0',' '), set('point')) && Опять неверно!!!



Вроде вот так будет совсем правильно:

lcNum=' 0.010 '

?RTRIM(RTRIM(ALLTRIM(STR(val(chrtran(lcNum, ',.', set('point') +
set('point'))), 12, 3),' '),1,'0'), set('point'))





:)


Posted via ActualForum NNTP Server 1.4

17 апр 08, 18:27    [5563320]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
Dima T
Member

Откуда:
Сообщений: 15294
Galyamov Rinat

Ну и еще одна поправка:
...

Вроде вот так будет совсем правильно:

lcNum=' 0.010 '

?RTRIM(RTRIM(ALLTRIM(STR(val(chrtran(lcNum, ',.', set('point') + set('point'))), 12, 3),' '),1,'0'), set('point'))

Поправка принимается, но так чуть покороче будет:
? ALLTRIM(RTRIM(STR(val(chrtran(lcNum, ',.', set('point') + set('point'))), 12, 3),'0',' '), set('point'), ' ')

:)
17 апр 08, 21:11    [5563716]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
С любым set point, с любым кол-ом знаков после запятой, в т.ч. целые числа, и покороче :)
? str(nval,16,iif(nVal%1=0,0,len(alltrim(transform(nVal%1),"0"))-1))

Тест
dimension aTest[5]
aTest[1] = 0
aTest[2] = 123
aTest[3] = 1230.10300
aTest[4] = -12030.01030
aTest[5] = 0.0010

for i=1 to alen(aTest)
   nVal = aTest[i]
   ? nVal, str(nval,16,iif(nVal%1=0,0,len(alltrim(transform(nVal%1),"0"))-1))
endfor
18 апр 08, 10:47    [5565024]     Ответить | Цитировать Сообщить модератору
 Re: убрать незначимые нули  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
Для версий до 9-ки чуть сложнее
? str(nVal,16,iif(nVal%1=0, 0, len(alltrim(chrtran(transform(nVal%1),"0"," ")))-1))
18 апр 08, 10:59    [5565106]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить