Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: проблеммы с точкой в дробных числах. Добавлено: 14.05.05 14:38  

Автор вопроса:  Fidget | Web-сайт: www.m-o.ru | ICQ: 203311178 
Здравствуйте.

Проблемма состоит в следующем:

Когда пишу в текстовом поле дробное число с точкой (1.2), то программа выдает ошибку, а если с запятой (1,2), то все нормально.


Вчем тут проблемма?

Ответить

  Ответы Всего ответов: 22  

Номер ответа: 1
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #1 Добавлено: 14.05.05 15:07
В текстовом поле прикол проходит только с запятой, в редакторе ВБ — с точкой.

Если надо писать в текстовое поле именно точку, тогда юзай:

strLine = Replace(Text1, ".", ",";)

Ответить

Номер ответа: 2
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #2 Добавлено: 14.05.05 16:37
Не так.
В текстовом поле проходит текущий национальный разделитель (совсем не обязательно запятая). С ним работают CSng/CDbl и неявное преобразование. А с только точкой работает Val.

Ответить

Номер ответа: 3
Автор ответа:
 Fidget



ICQ: 203311178 

Вопросов: 2
Ответов: 2
 Web-сайт: www.m-o.ru
 Профиль | | #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-сайт: www.m-o.ru
 Профиль | | #5
Добавлено: 14.05.05 19:09
Как тогда быть?

программно можно узнать какой разделитель стоит?

Ответить

Номер ответа: 6
Автор ответа:
 Barsik



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #6
Добавлено: 14.05.05 22:07
лезть в реестр, узнвать какой разделитель и усе будет путем.

Ответить

Номер ответа: 7
Автор ответа:
 Sur



ICQ: 1249088 

Вопросов: 10
Ответов: 304
 Web-сайт: sur.hotbox.ru/
 Профиль | | #7
Добавлено: 17.05.05 19:54
Public Function GetDecimalSymbol() As String
   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-сайт: xury.zx6.ru
 Профиль | | #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-сайт: sur.hotbox.ru/
 Профиль | | #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-сайт: sur.hotbox.ru/
 Профиль | | #13
Добавлено: 18.05.05 17:57
Вот уж кто глупостями занимается...
Теперь поменяйте десятичный разделитель в системе на другой (,.) и ваши примеры летят в трубу. Надо знать что на что менять реплейсом, а об этом скажут только региональные установки.

Ответить

Номер ответа: 14
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам