2013-11-26 5 views
0

Как определить, содержит ли строка поплавок. Например: '0.004'Обнаруживать, если строка содержит поплавок?

Но без использования StrToFloat, потому что эта функция работает медленно, а через итерацию через символы.

function IsInteger(const S: String): Boolean; 
var 
    P: PChar; 
begin 
    P := PChar(S); 
    Result := True; 
    while not (P^ = #0) do 
    begin 
    case P^ of 
     '0'..'9': Inc(P); 
    else 
     Result := False; 
     Break; 
    end; 
    end; 
end; 

Это будет проверить, если строка является положительным целым числом, но не поплавок ..

+0

Как вы узнали, что они медленные? И что мешает вам делать то, что вы хотите? – TLama

+1

@TLama Запустите их в цикле от 0 до 10000000, и вы увидите, что я имею в виду. Не говоря уже об исключении. –

+1

Ну, IntToStr и StrToInt не имеют никакого смысла здесь, так как вы спрашиваете о поплавках. Сделайте что-нибудь 10 миллионов раз и ожидайте немного подождать. –

ответ

5

Я хотел бы использовать TryStrToFloat():

if TryStrToFloat(str, value, FormatSettings) then 
    .... 

Если вы готовы использовать систему по умолчанию широкий формата, то вы можете опустить последний параметр:

if TryStrToFloat(str, value) then 
    .... 
+0

Это просто обертывает StrToFloat в Try Except .. –

+2

Вы уверены? В Delphi 2009 он вызывает TextToFloat. – TLama

+0

@TLama Да, я уверен. Попытка конвертировать не float и не будет генерировать исключение. –

2

Можете ли вы использовать RegEx здесь? Что-то вроде:

([+-]?[0-9]+(?:\.[0-9]*)?) 
+0

Как насчет 1e1, например? –

+0

Лучшая проверка http://www.regular-expressions.info/floatingpoint.html –

0

Проблема с этим вопросом заключается в том, что высказывание «слишком медленно» мало говорит. Что говорит вам профайлер? Есть ли у вас информированное представление о входных данных? Как насчет разных обозначений, например, 6.02e23?

Если ваши входные данные в основном представляют собой шум, то использование регулярных выражений (как ответ here) может улучшить ситуацию, но только в качестве первого фильтра. Затем вы можете добавить второй шаг, чтобы фактически получить свой номер, как объясняется David's answer.

Смежные вопросы