Страница: 1 | 2 |
Вопрос: проблеммы с точкой в дробных числах.
Добавлено: 14.05.05 14:38
Автор вопроса: Fidget | Web-сайт:
Здравствуйте.
Проблемма состоит в следующем:
Когда пишу в текстовом поле дробное число с точкой (1.2), то программа выдает ошибку, а если с запятой (1,2), то все нормально.
Вчем тут проблемма?
Ответы
Всего ответов: 22
Номер ответа: 1
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #1
Добавлено: 14.05.05 15:07
В текстовом поле прикол проходит только с запятой, в редакторе ВБ — с точкой.
Если надо писать в текстовое поле именно точку, тогда юзай:
Номер ответа: 2
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #2
Добавлено: 14.05.05 16:37
Не так.
В текстовом поле проходит текущий национальный разделитель (совсем не обязательно запятая). С ним работают CSng/CDbl и неявное преобразование. А с только точкой работает Val.
Номер ответа: 3
Автор ответа:
Fidget
ICQ: 203311178
Вопросов: 2
Ответов: 2
Web-сайт:
Профиль | | #3
Добавлено: 14.05.05 17:15
И как это понимать?
Впринципе вариант с Replace у меня получился
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 14.05.05 17:24
Это понимать буквально. Зайди в свойства винды и посмотри какой у тебя стоит разделитель дробной части. Если это не запятая - вариант с Replace не прокатит. Нужно будет лезть в реестр.
Номер ответа: 5
Автор ответа:
Fidget
ICQ: 203311178
Вопросов: 2
Ответов: 2
Web-сайт:
Профиль | | #5
Добавлено: 14.05.05 19:09
Как тогда быть?
программно можно узнать какой разделитель стоит?
Номер ответа: 6
Автор ответа:
Barsik
Разработчик Offline Client
ICQ: 343368641
Вопросов: 17
Ответов: 686
Web-сайт:
Профиль | | #6
Добавлено: 14.05.05 22:07
лезть в реестр, узнвать какой разделитель и усе будет путем.
Номер ответа: 7
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #7
Добавлено: 17.05.05 19:54
Dim Symbol As String
Dim iRet1 As Long
Dim iRet2 As Long
Dim lpLCDataVar As String
Dim pos As Integer
Dim Locale As Long
Locale = GetSystemDefaultLCID()
iRet1 = GetLocaleInfo(Locale, LOCALE_SDECIMAL, lpLCDataVar, 0)
Symbol = String$(iRet1, 0)
iRet2 = GetLocaleInfo(Locale, LOCALE_SDECIMAL, Symbol, iRet1)
pos = InStr(Symbol, vbNullChar) 'Chr$(0))
If pos > 0 Then
Symbol = Left$(Symbol, pos - 1)
GetDecimalSymbol = Symbol
End If
End Function
Декларации сам поищи пожалуста.
Номер ответа: 8
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #8
Добавлено: 17.05.05 20:10
мне тут по башке идея стукнула: а если прочитать отдельно данные до точки (или запятой) и записать их в число, и отдельно дробную часть и добываить их к числу в формате (Z-целое, D-дробное) N=Z+D/10^(len(d))
Пусть как хочет, так и вводит.
В примитивно-лабороторном исполнении как то так:
Const S1 = "222.344"
Const S2 = "3,44444"
Dim z As String
Dim d As String
Dim i As Integer
Dim l As Integer
Sub main()
l = Len(S1)
For i = 1 To l
If Not IsNumeric(Mid(S1, i, 1)) Then
z = Split(S1, Mid(S1, i, 1))(0)
d = Split(S1, Mid(S1, i, 1))(1)
End If
Next i
MsgBox "S1 * 2 = " & (z + d / (10 ^ Len(d))) * 2
l = Len(S2)
For i = 1 To l
If Not IsNumeric(Mid(S2, i, 1)) Then
z = Split(S2, Mid(S2, i, 1))(0)
d = Split(S2, Mid(S2, i, 1))(1)
End If
Next i
MsgBox "S2 * 2 = " & (z + d / (10 ^ Len(d))) * 2
End Sub
Номер ответа: 9
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #9
Добавлено: 18.05.05 10:27
мдя... глупостями занимаетесь, господа...
Debug.Print CDbl(Val("347364.7364")
Номер ответа: 10
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #10
Добавлено: 18.05.05 11:39
ответ не верный, если юзер ввел число с запятой.
Номер ответа: 11
Автор ответа:
User Unknown
Вечный Юзер!
ICQ: uu@jabber.cz
Вопросов: 120
Ответов: 3302
Профиль | | #11
Добавлено: 18.05.05 11:46
Ну тогда так:
Debug.Print IIf(InStr(1, Text1.Text, ",", vbTextCompare), Text1.Text, Val(Text1.Text))
Номер ответа: 12
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #12
Добавлено: 18.05.05 15:23
Может тогда уж так:
CDbl(Val(Replace("347364.7364", ".", ","))
Номер ответа: 13
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #13
Добавлено: 18.05.05 17:57
Вот уж кто глупостями занимается...
Теперь поменяйте десятичный разделитель в системе на другой (,.) и ваши примеры летят в трубу. Надо знать что на что менять реплейсом, а об этом скажут только региональные установки.
Номер ответа: 14
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #14
Добавлено: 18.05.05 18:02
А чем не устраивает универсальный метод прохода циклом?
Номер ответа: 15
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #15
Добавлено: 18.05.05 18:03
Ладно, тоже приму участие в этом конкурсе нерациональных решений. Мой кандидат:
Private Function StrToDouble(ByRef StrNum As String) As Double
On Error Resume Next
StrToDouble = CDbl(StrNum)
If Err Then StrToDouble = Val(StrNum)
End Function