|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Dima T Плохо перечитан. Тема топика: johngornВопрос вообщем такой, как в отчете отображать целые числа без дробной части, т.е. если поле все таки имеет какие то знаки после запяой, но и встречаются целые числа? Вот например чтобы 4.564 так и отображалось, а вот 8.000 - отображалось как 8. О ней и речь. Преобразование 9000.000 => "9" явно не в тему. Хорошо перечитан. Написать, что от конструкции ?RTrim(str(9000.000,20,10),"0",set("POINT")) && = 9 ожидается получение строки "9000" очень трудно и некоструктивно? Так на чем зиждется такое ожидание? Особенно если учесть ЯВНОЕ указание фнкции Rtrim() удалить все символы "0" и все символы "."? Чем символы "0" в строке "9000.000" левее символа "." отличаются от символов "0" правее символа "."? Почему их не надо убирать? Тем более что и сам символ "." тоже надо убирать? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 13:37 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Dima TТема топика: johngornВопрос вообщем такой, как в отчете отображать целые числа без дробной части, т.е. если поле все таки имеет какие то знаки после запяой, но и встречаются целые числа? Вот например чтобы 4.564 так и отображалось, а вот 8.000 - отображалось как 8. О ней и речь. Преобразование 9000.000 => "9" явно не в тему. А хелп надо внимательней читать. Вон и Владимир Максимов направление соответствующее указал. Правда сам немного в коде ошибся. :) Должно быть примерно так: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 13:49 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
проходящий.Написать, что от конструкции ?RTrim(str(9000.000,20,10),"0",set("POINT")) && = 9 ожидается получение строки "9000" очень трудно и некоструктивно? Если топик перечитан, то во-первых это уже написано. Повторю краткое содержание выше сказанного: ВладимирМПоэтому отсечение концевых нулей можно сделать проще Код: plaintext 1.
Способ решения задачи был предложен. В нем Dinozavr нашел "скрытый баг" DinozavrПопробуйте выполнить: Код: plaintext
Валентин Н.Карелин его поддержал и попросил баг прокомментировать. Galyamov Rinat указал на явный косяк. Я прокомментировал причину бага найденного Dinozavr`ом и подтвердил показанное Ринатом. Чего еше надо объяснять или доказывать? Не понимаю. Если считаешь что я недостаточно полно объяснил, то возьми сам и допиши недостающее. проходящий.Так на чем зиждется такое ожидание? Особенно если учесть ЯВНОЕ указание фнкции Rtrim() удалить все символы "0" и все символы "."? Чем символы "0" в строке "9000.000" левее символа "." отличаются от символов "0" правее символа "."? Почему их не надо убирать? Тем более что и сам символ "." тоже надо убирать? Еще раз. Я не ожидаю что с помошью Rtrim() получу преобразование "9000.000" => "9000". Sergey Sizov.Dima TО ней и речь. Преобразование 9000.000 => "9" явно не в тему. А хелп надо внимательней читать. В третий раз :) Я эту конструкцию не предлагал. Sergey Sizov.Вон и Владимир Максимов направление соответствующее указал. Правда сам немного в коде ошибся. :) С этого все и началось. PS 2проходящий, все-таки читай топики с учетом того кто, кому и что ответил. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 14:09 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
?RTrim(Rtrim(Transform(9000.000),"0"),Set("POINT")) у меня возвращает "9" Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 14:11 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
проходящий, ИМХО ты сейчас конкретно не прав. Т.к. на вопрос "Как обрезать нули справа от запятой" дали ответ: "RTrim(str(lnValue,20,18),"0",set("POINT"))", который в данном контексте выдает не тот результат (некорректный при целых числах, кратных 10), который ожидает автор топика. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 14:15 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Galyamov Rinat ?RTrim(Rtrim(Transform(9000.000),"0"),Set("POINT")) у меня возвращает "9" Это всего лишь говорит о том, что в качестве разделителя целой и дробной части у тебя используется не точка, а какой-то другой знак. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 14:38 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Так, ребята, давайте жить дружно. :) В топике обсуждаются ДВА разных вопроса. 1. "Глюк", связанный с точностью. Его объяснили. 2. Обрезание незначащих нулей в символьном представлении числа. Решение вроде бы тоже нашлось. Давайте не будем все валить в одну кучу. Проходящий, как мне показалось, обсуждал только второй вопрос. И потому врят ли стОит на него наезжать по вопросу точности. По этому вопросу он вполне корректен. Dima T О ней и речь. Преобразование 9000.000 => "9" явно не в тему. Теперь и я не понимаю о каком глюке или неправильном поведении Rtrim() идет речь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 14:50 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
проходящий.Galyamov Rinat ?RTrim(Rtrim(Transform(9000.000),"0"),Set("POINT")) у меня возвращает "9" Это всего лишь говорит о том, что в качестве разделителя целой и дробной части у тебя используется не точка, а какой-то другой знак. А хэлп про TRANSFORM() почитать? HELP TRANSFORM() ... Numeric (включая Double, Float, или Integer тип данных) Исключает лидирующие нули и пробелы, а также завершающие нули, находящиеся справа от десятичной точки. Если исходное число является целым, то десятичная точка не указывается в результирующей строке. Например, число 4.0 преобразуется в строку "4" Если исходное число больше нуля, но меньше единицы, в результирующей строке появляется лидирующий ноль. Например, число .4 преобразуется в строку "0.4". Кстати TRANSFORM() в одиночку делает то что изначально пытались сделать т.е. Transform(9000.000) = "9000" Transform(19.158) = "19,158" Правда в хэлпе есть примечание настораживающее: ПримечаниеИспользование функции TRANSFORM( ) для преобразования большого отрицательного числа, имеющего десятичные знаки может привести к неожиданным результатам, из-за числовых преобразований. Вместо данной функции в этих случаях рекомендуется использовать обычную функцию STR( ), для преобразования больших отрицательных чисел. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 14:54 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Sergey Sizov.Dima T О ней и речь. Преобразование 9000.000 => "9" явно не в тему. Теперь и я не понимаю о каком глюке или неправильном поведении Rtrim() идет речь. Не вникай. Наша переписка с Проходящим мне анекдот напомнила про Петьку с Василий Иванычем в самолете: ВИ: Петька, приборы? П: Двести ВИ: Что двести? П: А что приборы? Просто я ответил тем кто спрашивал, а Проходящий недопонял чего-то и начал мне же непонятные вопросы задавать, вместо того чтобы просто высказать свое мнение в дополнение к моему или против моего. Дальше уже я ничего не понял чего от меня хотят :) Sergey Sizov.Так, ребята, давайте жить дружно. :) Давайте. И перепалку эту прекратим заодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 15:07 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Dima TКстати TRANSFORM() в одиночку делает то что изначально пытались сделать Transform(9000.000) = "9000" Transform(19.158) = "19,158" Насторожило что такое решение никто не предложил, поэтому решил проверить. Глючная функция оказывается. Например в 6-ке так: Код: plaintext
Код: plaintext 1. 2.
На целых числах такого нет, только на нецелых. Вобщем мой вывод: Если иногда не обрезанные нолики в нецелых числах не смертельны, то в VFP9 можно обойтись одним TRANSFORM() ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 15:38 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Dima Tно есть другие косяки, правда помягче: Код: plaintext 1. 2.
На целых числах такого нет, только на нецелых. Вобщем мой вывод: Если иногда не обрезанные нолики в нецелых числах не смертельны, то в VFP9 можно обойтись одним TRANSFORM() Так какие косяки-то? С какой точностью число дали, с такой и получили строковый результат. Или должно было быть по-другому? Как? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 15:50 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
проходящий.Так какие косяки-то? С какой точностью число дали, с такой и получили строковый результат. Или должно было быть по-другому? Как? Точно, это уже я хэлп недопонял. Нет косяков. TRANSFORM() нули после запятой отсекает только у целых чисел. Transform(8817.600) => "8817.600" Transform(8817.000) => "8817" ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 16:07 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Ура!!! Консенсус!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2008, 16:21 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
"проходящий." <nospam@sql.ru> сообщил/сообщила в новостях следующее: news:6455551@sql.ru... > > ?RTrim(Rtrim(Transform(9000.000),"0"),Set("POINT")) у меня > возвращает "9" > > Это всего лишь говорит о том, что в качестве разделителя целой и > дробной части у тебя используется не точка, а какой-то другой знак. Нет, просто ?TRANSFORM(9000.000) возвращает 9000 (Без разделителя дробной части) Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2008, 05:15 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Galyamov Rinat Ну а кроме скрытых багов, есть еще и явные: ?RTrim(TRANSFORM(9000),"0") ?RTrim(str(900,20,18),"0",'.') Еще раз прошу прощения за навязчивость, но мне кажется, что с практической точки зрения необходимая функциональность при приемлемом быстродействии обеспечивается выражением: Код: plaintext
Тестирование (выполнение 100000 преобразований) на моем компе дало следующие результаты: При lnValue = 9.158000 время выполнения 0.2 сек. Если это выражение оформить как возвращаемое значение функции, то время возрастает до 0.3 сек. Для сравнения - время для ранее предлагавшейся здесь функции StrTrimZero() при тех же условиях 0.6 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2008, 23:41 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
DinozavrТестирование (выполнение 100000 преобразований) на моем компе дало следующие результаты: При lnValue = 9.158000 время выполнения 0.2 сек. Если это выражение оформить как возвращаемое значение функции, то время возрастает до 0.3 сек. Для сравнения - время для ранее предлагавшейся здесь функции StrTrimZero() при тех же условиях 0.6 сек. А мою не тестил? Код: plaintext 1. 2.
Имхо. В данном случае скорость роли не играет, т.к. плюс-минус 0,1-0,2 сек на 100000 погоды не сделают, т.к. обычно надо преобразовать не более сотни значений, изредка несколько тысяч. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2008, 08:39 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Dima T, Уважаемый сэр! Я полагаю, что мы все уже достаточно подробно разобрались в проблеме вывода чисел. Ваша функция, безусловно, также вполне применима. Дальше начинаются вкусовые различия и отработка ограничений конкретной задачи (напримр, как выводить нулевое значение - 0 или пустая строка). Dima TА мою не тестил? Код: plaintext 1. 2. 3.
Протестировал. У меня для 9.158000 получилось 0,385. И Вы совершенно правы - в данном случае подобная разница в быстродействии абсолютно не существена. P.S. Кстати, при использовании TRANSFORM для вывода в колонку сетки следует учитывать замечание из HELP'а по TRANSFORM: Код: plaintext 1. 2. 3. 4.
И Ваша, и моя функции отработают эту ситуацию нормально. И именно поэтому я в своей функции для дробных чисел применяю конструкцию Код: plaintext 1.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2008, 22:18 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Dima TВалентин Н.КарелинГоспода, ведущие fox-coведы!!!! Прокомментируйте для ведомой братвы: Код: plaintext 1. 2.
При попытке превысить допустимую точность, фокс начинает показывать как есть. Заявленная точность фокса 15 десятичных знаков. Не надо от него требовать 18. ?RTrim(str(8.158,20, 14 ),"0",set("POINT")) && = 8.158 14 потому что еще один знак перед запятой. Хотя в реальности больше 4-х врядли кому потребуется. Напоролся на "Превышение точности" и при указании 14 разрядов после запятой: ?TRANSFORM(91.99000000000000) ?str(91.99000000000000,20,14) А вот так уже выдает ожидаемый результат: ?str(91.99000000000000,14,14) В общем, что-то перемудрили при конвертации в Мелкомягких :( PS при установке SET DECIMALS TO 14 Выражение ?VAL("91.99") Так же отображает неожиданный результат :( ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2011, 09:00 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Galyamov RinatНапоролся на "Превышение точности" и при указании 14 разрядов после запятой: ?TRANSFORM(91.99000000000000) ?str(91.99000000000000,20,14) в 9-ке так работает: ?str(91.99000000000000,16,14) Более 16-ти начинается погрешность двоично-десятичных преобразований, о чем в хэлпе написано: HELP STR()Visual FoxPro contains a limit of 16 digits of precision in numeric calculations. For more information about numeric precision in Visual FoxPro, see Visual FoxPro System Capacities. Galyamov RinatPS при установке SET DECIMALS TO 14 Выражение ?VAL("91.99") Так же отображает неожиданный результат :( Тут уже ты сам запутался, сделай Код: plaintext
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2011, 09:18 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
16 тоже не всегда, точнее 15.95, т.е. 15 знаков всегда точно покажет, 16й в большинстве случаев: Visual FoxPro System CapacitiesMiscellaneous: 64 bits = 8 bytes Largest number = 10 ^ 308 = 2 ^ 1023 -> 10 bits per exponent + 1 for exponent sign plus 1 for number sign => 12 bits Leaving 52 bits for the mantissa + 1 for implied normalized bit -> 53 bits LOG10(2^53) = 15.95 decimal digits accuracy ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2011, 10:14 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Dima TGalyamov RinatPS при установке SET DECIMALS TO 14 Выражение ?VAL("91.99") Так же отображает неожиданный результат :( Тут уже ты сам запутался, сделай Код: plaintext
Код: plaintext
про запятую или set Point To '.' я не понял. У меня в выражении ?VAL("91.99") стоит точка. Set point to '.' стоит . Та же ситуация с отображением с погрешностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2011, 10:22 |
|
Как в отчете отображать целые числа без дробной части?
|
|||
---|---|---|---|
#18+
Galyamov RinatDima Tпропущено... Тут уже ты сам запутался, сделай Код: plaintext
Код: plaintext
про запятую или set Point To '.' я не понял. У меня в выражении ?VAL("91.99") стоит точка. Set point to '.' стоит . Та же ситуация с отображением с погрешностью. Извини, я ступил. У меня 91.00 было из-за set Point To ',' Код: plaintext
Код: plaintext
В данном случае надо вывести 16 разрядов, что иногда происходит с ошибкой на 1 в последнем разряде. PS Это проблема не только фокса, везде так, если использовать 8-байтные двоичные переменные с плавающей запятой. Большую точность можно с использованием типа Currency получить (18 знаков), только там поизвращаться прийдется с передвижением запятой при выводе и с расчетами. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2011, 16:19 |
|
|
start [/forum/search_topic.php?author=VBA_Kiddy&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
13ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 440ms |
total: | 624ms |
0 / 0 |