Что нового

Необходимо преобразовать сложную строку в число!

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Исходные данные: "12 345,67" - строковое выражение с пробелом и запятой.
Строку необходимо преобразовать в число, т.е.: 12345.67 - какой способ наиболее приемлем для этого?

Спасибо.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Kalisnik
Друг, начни уже читать справку! Она небольшая и очень грамотная.
Код:
$sNumber = '12 345,67'
$_number = StringReplace($sNumber, ' ', '')
$nNumber = StringReplace($_number, ',', '.')
MsgBox(4096, 'Преобразование', '	Старое число - ' & $sNumber & @CRLF & '	Новое число - ' & $nNumber)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Еще вариант с Рег.Выражением :
Код:
$sNumber = '12 345,67'
$nNumber = StringRegExpReplace ($sNumber, '^(\d*)\s(\d*),(\d*)$', '\1\2.\3')
MsgBox(4096, 'Преобразование', '  Старое число - ' & $sNumber & @CRLF & '  Новое число - ' & $nNumber)
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Мне кажется первое попроще ))) До рег. я еще не дошел. Всего 5-ый день минул как для меня родился AutoIt - если мне память не изменяет.. а память мне часто изменяет :wacko: Но за альтернативу отдельное спасибо :ok: +1
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
OffTopic:
Kalisnik сказал(а):
Всего 5-ый день минул ... если мне память не изменяет ... а память мне часто изменяет ...

Дааа... А что будет на 6-ой день?
:smile:
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Yashied сказал(а):
Дааа... А что будет на 6-ой день?
:smile:

И на шестой день, сотворил Он искусственный интеллект, и назвал его Адамом. И дивился он совершенством его. Но к вечеру ему стало скучно, и написал Он Адаму на AutoIt(e) Баг. И назвал его Евой. В народе Баг прослыл как "Левой", что значило "все что и у Адама, но в половину урезано" (Демо-версия)... Однако вскоре Ева стала утверждать что Баг - это Адам. Мыл медленно работает, неожиданно заканчивает, говорит о каких-то непонятных вещах и имеет кучу ненужных прибамбасов... Но это уже другая история.
День седьмой: сильно болела голова и Он долго вспоминал, что делал все шесть дней....
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
gregaz [?]
Еще вариант с Рег.Выражением
Это специфичное к строке выражение (без пробелов не сработает), чтобы было поуниверсальнее (немного), нужно добавить знак вопроса (придаёт предыдущему символу аттрибут "опциональный") после «\s»:

Код:
$nNumber = StringRegExpReplace($sNumber, '^(\d+)\s?(\d+),(\d+)$', '\1\2.\3')


тут если пробела не будет, то это выражение всё равно сработает.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я не пойму зачем вообще для такой тривиальной задачи использовать регулярные выражения, делается в одну строчку.

Код:
StringStripWS(StringReplace($sNumber, ',', '.'), 8)
 

CreatoR

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

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Yashied [?]
не пойму зачем вообще для такой тривиальной задачи использовать регулярные выражения, делается в одну строчку.
Я думаю при большом объеме преобразований это скажется на времени обработки
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
gregaz сказал(а):
Я думаю при большом объеме преобразований это скажется на времени обработки...

Совершенно верно, и не в лучшую сторону.

Код:
$sNumber = '12 345,67'

$Timer = TimerInit()
For $i = 1 To 1000000
	$nNumber = StringRegExpReplace ($sNumber, '^(\d*)\s(\d*),(\d*)$', '\1\2.\3')
Next
ConsoleWrite(TimerDiff($Timer) & @CR)

$Timer = TimerInit()
For $i = 1 To 1000000
	$nNumber = StringStripWS(StringReplace($sNumber, ',', '.'), 8)
Next
ConsoleWrite(TimerDiff($Timer) & @CR)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Yashied [?]
Совершенно верно, и не в лучшую сторону.

Убедил. Весьма полезная дискуссия получилась.
Развеялся миф ( по крайней мере для меня) о полном превосходстве рег. выражений.
Все зависит от задачи и грамотного составления рег. выражения (для обеспечения мин . операций внутри него)
 
Верх