powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / String в Double
11 сообщений из 11, страница 1 из 1
String в Double
    #33792906
Spring_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Подскажите, пожалуйста, функцию (код), как 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
String в Double
    #33792937
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, так.
Код: 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
String в Double
    #33792996
Spring_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
String в Double
    #33793015
Spring_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы не отнимать много времени, существует или нет функция похожий на VAL или FIX
который достает Double, если не существует и для этого нужно перебирать по буквам St
или другим образом обрабатывать программным кодом, это сделаю сам.
...
Рейтинг: 0 / 0
String в Double
    #33793113
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-видимому у вас используются стандартные перфиксы к суммам.
Надо контролировать правильность префиксов на вводе, и использовать функцию Replace в функции преобразования к числу.
...
Рейтинг: 0 / 0
String в Double
    #33793845
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стандартной функции такой нет
можно через регулярные выражения
Код: 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
String в Double
    #33797324
Spring_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
String в Double
    #33798818
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю что никаких приимуществ нет
и помойму ваша функция эфективнее.

Код: 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
String в Double
    #33799199
Spring_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы предпочел без изменений свой вариант
изменения, которые вы сделали,
приведет к ошибке при такой конструкции

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

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


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