Помогите пожалуйста с функцией " Val"

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

Помогите пожалуйста с функцией " Val"

Сообщение kuybyshev » 25.07.2008 (Пт) 22:34

Функция Val возвращает число, содержащееся в строке аргументе как числовое значение ,в качестве разделителя используется только точка "." (ПРИМЕР " 123.22") Мне нужно что-бы разделителем была запятая ","(ПРИМЕР " 123,22")При запятой Функция Val в значении переменной отбрасывает дробную часть числа (ПРИМЕР " 123") Возможно-ли это? Помогите,пожалуйста!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 25.07.2008 (Пт) 23:52

Насколько я знаю нет!!! Сам паридся когда-то
Пишите жизнь на чистовик.....переписать не удастся.....

kuybyshev
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.07.2008 (Пт) 22:04

Сообщение kuybyshev » 26.07.2008 (Сб) 0:06

Самое интересное то ,что но операционке ВИНДОВЗ СЕРВЕР 2000 почему-то когда я ввожу разделительный знак с правой дополнительной части клавиатуры ,то дробная часть не отбрасывается,но на скоко я знаю -это не должно зависеть от операционной системы! Как можно выйти из сложившейся ситуации?

Option Explicit
Dim D As Currency
Dim SH As Currency
Dim H As Currency
Dim S As Currency
Dim V As Currency
Dim P As Currency
Dim PS As Currency

Private Sub Command1_Click()
D = Val(Text1.Text)
SH = Val(Text2.Text)
H = Val(Text3.Text)
S = D * SH
V = S * H
P = (D + SH) * 2
PS = P / S
Text4.Text = S
Text5.Text = V
Text6.Text = P
Text7.Text = PS
End Sub

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 26.07.2008 (Сб) 1:35

Код: Выделить всё
Private Sub Command1_Click()
Select Case 0
     Case Is = InStr(1, Text1.Text, ".")
        Text1.Text = Val(Replace(Text1.Text, ".", ","))
     Case Is = InStr(1, Text2.Text, ".")
        Text1.Text = Val(Replace(Text2.Text, ".", ","))
     Case Is = InStr(1, Text3.Text, ".")
        Text1.Text = Val(Replace(Text3.Text, ".", ","))
End Select
    D = Text1.Text
    SH = Text2.Text
    H = Text3.Text
    S = D * SH
    V = S * H
    P = (D + SH) * 2
    PS = P / S
    Text4.Text = S
    Text5.Text = V
    Text6.Text = P
    Text7.Text = PS
End Sub


Но учти, что при отбрасывании части происходит еще и округление к ближайшему четному числу. Например если S будет 0.25 то у тебя будет ошибка - на ноль то делить нельзя. А при преобразовании 1.25 у тебя выйдет 2....
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 26.07.2008 (Сб) 3:33

Во-первых,
это не должно зависеть от операционной системы!
это должно зависеть и зависит от национальных настроек и смивола, указанного там (в национальных настройках) в качестве разделителя.

Во-вторых, читайте статью.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 26.07.2008 (Сб) 7:59

Региональные стандарты. "." и "," это разделители целой и дробной части в разных стандартах. А вот пользователя просить вводить точку всегда - это неразумно. Лучше после того, как пользователь что-либо ввёл исправить программно. Насколько я понимаю, точка действует всегда как разделитель, но могу и ошибаться. В любом случае перед использованием cint, clng, ..., val, лучше убедиться в корректности вводимых данных.
Follow the white rabbit.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Сообщение Williams » 26.07.2008 (Сб) 8:18

Если уж очень хочется, то можно сделать реплейсмент:



Код: Выделить всё
Dim sInput As String
sInput = ...
sInput = Replace (sInput, ",", ".")

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 26.07.2008 (Сб) 8:20

Proxy
Насколько я понимаю, точка действует всегда как разделитель, но могу и ошибаться. В любом случае перед использованием cint, clng, ..., val, лучше убедиться в корректности вводимых данных.

Ты тоже читай статью.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 26.07.2008 (Сб) 9:22

Williams ты явно топик с самого начала не читал...Причем твой код неверный. Он заменяет запятую на точку.
Последний раз редактировалось SLIM 26.07.2008 (Сб) 9:29, всего редактировалось 1 раз.
Пишите жизнь на чистовик.....переписать не удастся.....

kuybyshev
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.07.2008 (Пт) 22:04

Сообщение kuybyshev » 26.07.2008 (Сб) 9:25

Спасибо за помощ,я не програмист и просто благодарен всем в решении проблемы! Но вот может гдето ошибка? Потому что на практике в текстбоксе1 при нажатии команд1 исчезает дробная часть числа и результат получается неточным!
Private Sub Command1_Click()
Код: Выделить всё
Select Case 0
     Case Is = InStr(1, Text1.Text, ".")
        Text1.Text = Val(Replace(Text1.Text, ".", ","))
     Case Is = InStr(1, Text2.Text, ".")
        Text1.Text = Val(Replace(Text2.Text, ".", ","))
     Case Is = InStr(1, Text3.Text, ".")
        Text1.Text = Val(Replace(Text3.Text, ".", ","))
End Select
    D = Text1.Text
    SH = Text2.Text
    H = Text3.Text
    S = D * SH
    V = S * H
    P = (D + SH) * 2
    PS = P / S
    Text4.Text = S
    Text5.Text = V
    Text6.Text = P
    Text7.Text = PS
End Sub

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 26.07.2008 (Сб) 9:35

Так тебе нужно что? Чтобы дробным было? Тогда к чему
Мне нужно что-бы разделителем была запятая ","(ПРИМЕР " 123,22")При запятой Функция Val в значении переменной отбрасывает дробную часть числа (ПРИМЕР " 123") Возможно-ли это?

Что непонятно что тебе конкретн нужно. Я ведь говорю, точности ты все равно не получшь, округление+отнимание дробной части = никакой точности...
Последний раз редактировалось SLIM 26.07.2008 (Сб) 10:15, всего редактировалось 1 раз.
Пишите жизнь на чистовик.....переписать не удастся.....

kuybyshev
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.07.2008 (Пт) 22:04

Сообщение kuybyshev » 26.07.2008 (Сб) 9:43

Мне нужно чтобы вводимые в текстбоксы числа при разделении дробной части запятой, умножались и делились так как я их ввёл,а не умножались и делились только целой частью числа

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 26.07.2008 (Сб) 9:45

Вы статью-то почитайте. Я всё что не знал о округлении понял после прочтения.
Код: Выделить всё
Select Case 0
     Case Is = InStr(1, Text1.Text, ".")
        Text1.Text = Val(Replace(Text1.Text, ".", ","))
     Case Is = InStr(1, Text2.Text, ".")
        Text1.Text = Val(Replace(Text2.Text, ".", ","))
     Case Is = InStr(1, Text3.Text, ".")
        Text1.Text = Val(Replace(Text3.Text, ".", ","))
End Select

Боже, что это: "Text1.Text =" везде. Ты точно этого хотел?

Что непонятно что тебе конкретн нужно. Я ведь говорю, точности ты все равно не получшь, округление+отнимание дробной части = никакой точности...
Тоже почитай.
Follow the white rabbit.

kuybyshev
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.07.2008 (Пт) 22:04

Сообщение kuybyshev » 26.07.2008 (Сб) 9:55

Да я читал статью " Кстати, простейший способ получить символ разделения целой и дробной частей – вызвать функцию Format следующим образом

Format$(0, ".")

Этот вызов вернет текущий разделитель целой и дробной частей числа."
Я не могу применить на практике

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 26.07.2008 (Сб) 9:59

АААА. Код неверный. Нужно что бы при условии неравности 0 а не равности выполнялись действия. Да простят меня святые великомученники.


Код: Выделить всё
If InStr(1, Text1.Text, ".") > 0 Then
    Text1.Text = Replace(Text1.Text, ".", ",")
End If

If InStr(1, Text2.Text, ".") > 0 Then
    Text2.Text = Replace(Text2.Text, ".", ",")
End If

If InStr(1, Text3.Text, ".") > 0 Then
    Text3.Text = Replace(Text3.Text, ".", ",")
End If

    D = Text1.Text
    SH = Text2.Text
    H = Text3.Text
    S = D * SH
    V = S * H
    P = (D + SH) * 2
    PS = P / S
    Text4.Text = S
    Text5.Text = V
    Text6.Text = P
    Text7.Text = PS


Вот ентот работет, проверял
Пишите жизнь на чистовик.....переписать не удастся.....

kuybyshev
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.07.2008 (Пт) 22:04

Сообщение kuybyshev » 26.07.2008 (Сб) 10:12

Вроде-бы для меня и хорошее решение
Select Case 0
Case Is = InStr(1, Text1.Text, ".")
Text1.Text = Val(Replace(Text1.Text, ".", ","))
Case Is = InStr(1, Text2.Text, ".")
Text1.Text = Val(Replace(Text2.Text, ".", ","))
Case Is = InStr(1, Text3.Text, ".")
Text1.Text = Val(Replace(Text3.Text, ".", ","))
End Select
но вот говорю что почемуто именно в текстбоксе1 ввожу 10,7 а при нажатии команд1 получаю 10

kuybyshev
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.07.2008 (Пт) 22:04

Сообщение kuybyshev » 26.07.2008 (Сб) 10:18

СУПЕРРР!!!!
Вы не представляете как я вам благодарен!!!
Большое,огромное,СПАСИБО!

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Сообщение Williams » 26.07.2008 (Сб) 14:34

kuybyshev писал(а):Вроде-бы для меня и хорошее решение
Select Case 0
Case Is = InStr(1, Text1.Text, ".")
Text1.Text = Val(Replace(Text1.Text, ".", ","))
Case Is = InStr(1, Text2.Text, ".")
Text1.Text = Val(Replace(Text2.Text, ".", ","))
Case Is = InStr(1, Text3.Text, ".")
Text1.Text = Val(Replace(Text3.Text, ".", ","))
End Select
но вот говорю что почемуто именно в текстбоксе1 ввожу 10,7 а при нажатии команд1 получаю 10




Не вижу смысла проверять при помощи InStr, по-скольку быстродействие в данном случае не имеет никакого значения. Заменить без всяких проверок.

Вы бы еще Text1.Text = Str(Val(Replace(Text1.Text, ".", ",", InStr(1, Text1.Text, ".") - 1))) написали :)

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 26.07.2008 (Сб) 14:53

Да забудь ты уже ентот код. Неверный он я же сказал
Пишите жизнь на чистовик.....переписать не удастся.....

kuybyshev
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 25.07.2008 (Пт) 22:04

Сообщение kuybyshev » 27.07.2008 (Вс) 16:00

Да я понял!Вот последний то что нада! За него СПАСИБО!

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

Сообщение Viper » 28.07.2008 (Пн) 13:57

Хакер писал(а):Во-вторых, читайте статью.
А в статье то опечатки оказывается есть... Эххх... каюсь.
Весь мир матрица, а мы в нем потоки байтов!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 28.07.2008 (Пн) 21:16

А в статье то опечатки оказывается есть... Эххх... каюсь.

Орфографические или символьно-кодово-функционально-переменно-константно-типоданные? :lol:
Пишите жизнь на чистовик.....переписать не удастся.....

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

Сообщение Viper » 29.07.2008 (Вт) 7:43

Орфографические, и в одном месте восьмеричное число мягко говоря неправильное.
И заканчиваем на этом оффтоп.
Весь мир матрица, а мы в нем потоки байтов!


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

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

Сейчас этот форум просматривают: Google-бот и гости: 69

    TopList