Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.12.28;
Скачать: CL | DM;

Вниз

Строка фиксированной ширины с помощью Format   Найти похожие ветки 

 
Alex80   (2013-12-06 04:54) [0]

Надо вывести вещественное число в виде строки фиксированной ширины. Если это делать так Format("%8.7f" ... , то вне зависимости от того сколько перед запятой знаков, после запятой всегда будет 7 знаков, поэтому фиксированной ширины не получается.

Если Format("%8.7g" ... - то вроде как надо, всегда ширина 8 знаков, но если в конце числа после запятой нули, то она их сотрёт, и получается число укороченное.

Можно вообще добиться фиксированной ширины через Format? Или никак?


 
Inovet ©   (2013-12-06 06:09) [1]

Посмотри ещё FormatFloat


 
Jeer ©   (2013-12-06 10:16) [2]

Иногда проще самому ручками, чем в справку лезть:)

function Float2StrFixWidth(v: extended; p,d: integer): string;
var i: integer;
begin
  Result := FloatToStrF(v, ffFixed, p+d,d);
  i := Pos(#46,Result);
  if i > 0 then Result := DupeString(#48, p - i +1 ) + Result;
end;

Длина строки (включая лидирующие нули) перед точкой обеспечивается параметром p, а после точки - d


 
Alex80   (2013-12-07 08:33) [3]


> Jeer ©   (06.12.13 10:16) [2]
> Иногда проще самому ручками, чем в справку лезть:)

Получается вот такая байда:


000.10000
001.00000
010.00000
100.00000
1000.00000
1E10
10000000.00000


Куча цифр сдвинута, хотя 1000.00000
и 10000000.00000 вполне могли бы поместиться в заданную ширину.
Плюс спереди зачем-то нули. Куда полезнее показать бОльшую точность после запятой, чем пририсовывать спереди нули.


 
Alex80   (2013-12-07 08:39) [4]

Да, цифры типа "0.00000001" округляются до нуля, хотя могли бы влезть или показываться в виде 1E-8. И опять же 1E-8 - слишком короткая строка.


 
Jeer ©   (2013-12-07 13:39) [5]

Считай это заготовкой для тебя:)


 
Юрий Зотов ©   (2013-12-07 21:54) [6]

> Alex80   (06.12.13 04:54)

> Надо вывести вещественное число в виде строки фиксированной
> ширины. Если это делать так Format("%8.7f" ... , то вне
> зависимости от того сколько перед запятой знаков, после
> запятой всегда будет 7 знаков, поэтому фиксированной ширины
> не получается.


Получается, только общую ширину (первое число) надо задавать не 8, а больше (7 знаков дробной части, плюс разделитель - это уже 8 и получается, что места для целой части Вы не оставили). Попробуйте, например, %20.7f (и не забудьте, что нужен моноширинный шрифт).


 
Дмитрий СС   (2013-12-07 23:02) [7]


>  i := Pos(#46,Result);

Зачем писать код символа, когда можно сам символ? Любите издеваться над тем, кто потом будет разбираться в вашем коде и над собой?)


 
Jeer ©   (2013-12-07 23:08) [8]

Лишний тренинг не помешает, а мне проще так - я их наизусть помню:)


 
Alex80   (2013-12-08 10:18) [9]


> Jeer ©   (07.12.13 13:39) [5]
> Считай это заготовкой для тебя:)

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


 
Alex80   (2013-12-08 10:25) [10]


> Попробуйте, например, %20.7f (и не забудьте, что нужен моноширинный
> шрифт).

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

Например

1234E-9

4 значащих цифры, и степень. Ширина - 7.


 
Юрий Зотов ©   (2013-12-08 12:25) [11]

> Alex80   (08.12.13 10:25) [10]

Чтобы все числа показывались оптимальным образом, нужно заранее знать их диапазон, а если этот диапазон заранее неизвестен, то придется ориентироваться на максимальный. Например, для чисел double:

<знак><d.dddddddddddddd>E<знак><ddd>

что соответствует формату -22.15e

Но лидирующий знак "плюс" придется добавлять руками.


 
Alex80   (2013-12-08 13:05) [12]


> Чтобы все числа показывались оптимальным образом, нужно
> заранее знать их диапазон, а если этот диапазон заранее
> неизвестен, то придется ориентироваться на максимальный.

Человек задающий ширину сам знает диапазон и точность которая ему нужна. Для меня в 99% случаев хватает трёх-четырёх значащих цифр. А степени за E9 не выходят.


 
Юрий Зотов ©   (2013-12-08 13:20) [13]

> Alex80   (08.12.13 13:05) [12]

> Человек задающий ширину сам знает диапазон и точность
> которая ему нужна.

Убедили. Задавайте.

> в 99% случаев

В компьютере 99% не бывает. Или сто, или ноль.


 
Inovet ©   (2013-12-08 16:29) [14]

> [13] Юрий Зотов ©   (08.12.13 13:20)
> В компьютере 99% не бывает. Или сто, или ноль.

Двоичные они, однако.


 
sniknik ©   (2013-12-08 16:52) [15]

> Для меня в 99% случаев хватает трёх-четырёх значащих цифр.
ну и сделай тогда 4 значащих, а оставшийся 1% посылай на хрен... что не пойдет? тогда не морочь голову - нужно 100%.


 
Jeer ©   (2013-12-08 18:41) [16]

>Мне нужна не заготовка, а готовое.

Это на паперти подают, убогим.


 
Alex80   (2013-12-10 20:21) [17]


> Это на паперти подают, убогим.

Я подаю там где просят.


 
Jeer ©   (2013-12-10 21:56) [18]

>Я подаю там где просят.

Ну да, только это ты сюда пришел с вопросом, а не наоборот.
Тебе подали.
Иди и думай.


 
Alex80   (2013-12-11 10:23) [19]


> Jeer ©   (10.12.13 21:56) [18]
> Тебе подали.

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

Зато вы мне тыкнули. Я к вам на вы, а вы мне тыкаете.


 
Jeer ©   (2013-12-11 12:40) [20]

>Практической пользы - ноль.

Дан пример, как можно подойти к решению задачи. Этого достаточно для включения мозга.

>Зато потерянное время на то

Не теряй время на форумах, думай сам.

Ты/Вы - для меня без разницы. Можешь принять как даность.

Ну и что такое фиксированная ширина?

12.34567
1234.567
123456.7
1234567

Так, что ли?


 
Jeer ©   (2013-12-11 12:44) [21]

или "1234567."


 
Jeer ©   (2013-12-11 13:06) [22]

Тогда смотри на такой вариант:)

Copy(tmp, 1, i - 1) + #46 + Copy(tmp, i + 1, w - i);


 
Inovet ©   (2013-12-11 13:30) [23]

> [20] Jeer ©   (11.12.13 12:40)
> Так, что ли?

Похоже, не знает что хочет. Или всё понимает, но сказать не может.


 
Jeer ©   (2013-12-11 14:06) [24]

>Похоже, не знает что хочет. Или всё понимает, но сказать не может.

Это очевидно уже с первого поста, зато требует выказывать уважение и предоставить "профессиональный" код :)



Страницы: 1 вся ветка

Текущий архив: 2014.12.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.007 c
15-1400858649
Kerk
2014-05-23 19:24
2014.12.28
[lytdybr] Free instant messaging


6-1273586835
kernel
2010-05-11 18:07
2014.12.28
Сервер. Сокеты, потоки.


15-1400963402
Юрий
2014-05-25 00:30
2014.12.28
С днем рождения ! 25 мая 2014 воскресенье


3-1296112876
TheEd
2011-01-27 10:21
2014.12.28
глюк или не глюк???


2-1386759097
Йа
2013-12-11 14:51
2014.12.28
Delphi, Excel 2007, установить параметры автофильтра