Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / String в Double / 11 сообщений из 11, страница 1 из 1
15.06.2006, 14:00
    #33792906
Spring_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
Здравствуйте!
Подскажите, пожалуйста, функцию (код), как 100%-но доставать в переменную Db_l типа Double значение из переменной St которая типа String.

В 100% подразумевает - при любой конструкции St из перечисленных ниже

St =”ХХХ...,ХХ...”(напр. “1454,45”) результат Dbl =1454,45
St =”ХХХ”(напр. “1454”) результат Dbl =1454
St =”0” результат Dbl = 0
St =”” результат Dbl =0

Спасибо заранее!
...
Рейтинг: 0 / 0
15.06.2006, 14:09
    #33792937
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
Например, так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Form_Load()
    Debug.Print GetDbl("1454,45")
    Debug.Print GetDbl("1454")
    Debug.Print GetDbl("0")
    Debug.Print GetDbl("")
End Sub

Private Function GetDbl(str As String) As Double
    If IsNumeric(str) Then
        GetDbl = CDbl(str)
    End If
End Function
...
Рейтинг: 0 / 0
15.06.2006, 14:23
    #33792996
Spring_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
Melkiades Во первых спасибо за ответ, во вторых извините, пропустил
самое главное для чего вообще написал в форум:

St =”текстХХХ...,ХХ...”(пр. “пФон1454,45”) результат Dbl =1454,45
St =”текстХХХ...”(пр. “пФон1454”) результат Dbl =1454
St =”текстХХХ...,ХХ...текст”(пр. “пФон1454,45рол”) результат Dbl =1454,45
St =”текстХХХ...текст”(пр. “пФон1454рол”) результат Dbl =1454
St =”текст”(пр. “пФонл”) результат Dbl =0
St =”ХХХ...,ХХ...”(пр. “1454,45”) результат Dbl =1454,45
St =”ХХХ”(пр. “1454”) результат Dbl =1454
St =”0” результат Dbl = 0
St =”” результат Dbl =0

Более сложных конструкции не предвидится, т.е. чтобы числовые значения
повторялись несколько раз или цифровые значения были рассеяны по тексту, такого не будет.
...
Рейтинг: 0 / 0
15.06.2006, 14:28
    #33793015
Spring_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
Чтобы не отнимать много времени, существует или нет функция похожий на VAL или FIX
который достает Double, если не существует и для этого нужно перебирать по буквам St
или другим образом обрабатывать программным кодом, это сделаю сам.
...
Рейтинг: 0 / 0
15.06.2006, 14:50
    #33793113
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
По-видимому у вас используются стандартные перфиксы к суммам.
Надо контролировать правильность префиксов на вводе, и использовать функцию Replace в функции преобразования к числу.
...
Рейтинг: 0 / 0
15.06.2006, 17:45
    #33793845
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
стандартной функции такой нет
можно через регулярные выражения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
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

Sub dgf()
' вытаскивание цифры из строки
    MsgBox myDbl("пФон0.1fgjh")
End Sub
Function myDbl(mySt As String) As Double
    'в референс подключить Microsoft VBScript Regular Expressions
    Dim str As String *  1 
    Dim str2 As String *  1 
    Dim myRegExp As New RegExp
    Dim colMatches As MatchCollection ' коллекция образцов
    
    myRegExp.MultiLine = False ' текст однострочный
    myRegExp.Global = False ' будем проходить до превого совпадения
    myRegExp.Pattern = "\d+" ' маска (любое количество любой цифры )
    If myRegExp.Test(mySt) Then 'проверка существует ли цифра в строке
        Set colMatches = myRegExp.Execute(mySt) ' запускаем!
        myDbl = colMatches( 0 )
        myRegExp.Pattern = "\d+[\./,]\d+" ' маска (любое количество любой цифры потом точка или запятая и опять любое количество любой цифры)
        If myRegExp.Test(mySt) Then 'проверка существует ли дробная цифра в строке
            Set colMatches = myRegExp.Execute(mySt) ' запускаем!
            On Error Resume Next
            myDbl = colMatches( 0 )
            If Err Then
                GetLocaleInfo GetUserDefaultLCID, &HE, str,  1  'системный раделитель
                If str = "." Then str2 = "," Else str2 = "."
                myDbl = Replace(colMatches( 0 ), str2, str)
            End If
        End If
    End If
End Function
...
Рейтинг: 0 / 0
17.06.2006, 13:47
    #33797324
Spring_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
vkodor
Во-первых спасибо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function Get_Dbl(Stng As String) As Double
Dim Shablon As String, Stng_Res As String
Dim i As Long

Shablon = "0123456789" & Application.International(xlDecimalSeparator)    'набор разрешенных
Stng = Replace(Stng, ",", Application.International(xlDecimalSeparator))    'чтобы не проверять что в региональных ","  переводим в региональные
Stng = Replace(Stng, ".", Application.International(xlDecimalSeparator))    'Все ". " переводим в региональные

For i =  1  To Len(Stng)
    If InStr( 1 , Shablon, Mid(Stng, i,  1 )) =  0  Then Mid(Stng, i,  1 ) = " " 'Все что не подходит = " "
Next
Stng_Res = Trim(Stng)
If IsNumeric(Stng_Res) And InStr( 1 , Stng_Res, " ") =  0  Then Get_Dbl = CDbl(Stng_Res) 'Если кол.  " " > 0 результат не подходит

End Function

Я написал такую функцию, и такие можно писать очень много.
Вы можете в двух словах объяснить, в чем плюс использования API функции в таком
преобразовании
...
Рейтинг: 0 / 0
19.06.2006, 10:17
    #33798818
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
думаю что никаких приимуществ нет
и помойму ваша функция эфективнее.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function Get_Dbl(Stng As String) As Double
    Dim Shablon As String
    Dim i As Long
    
    Shablon = "0123456789" & Application.International(xlDecimalSeparator)    'набор разрешенных
    Stng = Replace(Stng, ",", Application.International(xlDecimalSeparator))    'чтобы не проверять что в региональных ","  переводим в региональные
    Stng = Replace(Stng, ".", Application.International(xlDecimalSeparator))    'Все ". " переводим в региональные
    
    For i =  1  To Len(Stng)
        If InStr( 1 , Shablon, Mid(Stng, i,  1 )) =  0  Then Mid(Stng, i,  1 ) =  0  'Все что не подходит = 0
    Next
    If IsNumeric(Stng) Then Get_Dbl = CDbl(Stng)
End Function
...
Рейтинг: 0 / 0
19.06.2006, 11:56
    #33799199
Spring_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
Я бы предпочел без изменений свой вариант
изменения, которые вы сделали,
приведет к ошибке при такой конструкции

ххх14 567, 45ххх результат будет 140567, 45
...
Рейтинг: 0 / 0
19.06.2006, 12:24
    #33799318
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
Spring_SЯ бы предпочел без изменений свой вариант
изменения, которые вы сделали,
приведет к ошибке при такой конструкции

ххх14 567, 45ххх результат будет 140567, 45
я учитывал эти слова
Spring_SБолее сложных конструкции не предвидится, т.е. чтобы числовые значения
повторялись несколько раз или цифровые значения были рассеяны по тексту, такого не будет.
у меня тоже в строке всегда только одна цифра, поэтому и переделал.
...
Рейтинг: 0 / 0
19.06.2006, 15:52
    #33800214
Spring_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String в Double
Да. Беру назад свои слава
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / String в Double / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]