Как преобразовать строку в число?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Romul_Ner
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 25.07.2005 (Пн) 2:50

Как преобразовать строку в число?

Сообщение Romul_Ner » 27.07.2005 (Ср) 4:36

Как преобразовать строку в число?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.07.2005 (Ср) 4:54

Код: Выделить всё
Val(строка)
Изображение

Snussi
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 151
Зарегистрирован: 21.07.2004 (Ср) 18:08
Откуда: Москва, Россия

Сообщение Snussi » 27.07.2005 (Ср) 9:34

А вот и не факт!
Val воспримет только точку как дес. разделитель.
Имхо, лучше CDbl, CINT,Clng и тд. Правда, они воспринимают как дес. разделитель символ, установленный в региональных настройками.

Так что, смотря что нужно делать :)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.07.2005 (Ср) 9:43

Snussi писал(а):А вот и не факт!
Val воспримет только точку как дес. разделитель.
Имхо, лучше CDbl, CINT,Clng и тд. Правда, они воспринимают как дес. разделитель символ, установленный в региональных настройками.

Так что, смотря что нужно делать :)


Заменить точку на региональный разделитель и преобразовать в число:

Код: Выделить всё
CDbl(Replace(MyString,".",Format(0,".")))


Это сработает во всех случаях...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.07.2005 (Ср) 11:16

а с еще большей гарантией сработает
Код: Выделить всё
Val(Replace(MyString,",",".")
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.07.2005 (Ср) 11:18

Да ну? Даже когда десятичный разделитель - точка с запятой?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 27.07.2005 (Ср) 11:19

!Viper! писал(а):а с еще большей гарантией сработает
Код: Выделить всё
Val(Replace(MyString,",",".")


Ну большей-то гарантии тут нет совершенно.
Кроме того, если юзер применяет в качестве разделителя нечто отличное от точки и запятой? Ведь теоретически это возможно... :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.07.2005 (Ср) 11:42

соответственно неплохо бы узнать какой разделитель применяет пользователь.

в реестре это лежит здесь :

HKEY_CURRENT_USER\Control Panel\International

строковый параметр sDecimal

Возможно есть и API функция, которая позволяет получить этот разделитель не заходя в реестр
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.07.2005 (Ср) 11:58

Так вот как раз format$(0, ".") и получит этот разделитель.
Внимательно фтыкаем написанное выше.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.07.2005 (Ср) 12:13

GSerg писал(а):Так вот как раз format$(0, ".") и получит этот разделитель.


как это????
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.07.2005 (Ср) 12:18

Выполни: msgbox format$(0, ".")
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.07.2005 (Чт) 11:06

GSerg писал(а):Выполни: msgbox format$(0, ".")


Ну и получил я приглашение в виде точки. И что?
Если вместо "." поставить ",", получим запятую и так далее...

в чем фишка то?
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.07.2005 (Чт) 11:08

Сходи в свои национальные виндовские настройки. И посмотри, что там стоит десятичным разделителем.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.07.2005 (Чт) 11:19

!Viper! писал(а):в реестре это лежит здесь :

HKEY_CURRENT_USER\Control Panel\International

строковый параметр sDecimal


тут они и есть. настройки то, национальные
Весь мир матрица, а мы в нем потоки байтов!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 28.07.2005 (Чт) 11:55

Hint: поменяй ручками десятичный разделитель на что-нибудь непотребное, а потом еще раз выполни msgbox format$(0, ".")

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.07.2005 (Пт) 11:16

uhm писал(а):Hint: поменяй ручками десятичный разделитель на что-нибудь непотребное, а потом еще раз выполни msgbox format$(0, ".")


Ура! заработало! Но только в VB6. На VB.NET надо делать
Код: Выделить всё
Format(0,".0")
- выведет "$0", если в качестве разделителя взять $.
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.07.2005 (Пт) 11:21

А зачем этот финальный ноль выводить?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 29.07.2005 (Пт) 11:30

Казалось бы что действительно незачем, но команда

Format(0, ".")

выводит к сожалению пустую строку.
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.07.2005 (Пт) 11:37

Ага.
Слишком умно - не лучше, чем слишком глупо :)
Впрочем, в .NET есть CultureInfo.NumberFormat.NumberDecimalSeparator :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 09.08.2005 (Вт) 10:56

На всякий случай поясню разницу между CDbl и Val. Пусть десятичным разделителем является десятичная точка, а пользователь ввел строку в которой вместо точки запятая.
Код: Выделить всё
Dim dbl As Double
Dim str As String
str = "123,45"
dbl = CDbl(str) 'здесь произойдет ошибка
dbl = Val(str)   'ошибки не будет, но dbl будет равна нулю
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.08.2005 (Вт) 10:58

Ерунда, dbl будет равен 123
Lasciate ogni speranza, voi ch'entrate.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 09.08.2005 (Вт) 11:03

alibek писал(а):Ерунда, dbl будет равен 123


Вот уж нет. будет ошибка 13 "Type mismatch", то бишь несовпадение типов
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2005 (Вт) 11:27

Да ну?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 09.08.2005 (Вт) 11:35

Сорри!!!

для
Код: Выделить всё
dbl = CDbl("123,45")
будет ошибка несовпадения типов, но для
Код: Выделить всё
dbl = Val("123,45")
действительно получим, что dbl равен 123.

Но разница между Val и СDbl тем не менее остается, что собственно я и хотел сказать.
Весь мир матрица, а мы в нем потоки байтов!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2005 (Вт) 11:39

А.

Собственно, это было сказано так много раз до этого :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 117

    TopList