Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > ОГРАНИЧИТЬ КОЛЛИЧЕСТВО СИМВОЛОВ ПОСЛЕ ЗАПЯТОЙ


Автор: NikoLLa 25.9.2005, 21:18
Товарищи, объясните пожалуйста как ограничить в vb колличество символов, которые нужно вывести на экран. Допустим есть число 3,141516, а надо вывести 3,14. Заранее спасибо!

Автор: Spawn™Production® 25.9.2005, 21:48
mid "Обрабатываемый текст", номер символа с которого начинаем, сколько символов берём.
Например:
Код
Dim text, text2 as string
text = "3,141516"
text2 = mid(text, 1, 4)
Print text2
Видим результат - 3,14

Автор: Exception 25.9.2005, 22:13
а чтобы не только с однозначным работало:
Код

Function Cut (d As Double) As Double
Dim temp As Integer
temp = InStr$(d, ".")
Cut = Left$(d, temp + 2)
End Function

писал вслепую, проверьте
Добавлено @ 22:17
ЗЫ
число пи = 3.1415926535.. если нады

Автор: Akina 25.9.2005, 23:36
А еще есть гениальная функция Format

Автор: cardinal 26.9.2005, 13:32
Которая имхо не очень подходит для того, чтобы не давать ввести больше, чем две цифры после запятой (думаю именно это хочет NikoLLa).

Можно еще попробовать Microsoft Masked Edit Box и поставить там Mask Property = ###,## например, но и это тоже не очень...
Наверно единственное, что остается так это что-нибудь по типа того, что предложил Run-time error...

Автор: Akina 26.9.2005, 14:13
Цитата(cardinal @ 26.9.2005, 14:32)
Которая имхо не очень подходит для того, чтобы не давать ввести больше, чем две цифры после запятой (думаю именно это хочет NikoLLa).

ну... я ориентировался на исходный пост... впрочем наверное ты прав окажешься smile

Автор: Guest 26.9.2005, 14:54
NikoLLa
Цитата(NikoLLa @ 25.9.2005, 21:18)
Товарищи, объясните пожалуйста как ограничить в vb колличество символов, которые нужно вывести на экран. Допустим есть число 3,141516, а надо вывести 3,14. Заранее спасибо!

Код

Option Explicit

Private Sub Command1_Click()
Dim S As Single

   S = 3.1415926
   MsgBox (Left(S, 4))

End Sub

Ну, а так не проще будет? smile Функции Left("....", number) Right("....", number)

Автор: Гость_Voldemar2004 26.9.2005, 14:56
NikoLLa
Цитата(NikoLLa @ 25.9.2005, 21:18)
Товарищи, объясните пожалуйста как ограничить в vb колличество символов, которые нужно вывести на экран. Допустим есть число 3,141516, а надо вывести 3,14. Заранее спасибо!

Код

Option Explicit

Private Sub Command1_Click()
Dim S As Single

   S = 3.1415926
   MsgBox (Left(S, 4))

End Sub

Ну, а так не проще будет? smile Функции Left("....", number) Right("....", number)
Извините за Guest, просто сейчас на работе сижу smile С разных компов в инет выхожу smile)

Автор: Exception 26.9.2005, 15:34
странные вы все..
волдемар, спаун,
ваши ф-ции ведь не работают, если в числе больше одного знака. надо ещё ИнСтр юзать

Автор: Spawn™Production® 26.9.2005, 16:29
Run-time error, нам никто чёткой задачи не ставил... спросили как можно сделать, мы показали...
Добавлено @ 16:31
К тому же, если всё правильно делать, то в число невозможно будт ввести больше 1 знака...

Автор: NikoLLa 26.9.2005, 17:03
smile Необходимо, чтобы пользователь мог выбрать сколько символов выводилось на экран после запятой, а не с первого символа числа. А то что написал Run-time error я вообще понять не могу

Автор: cardinal 26.9.2005, 17:15
Я бы сделал так:
Код

Function LimitTextInput(source) As String
Const Numbers$ = "0123456789,"  ' эти символы разрешены

' backspace = 8
If source <> 8 Then
    If InStr(Numbers, Chr(source)) = 0 Then
        LimitTextInput = 0
        Exit Function
    End If
End If
LimitTextInput = source
End Function

Private Sub Text1_Change()
If InStr(1, Text1.Text, ",") And Len(Text1.Text) > InStr(1, Text1.Text, ",") + 2 Then
        Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1)
        Text1.SelStart = Len(Text1.Text)
    End If
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = LimitTextInput(KeyAscii)
If InStr(1, Text1.Text, ",") Then
    If KeyAscii = 44 Then KeyAscii = 0
End If
End Sub

Цитата(NikoLLa @ 26.9.2005, 15:03)
Необходимо, чтобы пользователь мог выбрать сколько символов выводилось на экран после запятой

Поизучай этот код и поймешь как это сделать...

Автор: Spawn™Production® 26.9.2005, 17:19
NikoLLa, так бы сразу и сказали smile
Код
Sub Form_Load()
Dim num as Double
Dim sim as Integer
num = 3.1415926535
sim = InputBox("Введите количество отображаемых символов перед запятой", "Кол-во вимволов", 2)
msgbox "Результат: " & mid(str(num), 3, sim)
End Sub

Автор: Gannibal 26.9.2005, 17:59

Цитата(Spawn @ 26.9.2005, 16:19)
Sub Form_Load()
Dim num as Double
Dim sim as Integer
num = 3.1415926535
sim = InputBox("Введите количество отображаемых символов перед запятой", "Кол-во вимволов", 2)
msgbox "Результат: " & mid(str(num), 3, sim)
End Sub


Spawn™Production® слушай код у тебя нерабочий, когда задаёшь количество знаков после точки так выводит на один меньше ;) поправь smile хотя сам поправил smile

Код

Sub Form_Load()
Dim num As Double
Dim sim As Integer
num = 3.1415926535
sim = InputBox("Введите количество отображаемых символов перед запятой", "Кол-во вимволов", 2)
msgbox "Результат: " & mid(str(num), 3, sim + 1)
End Sub



NikoLLa а зачем тебе числа после запятой обрезать но если обрезаешь значит округлять надо нет? или ненадо?

Автор: NikoLLa 26.9.2005, 18:32
M.E.G.U.S Нет округлять не надо.
Spawn™Production®, M.E.G.U.S Но прога не выводит первого знака(перед запятой )Как сделать

Автор: Spawn™Production® 26.9.2005, 18:38
M.E.G.U.S, да уж, я потом исправил, но сюда почему-то заостил не тот вариант... smile прям аж стыдно как-то...

NikoLLa, как это не выводит ? Всё там выводится, оно просто не может не вывестись, так как в функции mid стоит установка начинать обрезку с первого символа...

Автор: NikoLLa 26.9.2005, 18:42
Spawn™Production®, M.E.G.U.S,Эта прога выводит символы после первой цифры, а надо после запятой. Попробуйте ввести не 3.1415926535, а, допустим, "5698,2365"

Автор: cardinal 26.9.2005, 20:14
NikoLLa, помести на форму один TextBox, скопируй мой код и попробуй...

Автор: Spawn™Production® 26.9.2005, 20:57

Автор: Exception 26.9.2005, 21:19
вообще-то мой код должен отлично работать.. только temp+2 надо заменить temp+Inputbox("сколько обрезать?")
ЗЫ надо бы прежде чем проги писать, язык поучить.
ЗЗЫ зачем, если не секрет, тебе так над числами извращаться?

Автор: bom 26.9.2005, 23:03
А вот еще вариант smile
Код

Function mformat(num As String, ext As Integer) As String
mformat = Left(num, InStrRev(Replace(num, ",", "."), ".") + ext)
End Function

Private Sub Form_Load()
MsgBox mformat("3.14159", 2)
MsgBox mformat("5698,2365", 2)
End Sub

Автор: cardinal 26.9.2005, 23:22
Если введены именно цифры, то это вариант... smile

Автор: Naghual 27.9.2005, 09:57
Мда... Много всего написано...

Код

Option Explicit

Private Const LOCALE_USER_DEFAULT = &H400
Private Const LOCALE_SDECIMAL As Long = &HE

Private Declare Function GetLocaleInfo _
    Lib "kernel32" Alias "GetLocaleInfoA" _
    (ByVal Locale As Long, ByVal LCType As Long, _
    ByVal lpLCData As String, ByVal cchData As Long) As Long

Private Function GetDecimalDelimiter() As String
    Dim Buffer As String, Ret As String
    
    Buffer = String$(256, 0)
    Ret = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, Buffer, Len(Buffer))
    If Ret > 0 Then
        GetDecimalDelimiter = Left$(Buffer, Ret - 1)
    Else
        GetDecimalDelimiter = ""
    End If
End Function

Private Sub Command1_Click()
    Dim sNumber As String
    Dim NumDigits As Integer
    Dim DecimalDelimiter As String
    Dim DelimiterPos As Integer
    Dim sIntNumber As String
    Dim sDecNumber As String
    Dim sFormattedNumber As String
    
    ' Исходной число
    sNumber = Me.Text1.Text
    ' Количество символов после запятой
    NumDigits = Me.Text2.Text
    ' Системный символ разделитель целой и дробной частей
    DecimalDelimiter = GetDecimalDelimiter
    ' заменим символ разделитель в числе на правильный
    sNumber = Replace$(sNumber, ",", DecimalDelimiter)
    sNumber = Replace$(sNumber, ".", DecimalDelimiter)
    ' Определяем позицию разделителя в строке
    DelimiterPos = InStr(1, sNumber, DecimalDelimiter)
    
    ' Собственно сам код  :)
    If DelimiterPos > 0 Then
        sIntNumber = Mid$(sNumber, 1, DelimiterPos - 1)
        sDecNumber = Mid$(sNumber, DelimiterPos + 1)
        sFormattedNumber = sIntNumber + DecimalDelimiter + Left$(sDecNumber, NumDigits)
    Else
        sFormattedNumber = sNumber
    End If
    
    ' Показываем результат
    Me.Label1.Caption = sFormattedNumber
End Sub


PS: Тут есть определенные излишества, но все зависит от реализации.
PPS: Необходима форма с двумя Текстбоксами, одним Капшионом и одним Коммандбуттоном. В первый текстбокс забивается оригинальное число во второй количество оставляемых символов.

Автор: NikoLLa 27.9.2005, 21:00
smile Народ! Всем огромное спасибо! Вы мне очень помогли. А то я уже у преподов спрашивал - так ничего вразумительного и не объяснили. Завтра иду сдавать.Всем удачи! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)