Форматировать / анализировать строку в Vb - PullRequest
0 голосов
/ 23 октября 2008

Я работаю с некоторым вводом, который находится в возможных формах

$1,200
20 cents/ inch
$10

Есть ли способ разобрать их на числа в VB? Также печатать эти цифры?

РЕДАКТИРОВАТЬ: Регулярные выражения было бы здорово.

РЕДАКТИРОВАТЬ: VB 6 в частности

Ответы [ 3 ]

3 голосов
/ 23 октября 2008

Вы имеете в виду VB6 / VBA или VB.net? В VB6 или VBA вы можете сделать CLng () Или CDec () в зависимости от того, какой тип номера вы хотите. Они отлично справятся с начальным знаком доллара и запятыми. Для работы с 20 центами / дюйм вы, вероятно, должны сделать что-то вроде CLng (split ("20 центов / дюйм", "") (0)) Эти функции выдают ошибку преобразования типа, если они не могут преобразовать. Вы можете перехватить это и попытаться преобразовать это другим способом, если они терпят неудачу.

Существует также функция под названием Val, которая возвращает числовую часть. Он не генерирует ошибки преобразования типов, такие как CDec. Но он также не обрабатывает любой нечисловой ввод. Он дает вам десятичное значение цифр в строке, если оно начинается с цифры. Он игнорирует любые завершающие символы.

1 голос
/ 24 октября 2008

Иногда это требует грубой силы!

Вот процедура, которая принимает строку с числами и возвращает число, правильно обработанное с дробями, суффиксами M или B и т. Д. Вы можете изменить i для обработки любого специального условия или алгебры текста (миль / час, центов / дюйм и т. Д.)

Это взято из одного из наших производственных приложений, таким образом, номера строк, которые мы используем в нашем обработчике ошибок (ERHandler), а также стандартная процедура выхода.

Function GetNumberFromString(s As String) As Currency
12800 Const ProcID = "GetNumberFromString"
12810 Dim c                                   As String
12820 Dim d                                   As Integer
12830 Dim Denominator                         As Double ' currency only handles 4 places
12840 Dim HaveDec                             As Boolean
12850 Dim HaveSlash                           As Boolean
12860 Dim HaveSpace                           As Boolean
12870 Dim i                                   As Integer
12880 Dim LenV                                As Integer
12890 Dim NegMult                             As Integer
12900 Dim Numerator                           As Currency
12910 Dim TempVal                             As Currency
12920 Dim v                                   As String

      'Provides the functionality of VAL, but handles commas, fractions
      ' also million and billion

12930 On Error GoTo ErrLbl
12940 oLog.LogProcEntry ModuleID, ProcID, "v=" & v

12950 v = Trim(s)
12960 LenV = Len(v)
12970 If LenV = 0 Then
12980     GetNumberFromString = 0
12990     GoTo ExitProc
13000 End If
13010 TempVal = 0
13020 d = 0
13030 NegMult = 1
      '
13040 For i = 1 To LenV
13050     c = Mid(v, i, 1)
13060     Select Case c
          Case "0" To "9"
13070         If HaveSpace Then
13080             If Not HaveSlash Then
13090                 Numerator = 10 * Numerator + Asc(c) - 48
13100             Else
13110                 Denominator = 10 * Denominator + Asc(c) - 48
13120             End If
13130         ElseIf Not HaveDec Then
13140             TempVal = 10 * TempVal + Asc(c) - 48
13150         Else
13160             TempVal = TempVal + ((Asc(c) - 48)) / (10 ^ d)
13170             d = d + 1
13180         End If
13190     Case ",", "$"
          ' do nothing
13200     Case "-" 'let handle negatives ns 12/20/96
13210         NegMult = -1 * NegMult
13220     Case "(" 'let handle negatives mt 6/9/99
13230         NegMult = -1 * NegMult
13240     Case "."
13250         HaveDec = True
13260         d = 1
13270     Case " "
13280         HaveSpace = True
13290         d = 1
13300     Case "/"
13310         HaveSlash = True
13320         If Not HaveSpace Then
13330             HaveSpace = True
13340             Numerator = TempVal
13350             TempVal = 0
13360         End If
13370     Case "b", "B"
13380         If UCase(Mid(v, i, 7)) = "BILLION" Then
13390             TempVal = TempVal * 1000000000#
13400             Exit For
13410         End If
13420     Case "m", "M"
13430         If UCase(Mid(v, i, 7)) = "MILLION" Then
13440             TempVal = TempVal * 1000000#
13450             Exit For
13460         End If
13470     Case Else
          ' ignore character/error
13480     End Select
13490 Next i

13500 If HaveSlash And Denominator <> 0 Then
13510     TempVal = TempVal + Numerator / Denominator
13520 End If

13530 GetNumberFromString = TempVal * NegMult

ExitProc:
13540 oLog.LogProcExit ModuleID, ProcID
13550 Exit Function

ErrLbl:
13560 Debug.Print Err.Description, Err.Number
13570 Debug.Assert False
13580 ERHandler ModuleID, ProcID
13590 Resume
End Function
1 голос
/ 23 октября 2008

Эххххххххххх ... Предполагая, что все, что вам нужно, это цифры, я бы использовал Регулярное выражение, чтобы просто заменить любую нецифровую на "".

Вам необходимо сослаться на регулярные выражения Microsoft VBScript в своем проекте. Тогда скажем, что ваш текст был в переменной с именем strTest. Вот несколько непроверенных кодов:

Dim oRE As Object
Set oRE = New VBScript_RegExp.RegExp
oRe.Pattern = "\D"
strTest = oRE.Replace(strTest, "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...