Что нового

[Баг] Странная работа функции StringIsFloat() с некоторыми рус. буквами после точки.

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Насколько я понимаю, функция StringIsFloat($sString) должна возвращать 1 если в $sString присутствуют только цифры и одна точка.
Следующий код возвращает у меня 1 в каждой первой строке MsgBox:
Код:
Dim $aRusFloat[10] = [9, '12.ц', '23.ы', '34.ч', '45.р', '56.т', '67.я', '78.м', '89.и', '91.ь']
Dim $aRusNotFloat[10] = [9, '12.ф', '23.в', '34.й', '45.п', '56.о', '67.ш', '78.з', '89.д', '91.ю']
For $i = 1 To $aRusFloat[0]
	MsgBox(64, $i, 'StringIsFloat(' & $aRusFloat[$i] & ') = ' & StringIsFloat($aRusFloat[$i]) & @CRLF & _
			'StringIsFloat(' & $aRusNotFloat[$i] & ') = ' & StringIsFloat($aRusNotFloat[$i]), 2)
Next

Абослютно одинаковый результат у меня получился при проверке на 3-х Windows XPx32 и на 1-ой Windows 7х64.
Получается, что девять русских букв StringIsFloat() принимает за цифры.
Это баг или что?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Получается, что девять русских букв StringIsFloat() принимает за цифры.
На самом деле больше, вот так можно проверить:

Код:
For $i = 192 To 255
	$vFloat = $i & '.' & Chr($i)
	ConsoleWrite('StringIsFloat(' & $vFloat & ') = ' & StringIsFloat($vFloat) & @LF)
Next


Видимо бага, почему именно эти буквы, понять пока не удаётся...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Хм... одну английскую букву (s) тоже принимает за цифру:

Код:
For $i = 1 To 255
	$sChar = Chr($i)
	$vFloat = $i & '.' & $sChar
	
	If Not StringIsDigit($sChar) And StringIsFloat($vFloat) Then
		ConsoleWrite('StringIsFloat(' & $vFloat & ') = 1' & @LF)
	EndIf
Next
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR
Как не печально, но получается, что функция StringIsFloat() в нынешнем виде абсолютно бесполезна для русскоязычных всех пользователей. Жаль.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
получается, что функция StringIsFloat() в нынешнем виде абсолютно бесполезна для русскоязычных всех пользователей. Жаль.
Можно использовать RegExp:

Код:
Func _StringIsFloat($vString)
	Return StringRegExp($vString, '\A(\d+\.\d*|\d*\.\d+)\z')
EndFunc
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR
Спасибо.
У меня было нечто подобное, но у Вас, как всегда, изящнее. :IL_AutoIt_1:
 
Верх