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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2016, 11:16   #1
Max1097
 
Регистрация: 01.04.2015
Сообщений: 6
По умолчанию Динамика курса валют - Проблема с выводом значений больше 1000 (Delphi)

Всем привет!

У меня проблема с выводом данных курса валют Доллара США с 02.06.1993 по 30.12.1997 значений которых больше 1000. До 999 выводит нормально, а вот больше 1000 уже не может. Парсинг делается через URL ссылку, а ответ сохраняется в XML файле. Проблема заключается в пробеле между сотнями и тысячами, там стоит пробел, а так как график работает только с типом с плавающей запятой. Пробовал убрать пробел многими способами, но это спасало ситуацию.

Вот фото ошибки:



Вот фрагмент кода функции Доллара США, где проходит весь процесс парсинга:
Код:
...
  TCurrencyData = record
    Date: TDateTime;
    Value: String;
  end;

var
  Form1: TForm1;
  CBR: array of TCurrencyData;
  Result1, Result2: TDateTime;
...
function TForm1.GetKursUSD(FileName: string): TDateTime;
var
  XMLDocument: TXMLDocument;
  BufXMLNodeList: IXMLNodeList;
  i: integer;
begin
  try
    XMLDocument := TXMLDocument.Create(Form1);
    XMLDocument.Active := True;
    XMLDocument.LoadFromFile(FileName);
    Result1:=StrToDate(XMLDocument.ChildNodes[1].Attributes['DateRange1']);
    Result2:=StrToDate(XMLDocument.ChildNodes[1].Attributes['DateRange2']);
    if XMLDocument.ChildNodes[1].HasChildNodes <> Null then
    begin
    BufXMLNodeList := XMLDocument.ChildNodes[1].ChildNodes;
    SetLength(CBR, BufXMLNodeList.Count);
    for i := 0 to BufXMLNodeList.Count - 1 do
      begin
        if BufXMLNodeList[i].HasAttribute('Date') then
          CBR[i].Date := StrToDate(BufXMLNodeList[i].Attributes['Date']);
        if BufXMLNodeList[i].HasChildNodes and
          (BufXMLNodeList[i].ChildNodes['Value'].NodeValue <> Null) then
            CBR[i].Value := BufXMLNodeList[i].ChildNodes['Value'].NodeValue;
          ValueListEditor1.InsertRow(DateToStr(CBR[i].Date),CBR[i].Value,true);
          Series1.Add(StrToFloat(CBR[i].Value), DateToStr(CBR[i].Date));
      end;
    end;
  finally
  SetLength(CBR, 0);
  XMLDocument.SaveToFile('cbrUSD.xml');
  XMLDocument.Active := False;
  XMLDocument.Free;
  end;
end;
Сама программа во вложении.
Буду рад если поможете.
Изображения
Тип файла: png курс.png (8.6 Кб, 102 просмотров)
Вложения
Тип файла: rar Курс валют.rar (413.5 Кб, 11 просмотров)
Max1097 вне форума Ответить с цитированием
Старый 21.06.2016, 11:23   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Пробовал убрать пробел многими способами
Какими интерсено?
Код:
StrToFloat(CBR[i].Value)
замени на
Код:
StrToFloat(StringReplace(CBR[i].Value,' ','',rfReplaceAll))
Может быть еще проблема с десятичным разделителем, в зависимости от настроек винды
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.06.2016, 14:59   #3
TaLadno
Форумчанин
 
Регистрация: 03.06.2015
Сообщений: 393
По умолчанию

А всё потому, что там "пробел" очень хитрый, аж неразрывный


Код:
function TForm1.PrepareValue(Value: string): string;
Begin
  result := Value;
  result := AnsiReplaceStr(result, ' ', '');
  result := AnsiReplaceStr(result, chr(160), '');
End;
...

function TForm1.GetKursUSD(FileName: string): TDateTime;
...
Begin
...
  Series1.Add(StrToFloat(PrepareValue(CBR[i].Value)), DateToStr(CBR[i].Date));
...
End;
Вы там держитесь.

Последний раз редактировалось TaLadno; 21.06.2016 в 15:08.
TaLadno вне форума Ответить с цитированием
Старый 21.06.2016, 15:06   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

TaLadno, в точку!!

а если так попробовать?

Код:
StrToFloat(StringReplace(CBR[i].Value,#$A0,'',rfReplaceAll))
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2016, 15:16   #5
TaLadno
Форумчанин
 
Регистрация: 03.06.2015
Сообщений: 393
По умолчанию

Да, так тоже прокатит, только проверку на "нормальный" пробел все равно надо пихать, бо крашится без неё
Вы там держитесь.
TaLadno вне форума Ответить с цитированием
Старый 21.06.2016, 15:20   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от TaLadno Посмотреть сообщение
Да, так тоже прокатит, только проверку на "нормальный" пробел все равно надо пихать, бо крашится без неё
ага. согласен! Вы просто пример кода дописали уже после...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2016, 16:32   #7
Max1097
 
Регистрация: 01.04.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от TaLadno Посмотреть сообщение
А всё потому, что там "пробел" очень хитрый, аж неразрывный


Код:
function TForm1.PrepareValue(Value: string): string;
Begin
  result := Value;
  result := AnsiReplaceStr(result, ' ', '');
  result := AnsiReplaceStr(result, chr(160), '');
End;
...

function TForm1.GetKursUSD(FileName: string): TDateTime;
...
Begin
...
  Series1.Add(StrToFloat(PrepareValue(CBR[i].Value)), DateToStr(CBR[i].Date));
...
End;
Большое спасибо! Помогло. Вот так сюрприз от ЦБ с пробелами. Всем кто откликнулся тоже спасибо. Удачи всем!
Max1097 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi Перераспределить значения переменных X и Y так, Чтобы в X оказалось больше из этих значений, а в Y - меньше. fluush Помощь студентам 1 29.04.2016 11:54
Динамика курса валют - Проблема с выводом дат (Delphi) Max1097 Помощь студентам 2 05.03.2016 08:09
Где найти исходники на Java( 1 проект - больше 1000 классов, 2 проект - больше 100, 3 проект - больше 10) Pti44ka Общие вопросы по Java, Java SE, Kotlin 2 09.09.2010 21:31
Добавление на свой сайт Погоды, Курса валют .... Кристиночка JavaScript, Ajax 3 17.08.2009 10:07