0 / 0 / 0 Регистрация: 25.11.2016 Сообщений: 1 |
|
1 |
|
25.11.2016, 21:58. Показов 18289. Ответов 2
В общем: мне нужно перевести из величины string в величину real (НЕ INTEGER), мне нужна команда, вроде strtoint(a,b), только strtoreal(a,b), только она, скорее всего по-другому как-то пишется. Помогите)
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
25.11.2016, 21:58 |
Ответы с готовыми решениями: Нельзя преобразовать тип function(x: real): real к real Как определить, к какому типу данных (integer, real, string, char и т.д) относится число или слово Нельзя преобразовать тип array [1..100] of real к real Перевод из string в longint 2 |
1642 / 1091 / 487 Регистрация: 17.07.2012 Сообщений: 5,345 |
|
26.11.2016, 02:16 |
2 |
StrToFloat
0 |
Cyborg Drone Модератор 9481 / 4805 / 3211 Регистрация: 17.08.2012 Сообщений: 15,047 |
||||
27.11.2016, 14:50 |
3 |
|||
Сообщение было отмечено vova_dragun как решение Решение
strtoint(a,b) Перечитайте описание функции. У данной функции всего один аргумент, и правильно будет, например,
Кроме функции StrToFloat, которая есть не во всех диалектах паскаля, можно применить процедуру val.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
27.11.2016, 14:50 |
Помогаю со студенческими работами здесь Ошибка: Нельзя преобразовать тип function x real real к real var String в real Нельзя преобразовать тип function(x: real): real к real Нельзя преобразовать тип function(x: real): real к real Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 3 |
Неописанная переменная
begin S := 1; // Неизвестное имя S end.
Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).
Отсутствующая ;
begin var S: integer S := 1; // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка! end.
begin var S := 1 S := S + 1 // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end. end.
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.
Несовместимость типов при присваивании
begin var S: integer := 1.3; // Нельзя преобразовать тип real к integer end.
Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку. Обратные преобразования не допускаются.
Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:
begin var S := 1.3; // Тип real будет выведен компилятором автоматически end.
Отсутствие закрывающего апострофа литеральной строки
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа end.
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф
Ошибки расстановки запятых и апострофов при выводе строк и выражений
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов end.
Слишком много запятых и апострофов рядом, потому начинающие часто путаются
Надо уяснить правила:
- запятые разделяют разные элементы вывода
- все, что находится в апострофах, будет выведено на экран без изменений
Ошибка ввода
begin var x: integer; read(x); // введите блаблабла и посмотрите, что получится end.
Это — ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой.
Аналогичный фрагмент в более современном и предпочтительном синтаксисе:
begin var x := ReadInteger; end.
Ошибка неинициализированной переменной
begin var x: integer; // Забыли инициализировать или ввести x var r := x * x; // r получает тип integer writeln('Квадрат числа ', x, ' = ', r); end.
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Деление на 0
begin var x := 0; var c := 666 div x; // Здесь происходит деление на 0 end.
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.
Корень из отрицательного числа
begin writeln(sqrt(-1)); // Корень из отрицательного числа end.
В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN — Not a Number
Ссылки
- Программы для начинающих
- Сайт PascalABC.NET: Программы и алгоритмы для начинающих
quloucou628
Вопрос по информатике:
Pascal abc
var
a,c,d: real;
b:char;
begin
…..
if b=’+’ then
d:=a+b;
…..
выдает ошибку «нельзя преобразовать тип string к real»
что делать?
Трудности с пониманием предмета? Готовишься к экзаменам, ОГЭ или ЕГЭ?
Воспользуйся формой подбора репетитора и занимайся онлайн. Пробный урок — бесплатно!
Ответы и объяснения 1
jondeiorost789
Что означают твои многоточия ?
Знаете ответ? Поделитесь им!
Гость ?
Как написать хороший ответ?
Как написать хороший ответ?
Чтобы добавить хороший ответ необходимо:
- Отвечать достоверно на те вопросы, на которые знаете
правильный ответ; - Писать подробно, чтобы ответ был исчерпывающий и не
побуждал на дополнительные вопросы к нему; - Писать без грамматических, орфографических и
пунктуационных ошибок.
Этого делать не стоит:
- Копировать ответы со сторонних ресурсов. Хорошо ценятся
уникальные и личные объяснения; - Отвечать не по сути: «Подумай сам(а)», «Легкотня», «Не
знаю» и так далее; - Использовать мат — это неуважительно по отношению к
пользователям; - Писать в ВЕРХНЕМ РЕГИСТРЕ.
Есть сомнения?
Не нашли подходящего ответа на вопрос или ответ отсутствует?
Воспользуйтесь поиском по сайту, чтобы найти все ответы на похожие
вопросы в разделе Информатика.
Трудности с домашними заданиями? Не стесняйтесь попросить о помощи —
смело задавайте вопросы!
Информатика — наука о методах и процессах сбора, хранения, обработки, передачи, анализа и оценки информации с применением компьютерных технологий, обеспечивающих возможность её использования для принятия решений.
У меня есть CSV-файл, который имеет первые 7 столбцов как varchar (строка), в то время как остальные из них имеют тип данных ‘Real’. Я считаю, что .NET-эквивалент Real — Single.
В любом случае, я попробовал следующее на основе предложения:
,(Import-Csv -Path ".Fact.csv") | Write-SqlTableData -ServerInstance "server.db.com" -DatabaseName
"TestDB" -SchemaName "dbo" -TableName "Fact" -Force
И я получил эту (ожидаемую) ошибку:
Write-SqlTableData : The given value of type String from the data source cannot be converted to type real of the specified target column.
Вопрос в том, как заставить эту утилиту принимать реальные типы данных?
Пример файла csv:
BGSC,MYTrim Code,CC,OC,Ctry Of Prod,Report Year,Scenario,Volume,Gross Revenue ,SA ,ANSR, TM ,TL,"P and Warranty, others",CM ,Total Variable,Variable Profit , EBIT
TOTAL_CKD,TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM,COS_AU,4F80, ,2015,Current, - , - , - , - , - , - , - , - , - , - ," (136,748)"
CXXXXXXXXXX,TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM,COS_AU,4F80, ,2013,Current, - , - , - , - , - , - , - , - , - , - ," 1,647 "
CXXXXXXXXXX,TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM,COS_AU,4F80, ,2014,Current, - ," 16,098 ", (0)," 16,098 ", 1 , - , 8 ," 16,090 ", - ," 16,090 "," 61,219 "
CXXXXXXXXXX,TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM,COS_AU,4F80, ,2015,Current, - ," (12,496)", - ," (12,496)"," (13,386)", - , - , 890 , - , 890 , (192)
3 ответа
Я согласен с Томасом, что ваш CSV-файл находится в очень плохом состоянии. Заголовки окружены пробелами, а также данными. Некоторые числовые значения заключены в квадратные скобки, а другие — нет, и могут включать или не включать символ разделителя тысяч ,
(в вашей локали).
Я бы предложил кое-что почистить так:
$csv = Import-Csv -Path ".Fact.csv"
# clean up the CSV
# get the header names from the first row, trim whitespaces and surround with quotes
$headers = ($csv[0].PSObject.Properties.Name.Trim() | ForEach-Object { '"{0}"' -f $_ }) -join ','
# loop through all data rows in the csv. (each row is a PSObject with properties)
$data = foreach($item in $csv) {
# loop through all properties (fields) in the item
$row = foreach($field in $item.PSObject.Properties.Value) {
'"{0}"'-f ($field -replace '[s(),]' -replace '-', '0')
}
$row -join ','
}
# recombine the headers with the data
$newCsv = $headers, $data
# output on screen if you like
$newCsv | Format-Table -AutoSize
# save to a new file and use that for writing to the sql table
$newCsv | Export-Csv -Path ".Fact2.csv" -NoTypeInformation
,(Import-Csv -Path ".Fact2.csv") | Write-SqlTableData -ServerInstance "server.db.com" -DatabaseName "TestDB" -SchemaName "dbo" -TableName "Fact" -Force
Вот как будет выглядеть CSV после очистки:
"BGSC","MYTrim Code","CC","OC","Ctry Of Prod","Report Year","Scenario","Volume","Gross Revenue","SA","ANSR","TM","TL","P and Warranty, others","CM","Total Variable","Variable Profit","EBIT" "TOTAL_CKD","TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM","COS_AU","4F80","","2015","Current","0","0","0","0","0","0","0","0","0","0","136748" "CXXXXXXXXXX","TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM","COS_AU","4F80","","2013","Current","0","0","0","0","0","0","0","0","0","0","1647" "CXXXXXXXXXX","TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM","COS_AU","4F80","","2014","Current","0","16098","0","16098","1","0","8","16090","0","16090","61219" "CXXXXXXXXXX","TOTAL_MODEL_YEAR_AND_GLOBAL_TRIM","COS_AU","4F80","","2015","Current","0","12496","0","12496","13386","0","0","890","0","890","192"
И не должно быть проблем с преобразованием этих значений в тип ‘Real’
Файл CSV не определяет тип значения. Он имеет только заголовки и поля данных. При импорте все данные имеют тип String. Write-SqlTableData
командлет (пытается) преобразовать эти значения в тип данных, как определено в таблице
0
Theo
11 Май 2020 в 13:53
Следующий код преобразует ваши «числа» в целые числа. Я определил функцию для очистки ваших числовых строк. Затем я использовал Select-Object
, чтобы переопределить некоторые из ваших свойств:
function Sanitize-String {
param(
$String
)
if ($String -match '^-s*$') {
return "0"
} else {
return (($String -replace '["s,]', '') -replace '((d+))', '-$1')
}
}
Import-Csv -Path ".Fact.csv" | Select-Object -Property BGSC,
'MYTrim Code',
CC,
OC,
'Ctry Of Prod',
'Report Year',
Scenario,
@{Name='Volume';Expression={[int](Sanitize-String -String $_.Volume)}},
@{Name='Gross Revenue';Expression={[int](Sanitize-String -String $_.'Gross Revenue ')}},
@{Name='SA';Expression={[int](Sanitize-String -String $_.'SA ')}},
@{Name='ANSR';Expression={[int](Sanitize-String -String $_.ANSR)}},
@{Name='TM';Expression={[int](Sanitize-String -String $_.'TM ')}},
@{Name='TL';Expression={[int](Sanitize-String -String $_.'TL')}},
@{Name='P and Warranty, others';Expression={[int](Sanitize-String -String $_.'P and Warranty, others')}},
@{Name='CM';Expression={[int](Sanitize-String -String $_.'CM ')}},
@{Name='Total Variable';Expression={[int](Sanitize-String -String $_.'Total Variable')}},
@{Name='Variable Profit';Expression={[int](Sanitize-String -String $_.'Variable Profit ')}},
@{Name='EBIT';Expression={[int](Sanitize-String -String $_.'EBIT ')}}
Это работает, но, честно говоря, ваш CSV-файл беспорядок. Можно иметь свойства, включая пробелы. Но действительно ли вам нужно (несколько) начальных или конечных пробелов в имени свойства? Кроме того, попытайтесь вставить числа как можно более сырыми. Не вставляйте кавычки, скобки, пробелы вокруг ваших чисел. Вставьте 0
напрямую вместо -
.
Более автоматизированный способ:
function Sanitize-String {
param(
$String
)
if ($String -match '^-s*$') {
return "0"
} else {
return (($String -replace '["s,]', '') -replace '((d+))', '-$1')
}
}
$csvContent = Import-Csv -Path ".Fact.csv"
$results = @()
foreach ($line in $csvContent) {
$i = 0
$result = New-Object -TypeName psobject
foreach ($prop in $line.PSObject.Properties) {
if ($i -lt 7) {
$result | Add-Member -MemberType $prop.MemberType -Name $prop.Name -Value $prop.Value
} else {
$result | Add-Member -MemberType $prop.MemberType -Name $prop.Name -Value ([int](Sanitize-String -String $prop.Value))
}
$i++
}
$results += $result
}
$results # pipe to your DB for example
0
Thomas
11 Май 2020 в 19:28
При попытке компиляции программы:
var some_var: (real, real) := (1, 2);
begin end.
компилятор выдаёт ошибку:
Возможны два преобразования типа: к типу Tuple<real,real> и к типу Tuple<real,real>
Вероятно, имелось в виду: «к типу Tuple<integer,integer> и к типу Tuple<real,real>»,
но в то же время, странно, что здесь вообще есть ошибка, ведь «some_var» явно указан как (real, real).
PascalABC.net версии 3.6.3 сборка 2547 (01/07/2020)
Спасибо.
У меня в последней (самособранной) версии выдаёт:
Нельзя преобразовать тип Tuple<integer,integer> к Tuple<real,real>
.
Вообще всегда лучше писать var some_var := (1.0, 2.0)
, так на много короче.
Ну, стоит ещё дождаться что скажут разработчики.
Если когда то выдавало Возможны два преобразования типа
— значит, наверное, компилятор пытался преобразовать (1,2)
в (real,real)
. То есть алгоритм этого преобразования уже есть в компиляторе, надо только починить.
С простыми, массивами, записями и множествами такой проблемы не наблюдается:
var some_var: real := 1; // 1
var some_arr: array of real := (1, 2); // [1,2]
var some_rec: record a, b: real end := (a:1; b:2); // (1,2)
var some_set: set of real := [1, 2]; // {2,1}
Предположу, что с кортежами тоже планировалось автоматическое преобразование компилятором к нужному типу.
Пример MovingFrameBasedTime.pas содержит строки:
Key.Left: c.Direction := (-5, 0);
Key.Right: c.Direction := (5, 0);
Key.Up: c.Direction := (0, -5);
Key.Down: c.Direction := (0, 5);
...
c.Direction := (0, 0);
которые как раз не компилируются теперь (с этой ошибкой).
(P. S. Также нужно добавить uses GraphWPF;
в MovingFrameBasedTime.pas)
Скачайте последнюю версию.
Ошибка
Нельзя преобразовать тип Tuple<integer,integer> к Tuple<real,real>
и она правильная. Никто не предполагал делать преобразование между этими типами.
С простыми, массивами, записями и множествами — это специальные инициализаторы, которые работают и в Delphi. Мы делали это для совместимости. С кортежем — другая история. Это NET-тип и Tuple<integer,integer> и Tuple<real,real> неявно друг в друга не преобразуютсчя. Как и List < integer > и List < real >
Пример MovingFrameBasedTime.pas мы немного исправили — работающая версия на сайте. Но вы пишете об ошибке, которая могла быть в ранних версиях — сейчас её нет.
@miks1965
Версия 3.6.3, сборка 2657 (15/08/2020):
А у меня на той же версии компиляция почему то проходит успешно:
Я скачал новую версию отсюда:
http://pascalabc.net/downloads/PascalABCNETSetup.exe
Перед установкой удалил старую версию (сделал Uninstall).
В классе ObjectWPF
определено свойство Direction
:
property Direction: (real,real) read (Dx,Dy) write (Dx,Dy) := (value[0],value[1]);
т.е. если я правильно понял разработчиков, здесь всё-таки будет ошибка:
Нельзя преобразовать тип Tuple<integer,integer> к Tuple<real,real>
Значит, нужно исправить на:
Key.Left: c.Direction := (-5.0, 0.0);
Но почему, в последней версии, у меня осталось старое сообщение об ошибке?
А какая у вас версия .NET установлена? Мы замечали, что эта ошибка как-то с ней связана.
У вас всё понятно — у вас всё работает
@miks1965
У меня установлен и используется .NET версии 4.8.3752.0
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Перевод из Real в String
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Подскажите пожалуйста как перевести из Real в String. |
Chow |
|
FloatToStr() ? |
Булат Шакиров |
|
str |
ZEE |
|
Format |
soevan |
|
Chow спасибо! |
ZEE |
|
+ Сhow #1 |
soevan |
|
Chow спасибо! |
soevan |
|
Chow спасибо! |
soevan |
|
ZEE — к сожалению format не помог, всё равно спасибо за содействие. З.Ы. |
ZEE |
|
>soevan |
DVA |
|
Member Рейтинг (т): 3 |
Цитата soevan, 29.09.03, 17:20:04 ZEE — к сожалению format не помог, всё равно спасибо за содействие. Видимо это какой-то особенный Real. Или format не той версии… |
Song |
|
FloatToStr хватит? |
vovs |
|
Senior Member Рейтинг (т): 2 |
Я пользую str |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0294 ] [ 16 queries used ] [ Generated: 11.02.23, 18:48 GMT ]