Потестируйте! Нужно выявлять ошибки в модуле. Чтоб им можно было пользоваться всем.
fast_StrToInt.
Внимание! Данная библиотека направлена на скорость работы и по возможности для совместимости с разными архитектурами.
Зачем я это сделал? Функция быстрее работает на процессорах x86 чуть менее чем в два раза, на процессорах ARM быстрее, но я не помню насколько. А так как зачастую в программах используется перевод строковых значений в числа, то я думаю это немалый прирост в скорости.
плюсы (+): быстрее скорость работы, сделано на чистом паскале, подойдёт для любой платформы (в данном варианте рассматривается x86/ARM - 32/64 битные. Функция не вылетит с ошибкой! Результат функции булева переменная сообщающая успешен был перевод или нет, сам результат сохраняется в переменной (модуль ge_external_Utils).
минусы (-): возможно не совсем удобная работа с данной функцией, не включён перевод двоичной, восьмеричной и шестнадцатеричной систем (по сути сделать недолго, добавить пару исключений).
примеры использования в программе. Сама функция geStrToInt в соседнем модуле. Пример сделан для разных систем Linux/Windows (возможно и MacOS но не совсем уверен в дефайнах).
Модуль предоставляет 19 (38) пользовательских функций, основанных на трёх (шести) основных:
- Код: Выделить всё
(* Rus: Ниже реализованы стандартные функции для перевода строк в число. Их
* использование будет проще для большинства. Функции отмечены префиксом.
* s_ - функции возвращают результат (если операция была неудачной, то
* в результате вернётся ноль, но вы не узнаете, что операция была неудачной).
* sc_ - результат функций удачная или не удачная была операция. Сам
* конечный числовой результат считывайте в Value.
*)
// sc_ - speed + check
// s_ - speed (not check)
// Rus: Числа со знаком. Здесь нельзя использовать шестнадцатеричные, восьмеричные
// и двоичные числа.
{$IfNDef UNICODESTRING_ONLI}
function sc_StrToShortInt(const Str: useString; out Value: ShortInt): Boolean; {$IfDef ADD_FAST}inline;{$EndIf} // byte
function s_StrToShortInt(const Str: useString): ShortInt; {$IfDef ADD_FAST}inline;{$EndIf} // byte
function sc_StrToSmallInt(const Str: useString; out Value: SmallInt): Boolean; {$IfDef ADD_FAST}inline;{$EndIf} // word
function s_StrToSmallInt(const Str: useString): SmallInt; {$IfDef ADD_FAST}inline;{$EndIf} // word
function sc_StrToInt(const Str: useString; out Value: Integer): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToInt(const Str: useString): Integer; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToInt64(const Str: useString; out Value: Int64): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToInt64(const Str: useString): Int64; {$IfDef ADD_FAST}inline;{$EndIf}
{$IfDef USE_UNICODESTRING}
function sc_StrToShortInt(const Str: UnicodeString; out Value: ShortInt): Boolean; {$IfDef ADD_FAST}inline;{$EndIf} // byte
function s_StrToShortInt(const Str: UnicodeString): ShortInt; {$IfDef ADD_FAST}inline;{$EndIf} // byte
function sc_StrToSmallInt(const Str: UnicodeString; out Value: SmallInt): Boolean; {$IfDef ADD_FAST}inline;{$EndIf} // word
function s_StrToSmallInt(const Str: UnicodeString): SmallInt; {$IfDef ADD_FAST}inline;{$EndIf} // word
function sc_StrToInt(const Str: UnicodeString; out Value: Integer): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToInt(const Str: UnicodeString): Integer; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToInt64(const Str: UnicodeString; out Value: Int64): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToInt64(const Str: UnicodeString): Int64; {$IfDef ADD_FAST}inline;{$EndIf}
// Rus: Числа без знака. Эти функции могут использоваться и для шестнадцатеричныи
// и восьмеричных и двоичных чисел. Данные функции не должны содержать
// ведущие нули для десятеричной системы счисления.
{$IfNDef UNICODESTRING_ONLI}
function sc_StrToByte(const Str: useString; out Value: Byte): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToByte(const Str: useString): Byte; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToWord(const Str: useString; out Value: Word): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToWord(const Str: useString): Word; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToLongWord(const Str: useString; out Value: LongWord): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToLongWord(const Str: useString): LongWord; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToQWord(const Str: useString; out Value: QWord): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToQWord(const Str: useString): QWord; {$IfDef ADD_FAST}inline;{$EndIf}
{$IfDef USE_UNICODESTRING}
function sc_StrToByte(const Str: UnicodeString; out Value: Byte): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToByte(const Str: UnicodeString): Byte; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToWord(const Str: UnicodeString; out Value: Word): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToWord(const Str: UnicodeString): Word; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToLongWord(const Str: UnicodeString; out Value: LongWord): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToLongWord(const Str: UnicodeString): LongWord; {$IfDef ADD_FAST}inline;{$EndIf}
function sc_StrToQWord(const Str: UnicodeString; out Value: QWord): Boolean; {$IfDef ADD_FAST}inline;{$EndIf}
function s_StrToQWord(const Str: UnicodeString): QWord; {$IfDef ADD_FAST}inline;{$EndIf}
В модуле три(шесть) основных процедуры:
[code]{$IfNDef UNICODESTRING_ONLI}
function geCharToInt(const aStr: array of Char; out Value: maxIntVal; Size: maxIntVal = maxSize): Boolean;
function geStrToInt(const Str: useString; out Value: maxIntVal; Size: maxIntVal = maxSize): Boolean; inline;
{$EndIf}
{$IfDef USE_UNICODESTRING}
function geWCharToInt(const aStr: array of WideChar; out Value: maxIntVal; Size: maxIntVal = maxSize): Boolean;
function geStrToInt(const Str: UnicodeString; out Value: maxIntVal; Size: maxIntVal = maxSize): Boolean; inline;
{$EndIf}
{$IfNDef UNICODESTRING_ONLI}
function geCharToUInt(const aStr: array of Char; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean;
function geStrToUInt(const Str: useString; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean; inline;
{$EndIf}
{$IfDef USE_UNICODESTRING}
function geWCharToUInt(const aStr: array of WideChar; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean;
function geStrToUInt(const Str: UnicodeString; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean; inline;
{$EndIf}
{$IfNDef UNICODESTRING_ONLI}
function geHOBCharToUInt(const aStr: array of Char; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean;
function geHOBStrToUInt(const Str: useString; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean; inline;
{$EndIf}
{$IfDef USE_UNICODESTRING}
function geHOBWCharToUInt(const aStr: array of WideChar; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean;
function geHOBStrToUInt(const Str: UnicodeString; out Value: maxUIntVal; Size: maxIntVal = maxSize): Boolean; inline;
{$EndIf} [/code]
Модуль редактирован для разных архитектур. Проверялось только на 64-х битной системе, на 32-х битной не должно вызвать проблем. Для 16-ти и 8-ми битных надо проверять.
В модуле можно поднять уровень текущей архитектуры (UP_CPU в начале модуля). Но вы должны знать, что компилятор это позволяет и система под которую вы это делает (в основном от компилятора зависит). Для 64-х битной системы поднять уровень нельзя на данный момент. При сильном желании (если так хотите) можно, объявите свои данные и работайте с ними. Процедуры вообще не должны зависеть от разрядности системы, поэтому можно поднимать хоть до бесконечности. :)
Добавлен файл конфигурации. В файле конфигурации добавил возможность выбора "вида строки", на выбор:[code]{$DEFINE USE_STRING} // String
{$DEFINE USE_ANSISTRING} // AnsiString
{$DEFINE USE_UTF8STRING} //UTF8String
Если в своём коде вы используете какой-то из видов строк, то лучше переключать дефайны. Иначе можно потерять в скорости из-за перевода строки из одного вида в другой.
Дефайны действуют в порядке приоритета сверху вниз. Нижние отключаться, если какой-то из верхних включен.
Можно отключать часть функций, если вы их не используете. Если включить {$DEFINE USE_UNICODESTRING} и {$DEFINE UNICODESTRING_ONLI}, то можно будет использовать только юникод. Если вылючить первый дефайн, то это отключит использование функций на основе WideChar (юникод), будут использоватьсятолько функции на основе Char.
Все функции работают быстрее стандартных (в 2-3 раза), использующих функцию Val.
Модуль идёт под свободной лицензией Zlib.
Проблему с переполнением вроде решил, требуется проверка.
P. S. хоть какую-то мелочь доделал... правда опять не до конца, надо будет ещё и шестнадцатеричные значения обрабатывать и восьмеричные и двоичные... но тут совсем малость останется.
P.P.S. хоть шестнадцатеричные, восьмеричные и двоичные числа сейчас можно обработать, но по сути ещё не всё доделано. Осталось ещё числа с плавающей запятой обработать...