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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2012, 21:25   #1
webber9989
dimgunkin
Форумчанин
 
Аватар для webber9989
 
Регистрация: 06.05.2010
Сообщений: 112
По умолчанию Перевод строки "1984.45" в число и выделение целой части

Здравствуйте!
Запутался напрочь с типами переменных.
Задача такова: из строки "1984.45" сделать число "1984"

Мои наброски:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:Extended;
begin
s:='1898,98';
i:=Int(StrToFloat(s));
ShowMessage(FloatToStr(i));
end;
Сижу читаю литературу, вычитал такое:
Цитата:
Int - Целая часть числа с плавающей точкой
Trunc - Целая часть числа с плавающей запятой
Так как у меня из файла берутся числа в таком формате:
3453.45
2367.87
4567.34
ну и т.д.
Я выбрал Int, так как там число с плавающей точкой

Но у меня ничего не работает. Что тип Int, что Trunc, воспринимают только запятую.

Вот ошибка если с точкой:


Как быть, помогите разобраться пожалуйста.
Я думаю что мой способ древний и корявый, может вы предложите что-то посвежее. Буду рад любой помощи
mail: dimgunkin@gmail.com
skype: dimgunkin
icq: 684-795-212
webber9989 вне форума Ответить с цитированием
Старый 27.11.2012, 22:21   #2
sariman
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 58
По умолчанию

Попробуйте вместо Trunc, использовать Round().
sariman вне форума Ответить с цитированием
Старый 27.11.2012, 22:25   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

decimalseparator:= '.' спасут отца русской демократии.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.11.2012, 22:59   #4
webber9989
dimgunkin
Форумчанин
 
Аватар для webber9989
 
Регистрация: 06.05.2010
Сообщений: 112
По умолчанию

Цитата:
Сообщение от sariman Посмотреть сообщение
Попробуйте вместо Trunc, использовать Round().
Не вариант, мне в принципе не очень важно, будет ли обрезаться всё что после запятой или округляться, дело в том что ошибку это мою не исправит((
mail: dimgunkin@gmail.com
skype: dimgunkin
icq: 684-795-212
webber9989 вне форума Ответить с цитированием
Старый 27.11.2012, 23:09   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вместо изменения decimalseparator можно просто заменять точку на запятую в исходных данных перед преобразованием (функция StringReplace). Настройка decimalseparator понадежней - не будет зависимости от настроек винды
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2012, 23:14   #6
webber9989
dimgunkin
Форумчанин
 
Аватар для webber9989
 
Регистрация: 06.05.2010
Сообщений: 112
По умолчанию

Сделал пока что замену "." на ","

Код:
procedure TForm5.Button2Click(Sender: TObject);
var
  s,d:string;
  i:Extended;
begin
 s:='1898.98';
 d:=StringReplace(s, '.', ',', [rfReplaceAll]);
 i:=Int(StrToFloat(d));
 ShowMessage(FloatToStr(i));
end;
Нужно продолжать дальше программу и тестировать её...

Но с точки зрения кода и так сказать, актуальности, это всё через попу(
Если есть какие-нибудь актуальные и менее громосткие, во всех отношениях, решения, прошу помочь хотя бы направлением в лучшую сторону.
mail: dimgunkin@gmail.com
skype: dimgunkin
icq: 684-795-212
webber9989 вне форума Ответить с цитированием
Старый 27.11.2012, 23:21   #7
webber9989
dimgunkin
Форумчанин
 
Аватар для webber9989
 
Регистрация: 06.05.2010
Сообщений: 112
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Вместо изменения decimalseparator можно просто заменять точку на запятую в исходных данных перед преобразованием (функция StringReplace). Настройка decimalseparator понадежней - не будет зависимости от настроек винды
Спасибо большое)) С разрывом в 5 минут пришли к одному и тому же решению Я так понимаю что больше вариантов, так сказать более легких, нету) Ну что же, всем спасибо за ценные советы и ответы.
mail: dimgunkin@gmail.com
skype: dimgunkin
icq: 684-795-212
webber9989 вне форума Ответить с цитированием
Старый 27.11.2012, 23:22   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

decimalseparator/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.11.2012, 06:42   #9
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Не мучайте компилятор и сделайте всё через DecimalSeparator. Так будет намного правильней.
FaTaL вне форума Ответить с цитированием
Старый 28.11.2012, 10:49   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от webber9989 Посмотреть сообщение
Но с точки зрения кода и так сказать, актуальности, это всё через попу(
Если есть какие-нибудь актуальные и менее громосткие, во всех отношениях, решения, прошу помочь хотя бы направлением в лучшую сторону.
Чтобы ответить на этот вопрос, следует разобраться в причинах происходящего.
В разных языках в качестве десятичного разделителя могут использоваться различные символы.
В Вашем случае в системе = десятичный разделитеть ",", а в данных - ".".
Другими словами, с точки зрения системы, данные содержат ошибку в формате записи числа.
Обнаружение, а тем более исправление ошибок - занятие достаточно сложное в общем случае.
В данном случае исправлять ошибку можно двумя способами:
1. Объяснить системе явно, какой именно символ следует считать десятичным разделителем.
2. Заменить в данных имеющийся десятичный разделитель на тот, который хочет получить система.
Оба способа уже были Вам предложены.
От себя могу добавить, что желательно сделать так, чтобы Ваша программа была нечувствительна ни к настройкам системы (ведь Вашу программу возможно потребуется запускать на другом компьютере), ни к особенностям представления данных (ведь может оказаться, что в другой раз Вам предложат файл с запятой в качестве разделителя).
А для этого, возможно, придется комбинировать оба способа.
Только следует учесть, что существует вариант записи чисел, при котором дробная часть отделяется точкой, а тысячи, миллионы и пр. отделяются запятой.

PS. Кстати, если задача стоит именно так: "присвоить целой переменной целую часть числа, записанного строкой", то решить ее можно гораздо проще:
1. Усечь строку до первого нецифроволо символа.
2. Перевести строку в число.

Последний раз редактировалось s-andriano; 28.11.2012 в 10:57.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal ABC строки - программа, которая каждую встреченную букву "б" заменяет сочетанием "ку" (использовать модули) Raigo Помощь студентам 6 17.05.2012 15:35
[C#] перевод части к типу "string" :eek: JonMagon Помощь студентам 4 19.08.2011 17:52
Перевод "пространственных" координат в "экранные" , смена перспективы , вращение. vedro-compota Общие вопросы Delphi 6 08.06.2010 21:59
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04