Что нового

[Данные, строки] Преобразование строки во float

kristow13

Новичок
Сообщения
76
Репутация
0
Я получаю строку из com порта.
Получаю значения вида >+27.925A0 или >+27.9509E или >+27.53098 и т.д.
Мне для записи в базу надо иметь float топ данных, т.е. без букв в значении...
Буквы появляются только в знаках после запятой, поэтому хочу просто резать значение с буквой до первой буквы...
Подскажите как это сделать?

вот мой код, там я убираю первый символ, а как быть дальше не знаю...
Код:
$otvet = _CommGetstring()
$z1 = StringTrimLeft($otvet, 1)
ConsoleWrite("z1 ="&$z1 & @LF)
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
Код:
$sText = ">+27.925A0"
$sText=StringRegExp($sText, '^.([\-+\d]+(\.\d+)?)', 1)
ConsoleWrite("z1 =" & $sText[0] & @LF)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
kristow13 [?]
резать значение с буквой до первой буквы
Код:
Dim $ar[] = [">+27.925A0",">+27.9509E",">+27.53098"]
For $i = 0 To UBound($ar) - 1
  $float = Number(StringTrimLeft($ar[$i], 1))
  ConsoleWrite($float & @CRLF)
Next
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
InnI,

Весьма лихо. :smile:
Но доктор сказал резать...
Попробуй, для прикола
Код:
Dim $ar[] = [">+27.925A0",">+27.9509E5",">+27.53098"]
 
Автор
kristow13

kristow13

Новичок
Сообщения
76
Репутация
0
Спасибо всем за участие :smile:
Понравилось решение InnI. :beer: Спасибо.
Его и решил использовать в коде.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
автор ты наверно не понял, что решение от InnI работает только для его тестовый воборки. Если тебе попадется число скажем 27.9509E5 то ты вместо 27 целых попадаешь на 2795090
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
InnI,
красивое решение. :ok:

Но я, чисто в академических целях, больше склоняюсь к регулярному выражению
Код:
#include <Array.au3>
$sText = '[">+27925A0",">+27.9509E5",">+27.53098"]'
$aRes=StringRegExp($sText, '.*?>\+(\d+\.{0,1}\d+)', 3)
_ArrayDisplay($aRes)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
И еще варианты до кучи.
Код:
$sStr = '>+27.925A0'

ConsoleWrite(Number(StringRegExpReplace($sStr, '(^\D*)|([[:upper:]].*$)', '')) & @LF)
ConsoleWrite(Number(StringRegExpReplace($sStr, '(^\D*)|([[:alpha:]].*$)', '')) & @LF)
ConsoleWrite(Number(StringRegExpReplace($sStr, '(^\D*)|([A-Z].*$)', '')) & @LF)
ConsoleWrite(Number(StringRegExpReplace($sStr, '(?i)(^\D*)|([a-z].*$)', '')) & @LF)
ConsoleWrite(Number(StringRegExpReplace($sStr, '(^[-+><]*)|([A-Z].*$)', '')) & @LF)
 
Автор
kristow13

kristow13

Новичок
Сообщения
76
Репутация
0
inververs сказал(а):
автор ты наверно не понял, что решение от InnI работает только для его тестовый воборки. Если тебе попадется число скажем 27.9509E5 то ты вместо 27 целых попадаешь на 2795090
Не совсем понял почему выделенное мной решение не подходит для работы? :scratch:
Я проверил, что при получении значений через com порт, у меня попадались значения без букв, они так и выводились, а значения с буквой резалось до первой буквы.
Код:
$otvet = _CommGetstring() ; тут у меня может быть >+27.925A0 или >+27.9509E или >+27.53098 и т.д.
$as = Number(StringTrimLeft($otvet, 1)) ; убираю первый символ, и перевожу в число, как я понял
ConsoleWrite("number ="&$as & @LF) ; получаю 27.925 или 27.9509 или 27.53098
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
kristow13 [?]
Не совсем понял почему выделенное мной решение не подходит для работы
Латинская буква e используется для экспоненциальной записи числа: типы данных (27.925E5 = 2792500 - не float, а int). Другими словами, если буква E будет не последней, то вы получите некорректный результат. Поэтому лучше используйте исправленную строку из ответа #6.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
А ещё функция Number скушает и шестнадцатеричный формат числа. То есть 0XFF, вполне может прочитаться не как 0, а как 255.

kristow13
В принципе если вероятность этих чисел для вашего случая 1 к 1000 то можете использовать, если не особо важно, подумаешь 1 раз из 1000 ошибётся. Ну а если вам дали вариант с меньшей вероятностью ошибки, например 1 к 1000000 или вообще невозможность ошибки, то опять же вам выбирать нравится ли вам функция Number по красоте и почти 100% гарантией, или какая то страшная функция регулярных выражений с кучей значков со 100% гарантией.
Конечно регулярное выражение тоже не даст 100% сразу, но можно сделать доводку, а к Number доводку не сделаешь.
 
Верх