Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2010, 14:09   #1
dimcoff
 
Регистрация: 10.12.2007
Сообщений: 3
По умолчанию VAL(s,n,m)

Всем добрый день!
возникла проблема:
в блокноте находятся числа в столбик
"
-126.6
45.8
+569.3
"
перед некоторыми есть 3 пробела. В переменную строкового типа str1 копирую 8 символов, получается, например " -126.6". Далее применяю val:

n:=0;
val(str1,n,m);
writeln(n);

Но везде получаются нули. В чем проблема?
dimcoff вне форума Ответить с цитированием
Старый 14.03.2010, 18:15   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

А m чему равно? это номер позиции, где происходит ошибка преобразования.
_Dmitry вне форума Ответить с цитированием
Старый 14.03.2010, 19:17   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

благодаря такому коду:
Код:
var n : double;
  s : array[1..4] of string;
  i,m : integer;
begin
  s[1]:= '  -126.6  ';
  s[2]:= '    -126.6';
  s[3]:= '      45.8 ';
  s[4]:= '  +569.3';
  for i:= 1 to 4 do begin
    n:=0;
    val(s[i],n,m);
    if m=0 then
      writeln(s[i], ' = ', n:7:3)
    else
      writeln('v stroke "',s[i],'" oshibka v posicii ',m );
  end;
  readln;
end.
легко убедиться, что функции VAL мешают пробелы в конце строки...
можно решить, например, такой функцией:
Код:
{from TPSTRING}
{*********************************************************}
{*                  TPSTRING.PAS 5.05                    *}
{*        Copyright (c) TurboPower Software 1987.        *}
{* Portions copyright (c) Sunny Hill Software 1985, 1986 *}
function Trim(S : string) : string;
    {-Return a string with leading and trailing white space removed}
  var  I : Word; SLen : Byte absolute S;
  begin
    while (SLen > 0) and (S[SLen] <= ' ') do Dec(SLen);
    I := 1;
    while (I <= SLen) and (S[I] <= ' ') do Inc(I);
    Dec(I);
    if I > 0 then Delete(S, 1, I);
    Trim := S;
  end;
ну и использовать, соответственно так:
Код:
 str1 := Trim(str1);
 val(str1,n,m);

Последний раз редактировалось Serge_Bliznykov; 14.03.2010 в 19:19.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.03.2010, 19:29   #4
.Phoenix
Форумчанин
 
Регистрация: 02.04.2009
Сообщений: 235
По умолчанию

Serge_Bliznykov он цифры читает из файла, это не массив.
Всё гениальное - просто!
.Phoenix вне форума Ответить с цитированием
Старый 14.03.2010, 22:40   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Serge_Bliznykov он цифры читает из файла, это не массив.
и что?!!!!!
от этого VAL начинает работать по другому?!
Или кому-то не понятно, что это тестовая программа и массив нужен только для тестирования?!!

или Вам такой код понятнее?!
Код:
 Assign(f, 'file.txt');
 Reset(f);
 while not eof(f) do begin
   readln(f, str1);
   n:=0;
   val(trim(str1),n,m);
   if m=0 then
      ... что-то делаем с прочитанным числом в n
   else 
      ... реакция на ошибку - ошибка - в строке НЕ ЧИСЛО
 end;
 Close(f);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.03.2010, 23:34   #6
Gonzo
Форумчанин
 
Аватар для Gonzo
 
Регистрация: 07.03.2009
Сообщений: 123
По умолчанию

Конечно val будет тормозить на пробелах и вообще на любых символах не вxодящих в множество ['0'..'9','.','-']. Возвращает позицию первого встреченного символа не входящего в это множество. Еще одна особеность: если первый символ '.' а далее идут цифры, то ошибки не выдается и целая часть формируется равной нулю.
Не говорите что мне делать, и я не скажу куда Вам идти.
Пишу программы на заказ на Delphi и Pascal
Форум разработчиков Pascal и Delphi
Gonzo вне форума Ответить с цитированием
Старый 16.03.2010, 00:05   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
Сообщение от Gonzo Посмотреть сообщение
Конечно val будет тормозить на пробелах и вообще на любых символах не вxодящих в множество ['0'..'9','.','-']. Возвращает позицию первого встреченного символа не входящего в это множество. Еще одна особеность: если первый символ '.' а далее идут цифры, то ошибки не выдается и целая часть формируется равной нулю.
Если уж о форматировании пошла речь, то val и 16-ричные числа понимает с символом $ и латинскими a..f (большими и маленькими без разницы)
Код:
val('$A', x, q)
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual basic val Alfonso1 Софт 5 30.11.2009 15:51
Калькулятор val Alfonso1 Софт 5 30.11.2009 14:27
Val и FormatNumber Волк Microsoft Office Excel 1 24.03.2009 08:57
Проверка Edit, через val.. r-tem Компоненты Delphi 2 13.12.2007 20:19
про VAL Максим-2 Общие вопросы Delphi 7 22.07.2007 12:29