powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как в отчете отображать целые числа без дробной части?
47 сообщений из 47, показаны все 2 страниц
Как в отчете отображать целые числа без дробной части?
    #35650463
johngorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос вообщем такой, как в отчете отображать целые числа без дробной части, т.е. если поле все таки имеет какие то знаки после запяой, но и встречаются целые числа? Вот например чтобы 4.564 так и отображалось, а вот 8.000 - отображалось как 8. И если это воозможно то поделитесь как сделать тоже самое в гриде, еслит кто знает. Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35650500
Фотография Валентин Н.Карелин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johngorn, для этого есть свойство Grid - DynamicInputMask и признак Empty(). Если

k = 4.564
Form.Grid.Column1.DynamicInputMask = 'IIF(EMPTY(k-INT(k)), "999 999", "999 999.9999")' - поэкспериментируй в этом направлении...

для отчета - EMPTY(k-INT(k)), - выводишь INT(k), если нет, выводишь само k
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35650526
johngorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валентин Н.Карелин, спасибо, про грид не знал про свойство DynamicInputMask , а вот с отчетом затупил немного... видно заработался, бывает. Ответ исчерпывающий.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35650543
Фотография Валентин Н.Карелин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
johngornне знал про свойство DynamicInputMask

А вообще семейство свойств Dynamic очень хорошее и гибкое. Грид с его помощью всякими картинками можно заселить, разукрасить строки, в строки вставить объекты (в одной строке Button, в другой CheckBox, в третьей Image и т.д. и всё это в одной колонке), в одной колонке центровать влево, вправо и посередине сразу! О, какой прикол!... Пользуйся...
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35650563
Gendrive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валентин Н.Карелинjohngornне знал про свойство DynamicInputMask

А вообще семейство свойств Dynamic очень хорошее и гибкое. Грид с его помощью всякими картинками можно заселить, разукрасить строки, в строки вставить объекты (в одной строке Button, в другой CheckBox, в третьей Image и т.д. и всё это в одной колонке), в одной колонке центровать влево, вправо и посередине сразу! О, какой прикол!... Пользуйся...

Да, согласен гибкое, но злоупотреблять им сильно не стоит. Ибо при большом количестве всяких динамиков в грайде он тупить наичинает безбожно ;)
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35650752
Фотография Валентин Н.Карелин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GendriveДа, согласен гибкое, но злоупотреблять им сильно не стоит. Ибо при большом количестве всяких динамиков в грайде он тупить наичинает безбожно ;)

А злоупотреблять всегда нехорошо )))). И в Grid и в TreeView и в других объектах. Да и по жизни...
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35650828
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Та же проблема с выводом количеств. В подавляющем большинстве это целое число.
Чтобы везде огород не городить из IIF`ов, я один раз функцию написал и ее пользую:
Код: plaintext
1.
2.
3.
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 )))))
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35650965
johngorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за ответы!!!!
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35656209
Dinozavr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
johngorn, я пользуюсь еще одним способом - преобразовываю число в символьную строку и затем его отображаю там, где надо.
Для этого я сделал специальную функцию StrTrimZero(tnX).
Почему не просто TRANSFORM ? Во-првых TRANSFORM оставляет нули в конце дробной части, а во-вторых, мне приходилось встречаться со случаями, когда вместо трех цифр дробной части выдавался длинный хвост из девяток. Возможно, этот баг уже исправлен - я, к сожалению, не помню конкретного значения.
Одно замечание - это название функции (StrTrimZero) оказалось крайне неудачным - Фокс иногда ассоциирует его с зарезервированными словами. Так что, если будете применять эту функцию, то назовите ее как-нибудь иначе.
Теперь об использовании. Пусть в таблице есть числовое поле ostatok. Тогда в качестве источника данных для поля отчета я пишу StrTrimZero(ostatok). Так же я поступаю, если нужно показать число в ReadOnly текстовом поле формы. В сетке же для колонки этого поля я пишу вычисляемое значение (StrTrimZero(ostatok)) - внешние скобки нужны из-за неудачного названия функции. Т.е. если я опеределяю сетку в коде, то я пишу:
ThisForm.grdMyGrid.grcOstatok.ControlSource = "(StrTrimZero(ostatok))"

Ну и, наконец, код функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
***************************************************************
*  Преобразование числа в строку с отсечением концевых нулей  *
*  в дробной части и необязательным (по умолчанию) отсечением *
*  всех пробелов.  StrTrimZero( 123 . 560 ) -> "123.56"           *
***************************************************************
FUNCTION StrTrimZero
LPARAMETERS tnNumb, tcFormat
* Входные параметры:
*    tnNumb - преобразуемое число.
*   tcFormat - код формата:
*     "Z" - (по умолчанию) - нулевое значение числа 
*				  преобразуется в пустую строку.

* Возвращаемое значение:
*	 Cимвольное представление числа без лидирующих и концевых пробелов,
*	 а также без концевых нулей в дробной части.

IF PARAMETERS() <  2 
     tcFormat = "Z"
ENDIF

IF EMPTY(tnNumb)
     RETURN IIF(tcFormat="Z", "", "0")
ELSE
     IF INT(tnNumb) = tnNumb
          RETURN LTRIM(STR(tnNumb, 18 )) 		
     ELSE
          IF tnNumb >  0  .AND. tnNumb <  1 
               RETURN "0"+CHRTRAN(ALLTRIM(CHRTRAN(STR(tnNumb,  18 ,  5 ), "0", " ")), " ", "0")
           ELSE
	RETURN CHRTRAN(ALLTRIM(CHRTRAN(STR(tnNumb,  18 ,  5 ), "0", " ")), " ", "0")
           ENDIF
      ENDIF
ENDIF
***************************************************************

И, в заключение, - функция, конечно, не быстрая, но на современных машинах вывод сетки не тормозит, ну а про отчеты и говорить нечего. Что же касается "некультурных" RETURN посреди кода, то это для скорости.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35656291
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай напомню, что в версии VFP9 у функций AllTrim(), LTrim(), RTrim() добавлены параметры, в которых можно указать, какие именно символы считать "пробелами". Поэтому отсечение концевых нулей можно сделать проще

Код: plaintext
1.
2.
3.
4.
5.
lnValue =  4 . 564 
?RTrim(str(lnValue, 20 , 18 ),"0",set("POINT"))

lnValue =  8 . 000 
?RTrim(str(lnValue, 20 , 18 ),"0",set("POINT"))

Хотя, как мне кажется, такая "лестница" будет не удобна для восприятия.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35656372
Фотография Валентин Н.Карелин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМНа всякий случай напомню, что в версии VFP9...

Хорошее дополнение, Владимир. Хотя все ваши решения имеют с моей точки зрения один недостаток - они переводят число в строку! Для вывода на печать это по барабану, а для дальнейшей работы с переменной - не очень. Это не РНР, где

Код: plaintext
1.
2.
$a = "10" ;
$b = "2" ;
echo $a*$b
- выведет число 20, именно число . А Fox выдаст ошибку! Не стоит наступать на грабли "несоответствия типов" лишний раз... Но подчёркиваю - это лишь моё личное мнение...
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35656383
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин Н.Карелин[quot ВладимирМ]имеют с моей точки зрения один недостаток - они переводят число в строку!

ИМХО. Этот недостаток нисколько не мешает если преобразование делать непосредственно перед выводом на показ пользователю, т.е. в отчетах или в гриде.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35656795
Dinozavr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМНа всякий случай напомню, что в версии VFP9 у функций AllTrim(), LTrim(), RTrim() добавлены параметры, в которых можно указать, какие именно символы считать "пробелами". Поэтому отсечение концевых нулей можно сделать проще

Действительно, это весьма важно для этой задачи.

Я же, со своей стороны, видимо должен дезавуировать свое предложение относительно функции StrTrimZero(nValue) (см. выше), так как в VFP9 баг TRANSFORM'а, кажется, устранен.
Поэтому, в VFP9 в качестве ControlSource вполне можно использовать выражение:
RTRIM(TRANSFORM(nValue), 1, "0")
Во всяком случае, это работает втрое быстрее, чем предложенная мной ранее StrTrimZero(nValue).

Так что благодарю ВладимираМ за совет, и буду у себя при очередных корректировках заменять функцию StrTrimZero() на более эффективное выражение.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35658446
Dinozavr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ... отсечение концевых нулей можно сделать проще

Код: plaintext
1.
2.
lnValue =  4 . 564 
?RTrim(str(lnValue, 20 , 18 ),"0",set("POINT"))
...
Прошу великодушно извинить меня за занудство, но у этого варианта есть подводный камень.
Попробуйте выполнить:
Код: plaintext
?RTrim(str( 9 . 158 , 20 , 18 ),"0",set("POINT"))
У меня получается 9.1579999... (Это как раз тот баг, который раньше был у TRANSFORM)

В то же время ?RTrim(TRANSFORM(9.158),"0") дает ожидаемый результат. Кстати, в данной задаче для RTrim действительно достаточно именно такого сочетания параметров. И еще, на всякий случай, надо учитывать, что результатом преобразования нуля (0 или 0.000) будет пустая строка.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35658786
Фотография Валентин Н.Карелин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dinozavr?RTrim(str(9.158,20,18),"0",set("POINT"))[/src] У меня получается 9.1579999... (Это как раз тот баг, который раньше был у TRANSFORM)

Ай, молодца!!!... Ай да Dinozavr!!!!....

Господа, ведущие fox-coведы!!!! Прокомментируйте для ведомой братвы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
?RTrim(str( 4 . 158 , 20 , 18 ),"0",set("POINT"))
 4 . 158 
?RTrim(str( 5 . 158 , 20 , 18 ),"0",set("POINT"))
 5 . 158 
?RTrim(str( 6 . 158 , 20 , 18 ),"0",set("POINT"))
 6 . 158 
?RTrim(str( 7 . 158 , 20 , 18 ),"0",set("POINT"))
 7 . 158 
?RTrim(str( 8 . 158 , 20 , 18 ),"0",set("POINT"))
 8 . 157999999999999 
?RTrim(str( 9 . 158 , 20 , 18 ),"0",set("POINT"))
 9 . 157999999999999 
?RTrim(str( 10 . 158 , 20 , 18 ),"0",set("POINT"))
 10 . 158 
Dinozavr'у особый отдельный респект и уважуха !!! Таким людям тестерами работать - не было бы в МелкоСкопе багов... А я вам говорил, оставьте число числом. Не переводите в строки! Богу богово, а Кесарю кесарево.... Более 2000 лет назад сказано...
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35659342
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а кроме скрытых багов, есть еще и явные:

?RTrim(TRANSFORM(9000),"0")

?RTrim(str(900,20,18),"0",'.')






Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660110
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин Н.КарелинГоспода, ведущие fox-coведы!!!! Прокомментируйте для ведомой братвы:
Код: plaintext
1.
2.
?RTrim(str( 8 . 158 , 20 , 18 ),"0",set("POINT"))
 8 . 157999999999999 

А что тут комментировать? С дуру можно и х@# сломать

При попытке превысить допустимую точность, фокс начинает показывать как есть. Заявленная точность фокса 15 десятичных знаков. Не надо от него требовать 18.

?RTrim(str(8.158,20, 14 ),"0",set("POINT")) && = 8.158

14 потому что еще один знак перед запятой. Хотя в реальности больше 4-х врядли кому потребуется.

Валентин Н.КарелинА я вам говорил, оставьте число числом. Не переводите в строки! Богу богово, а Кесарю кесарево.... Более 2000 лет назад сказано...

Первые неандертальские программисты так говорили? Не надо тут свое мнение никому навязывать. Написал почему не согласен и успокойся.

А что касается непосредственно конструкции RTrim(str()), то ее реальный косяк в примере Рината показан.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660131
Dima TА что касается непосредственно конструкции RTrim(str()), то ее реальный косяк в примере Рината показан.
И какой там косяк показан? Может я что-то не вижу?
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660199
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.И какой там косяк показан? Может я что-то не вижу?

Не видишь - проверь:
Код: plaintext
?RTrim(str( 9000 . 000 , 20 , 10 ),"0",set("POINT")) && =  9 
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660219
Dima Tпроходящий.И какой там косяк показан? Может я что-то не вижу?

Не видишь - проверь:
Код: plaintext
?RTrim(str( 9000 . 000 , 20 , 10 ),"0",set("POINT")) && =  9 

Очень остроумно.
Так вот как раз и хочу узнать ЧТО я не вижу?
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660248
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Так вот как раз и хочу узнать ЧТО я не вижу?

Если преобразование 9000.000 => "9" это не косяк, а норма, то я не понимаю на что ты смотришь.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660255
Dima Tпроходящий.Так вот как раз и хочу узнать ЧТО я не вижу?

Если преобразование 9000.000 => "9" это не косяк, а норма, то я не понимаю на что ты смотришь.

Правильно ли я понял, что ты ожидаешь увидеть 9000?
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660268
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Правильно ли я понял, что ты ожидаешь увидеть 9000?

Топик перечитай с начала.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660291
Dima Tпроходящий.Правильно ли я понял, что ты ожидаешь увидеть 9000?

Топик перечитай с начала.
Уже давно и не единожды перечитан. Будем конструктивно общаться или будем выплескивать бездоказательные эмоции?
Если первое, для ясности хотелось бы увидеть ожидаемый результат и объяснение причин именно такого ожидания. После чего можно будет приступить к поискам бревна в моем глазу.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660340
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий. Будем конструктивно общаться или будем выплескивать бездоказательные эмоции?

Где конструктив? Общаюсь с тобой в твоем же кратком стиле:
проходящий.И какой там косяк показан? Может я что-то не вижу?

проходящий.Очень остроумно.
Так вот как раз и хочу узнать ЧТО я не вижу?

Откуда мне знать что ты не видишь, если я не знаю что ты видишь? Пиши подробней.

проходящий.Уже давно и не единожды перечитан.
Плохо перечитан. Тема топика:
johngornВопрос вообщем такой, как в отчете отображать целые числа без дробной части, т.е. если поле все таки имеет какие то знаки после запяой, но и встречаются целые числа? Вот например чтобы 4.564 так и отображалось, а вот 8.000 - отображалось как 8.
О ней и речь. Преобразование 9000.000 => "9" явно не в тему.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660372
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" правее символа "."? Почему их не надо убирать? Тем более что и сам символ "." тоже надо убирать?
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660421
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TТема топика:
johngornВопрос вообщем такой, как в отчете отображать целые числа без дробной части, т.е. если поле все таки имеет какие то знаки после запяой, но и встречаются целые числа? Вот например чтобы 4.564 так и отображалось, а вот 8.000 - отображалось как 8.
О ней и речь. Преобразование 9000.000 => "9" явно не в тему.
А хелп надо внимательней читать. Вон и Владимир Максимов направление соответствующее указал. Правда сам немного в коде ошибся. :)
Должно быть примерно так:
Код: plaintext
1.
?RTrim(Rtrim(Str( 9000 . 000 , 20 , 10 ),"0"),Set("POINT"))
?RTrim(Rtrim(Transform( 9000 . 000 ),"0"),Set("POINT"))
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660514
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Написать, что от конструкции
?RTrim(str(9000.000,20,10),"0",set("POINT")) && = 9
ожидается получение строки "9000" очень трудно и некоструктивно?
Если топик перечитан, то во-первых это уже написано.

Повторю краткое содержание выше сказанного:
ВладимирМПоэтому отсечение концевых нулей можно сделать проще
Код: plaintext
1.
lnValue =  8 . 000 
?RTrim(str(lnValue, 20 , 18 ),"0",set("POINT"))


Способ решения задачи был предложен. В нем Dinozavr нашел "скрытый баг"
DinozavrПопробуйте выполнить:
Код: plaintext
?RTrim(str( 9 . 158 , 20 , 18 ),"0",set("POINT"))
У меня получается 9.1579999... (Это как раз тот баг, который раньше был у TRANSFORM)
Валентин Н.Карелин его поддержал и попросил баг прокомментировать.
Galyamov Rinat указал на явный косяк.
Я прокомментировал причину бага найденного Dinozavr`ом и подтвердил показанное Ринатом. Чего еше надо объяснять или доказывать? Не понимаю. Если считаешь что я недостаточно полно объяснил, то возьми сам и допиши недостающее.

проходящий.Так на чем зиждется такое ожидание?
Особенно если учесть ЯВНОЕ указание фнкции Rtrim() удалить все символы "0" и все символы "."?
Чем символы "0" в строке "9000.000" левее символа "." отличаются от символов "0" правее символа "."? Почему их не надо убирать? Тем более что и сам символ "." тоже надо убирать?
Еще раз. Я не ожидаю что с помошью Rtrim() получу преобразование "9000.000" => "9000".

Sergey Sizov.Dima TО ней и речь. Преобразование 9000.000 => "9" явно не в тему.
А хелп надо внимательней читать.
В третий раз :) Я эту конструкцию не предлагал.

Sergey Sizov.Вон и Владимир Максимов направление соответствующее указал. Правда сам немного в коде ошибся. :)
С этого все и началось.

PS 2проходящий, все-таки читай топики с учетом того кто, кому и что ответил.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660523
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?RTrim(Rtrim(Transform(9000.000),"0"),Set("POINT")) у меня возвращает "9"


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660544
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий, ИМХО ты сейчас конкретно не прав.

Т.к. на вопрос "Как обрезать нули справа от запятой" дали ответ:
"RTrim(str(lnValue,20,18),"0",set("POINT"))", который в данном контексте
выдает не тот результат (некорректный при целых числах, кратных 10), который
ожидает автор топика.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660631
Galyamov Rinat
?RTrim(Rtrim(Transform(9000.000),"0"),Set("POINT")) у меня возвращает "9"

Это всего лишь говорит о том, что в качестве разделителя целой и дробной части у тебя используется не точка, а какой-то другой знак.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660675
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, ребята, давайте жить дружно. :)
В топике обсуждаются ДВА разных вопроса.
1. "Глюк", связанный с точностью. Его объяснили.
2. Обрезание незначащих нулей в символьном представлении числа. Решение вроде бы тоже нашлось.
Давайте не будем все валить в одну кучу. Проходящий, как мне показалось, обсуждал только второй вопрос. И потому врят ли стОит на него наезжать по вопросу точности. По этому вопросу он вполне корректен.

Dima T
О ней и речь. Преобразование 9000.000 => "9" явно не в тему.
Теперь и я не понимаю о каком глюке или неправильном поведении Rtrim() идет речь.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660686
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.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( ), для преобразования больших отрицательных чисел.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660733
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov.Dima T
О ней и речь. Преобразование 9000.000 => "9" явно не в тему.
Теперь и я не понимаю о каком глюке или неправильном поведении Rtrim() идет речь.
Не вникай. Наша переписка с Проходящим мне анекдот напомнила про Петьку с Василий Иванычем в самолете:
ВИ: Петька, приборы?
П: Двести
ВИ: Что двести?
П: А что приборы?

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

Sergey Sizov.Так, ребята, давайте жить дружно. :)
Давайте. И перепалку эту прекратим заодно.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660836
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКстати TRANSFORM() в одиночку делает то что изначально пытались сделать

Transform(9000.000) = "9000"
Transform(19.158) = "19,158"

Насторожило что такое решение никто не предложил, поэтому решил проверить. Глючная функция оказывается. Например в 6-ке так:
Код: plaintext
Transform( 9087 . 816 ) => "9087,816000000001"
В 9-ке это нормально отрабатывает, но есть другие косяки, правда помягче:
Код: plaintext
1.
2.
Transform( 7886 . 130 ) => "7886.130"
Transform( 8817 . 600 ) => "8817.600"
Transform( 8817 . 6000000 ) => "8817.6000000"

На целых числах такого нет, только на нецелых.
Вобщем мой вывод: Если иногда не обрезанные нолики в нецелых числах не смертельны, то в VFP9 можно обойтись одним TRANSFORM()
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660884
Dima Tно есть другие косяки, правда помягче:
Код: plaintext
1.
2.
Transform( 7886 . 130 ) => "7886.130"
Transform( 8817 . 600 ) => "8817.600"
Transform( 8817 . 6000000 ) => "8817.6000000"

На целых числах такого нет, только на нецелых.
Вобщем мой вывод: Если иногда не обрезанные нолики в нецелых числах не смертельны, то в VFP9 можно обойтись одним TRANSFORM()
Так какие косяки-то? С какой точностью число дали, с такой и получили строковый результат. Или должно было быть по-другому? Как?
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35660969
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Так какие косяки-то? С какой точностью число дали, с такой и получили строковый результат. Или должно было быть по-другому? Как?

Точно, это уже я хэлп недопонял. Нет косяков. TRANSFORM() нули после запятой отсекает только у целых чисел.
Transform(8817.600) => "8817.600"
Transform(8817.000) => "8817"
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35661013
Ура!!! Консенсус!!!
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35662106
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"проходящий." <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
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35666884
Dinozavr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Galyamov Rinat
Ну а кроме скрытых багов, есть еще и явные:

?RTrim(TRANSFORM(9000),"0")

?RTrim(str(900,20,18),"0",'.')

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

Код: plaintext
IIF(EMPTY(lnValue), "", IIF(INT(lnValue)= lnValue , TRANSFORM(lnValue), LTRIM(RTRIM(STR(lnValue, 18 , 5 ), "0"))))	

Тестирование (выполнение 100000 преобразований) на моем компе дало следующие результаты:
При lnValue = 9.158000 время выполнения 0.2 сек.
Если это выражение оформить как возвращаемое значение функции, то время возрастает до 0.3 сек.
Для сравнения - время для ранее предлагавшейся здесь функции StrTrimZero() при тех же условиях 0.6 сек.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35667066
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DinozavrТестирование (выполнение 100000 преобразований) на моем компе дало следующие результаты:
При lnValue = 9.158000 время выполнения 0.2 сек.
Если это выражение оформить как возвращаемое значение функции, то время возрастает до 0.3 сек.
Для сравнения - время для ранее предлагавшейся здесь функции StrTrimZero() при тех же условиях 0.6 сек.

А мою не тестил?
Код: plaintext
1.
2.
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 )))))
На моем компе для 9.158000 - 0,3 сек, для 9.00000 - 0.19 сек.

Имхо. В данном случае скорость роли не играет, т.к. плюс-минус 0,1-0,2 сек на 100000 погоды не сделают, т.к. обычно надо преобразовать не более сотни значений, изредка несколько тысяч.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #35669918
Dinozavr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, Уважаемый сэр!
Я полагаю, что мы все уже достаточно подробно разобрались в проблеме вывода чисел. Ваша функция, безусловно, также вполне применима. Дальше начинаются вкусовые различия и отработка ограничений конкретной задачи (напримр, как выводить нулевое значение - 0 или пустая строка). Dima TА мою не тестил?
Код: plaintext
1.
2.
3.
 
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 )))))
На моем компе для 9.158000 - 0,3 сек, для 9.00000 - 0.19 сек

Протестировал. У меня для 9.158000 получилось 0,385. И Вы совершенно правы - в данном случае подобная разница в быстродействии абсолютно не существена.

P.S. Кстати, при использовании TRANSFORM для вывода в колонку сетки следует учитывать замечание из HELP'а по TRANSFORM:

Код: plaintext
1.
2.
3.
4.
 
CREATE CURSOR myCursor (col1 n( 5 , 2 ))
INSERT INTO myCursor VALUES (- 555 . 5 ) 
? TRANSFORM(myCursor.col1 )    && Возвращает **.**

И Ваша, и моя функции отработают эту ситуацию нормально. И именно поэтому я в своей функции для дробных чисел применяю конструкцию
Код: plaintext
1.
 
 LTRIM(RTRIM(STR(lnValue, 18 , 5 ), "0"))) 
а не более, казалось бы, изящную
Код: plaintext
1.
 
RTRIM(TRANSFORM(lnValue), "0") 
Всего наилучшего!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как в отчете отображать целые числа без дробной части?
    #37199357
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВалентин Н.КарелинГоспода, ведущие fox-coведы!!!! Прокомментируйте для ведомой братвы:
Код: plaintext
1.
2.
?RTrim(str( 8 . 158 , 20 , 18 ),"0",set("POINT"))
 8 . 157999999999999 


При попытке превысить допустимую точность, фокс начинает показывать как есть. Заявленная точность фокса 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")
Так же отображает неожиданный результат :(
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #37199392
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
set Point To '.'
или точку на запятую поменяй
Код: plaintext
?VAL("91,99")
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #37199531
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #37199549
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TGalyamov RinatPS при установке
SET DECIMALS TO 14
Выражение
?VAL("91.99")
Так же отображает неожиданный результат :(
Тут уже ты сам запутался, сделай
Код: plaintext
set Point To '.'
или точку на запятую поменяй
Код: plaintext
?VAL("91,99")


про запятую или set Point To '.' я не понял. У меня в выражении ?VAL("91.99") стоит точка. Set point to '.' стоит .
Та же ситуация с отображением с погрешностью.
...
Рейтинг: 0 / 0
Как в отчете отображать целые числа без дробной части?
    #37200663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov RinatDima Tпропущено...

Тут уже ты сам запутался, сделай
Код: plaintext
set Point To '.'
или точку на запятую поменяй
Код: plaintext
?VAL("91,99")


про запятую или set Point To '.' я не понял. У меня в выражении ?VAL("91.99") стоит точка. Set point to '.' стоит .
Та же ситуация с отображением с погрешностью.
Извини, я ступил. У меня 91.00 было из-за set Point To ','
Код: plaintext
?VAL("91,99") &&  91 . 989999999999999 
или
Код: plaintext
? val('91,990001') &&  91 . 99000100000001 
Это как-раз та самая погрешность из-за точности в 15.95 знака.
В данном случае надо вывести 16 разрядов, что иногда происходит с ошибкой на 1 в последнем разряде.

PS Это проблема не только фокса, везде так, если использовать 8-байтные двоичные переменные с плавающей запятой. Большую точность можно с использованием типа Currency получить (18 знаков), только там поизвращаться прийдется с передвижением запятой при выводе и с расчетами.
...
Рейтинг: 0 / 0
47 сообщений из 47, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как в отчете отображать целые числа без дробной части?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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