Разделение имени пользователя - PullRequest
0 голосов
/ 22 ноября 2010

Привет всем, я пытаюсь разделить имя пользователя, но у меня проблемы с этим.Ниже приведена моя версия, если у имени пользователя в скобках есть имя «go by»:

theName = "Gates, Bill W. (Bill)"
hasBracket = False

If InStr(theName, "(") <> 0 Then
    hasBracket = True
End If

If hasBracket = True Then
    bracketPos = InStr(theName, ",")

    lName = StrConv(Trim(Left(theName, bracketPos - 1)), vbProperCase)

    theName = Trim(Mid(theName, bracketPos + 2))
    bracketPos = InStr(theName, " ")

    fName = StrConv(Trim(Left(theName, bracketPos - 1)), vbProperCase)

    theName = Trim(Mid(theName, bracketPos))

    If Trim(Left(theName, 1)) <> "(" Then
        mName = StrConv(Replace(Trim(Left(theName, 1)), ".", ""), vbProperCase)
    Else
        mName = ""
    End If

    bracketPos = InStr(theName, "(")

    bName = StrConv(Replace(Replace(Trim(Mid(theName, bracketPos)), "(", ""), ")", ""), vbProperCase)
Else
    ...
End If

Эта часть работает нормально, если в имени пользователя есть «()».Переход к части ELSE, где "()" не используются, кажется мне сложной задачей.Проблема в том, что имя пользователя может быть отформатировано следующим образом:

Gates, Bill W.
Gates, Bill

Может быть, я просто слишком обдумываю это, но я не могу проверить, имеет ли оно второе имя или не использует код сверху дляраздел ELSE:

ELSE
    bracketPos = InStr(theName, ",")

    lName = StrConv(Trim(Left(theName, bracketPos - 1)), vbProperCase)

    theName = Trim(Mid(theName, bracketPos + 2))
    bracketPos = InStr(theName, " ")

    If bracketPos <> 0 Then
        fName = StrConv(Trim(Left(theName, bracketPos - 1)), vbProperCase)
    End If

    theName = Trim(Mid(theName, bracketPos))

    If Trim(Left(theName, 1)) <> "(" Then
        mName = StrConv(Replace(Trim(Left(theName, 1)), ".", ""), vbProperCase)
    Else
        mName = ""
    End If

    MsgBox lName & " " & fName & " " & mName
END IF

Приведенный выше код отлично работает, если имя пользователя «Gates, Bill W.»но не если его "Ворота, Билл".Что я могу сделать, чтобы проверить, есть ли у него отчество, потому что в настоящее время, если это не так, то я получаю сообщение об ошибке:

theName = Trim(Mid(theName, bracketPos))

Любая помощь будет отличной, спасибо!: о)

Дэвид

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

Не уверен, что у меня в голове, но здесь полезно было бы написать серию тестов.

Я не уверен, существует ли какое-либо программное обеспечение TDD для VB6, но вы легко можете сделать что-нибудь, чтобы помочь вам написать эту функцию "UserNameSplit"

В конце вашего метода распечатайте его, ваши части имени, имя, фамилию и т. Д.

Затем напишите TestMethod, который будет вызывать UserNameSplit с чем-то простым «Биллом Гейтсом». Назовите его, и, когда напечатанный вывод будет правильным, добавьте еще один вызов UserNameSplit с чем-то более сложным «Gates, Bill»

Продолжайте добавлять звонки, постепенно. Убедитесь, что вы ничего не нарушаете при добавлении новых функций в метод UserNameSplit. Как только один из выходных данных окажется неправильным, выполните резервное копирование в рабочее состояние и повторите попытку.

Также, глядя на ваш код, вам нужно прекратить повторное использование переменных. Если он назван "BracketPos", он никогда не должен содержать позицию запятой или пробела. Это делает код очень трудным для чтения и отслеживания, и, вероятно, это причина того, что этот метод сбивает с толку, и вашу ошибку трудно найти.

0 голосов
/ 22 ноября 2010

Я не знаю, почему я не думал об этом раньше! Решено! : О)

Dim arryTmp() As String
Dim theName As String
Dim fName As String
Dim lName As String
Dim mName As String
Dim bName As String

theName = "Gates, Bill W."
arryTmp = Split(theName, " ")

If InStr(theName, "(") <> 0 Then
    If UBound(arryTmp) = 3 Then
        lName = Replace(StrConv(Trim(arryTmp(0)), vbProperCase), ",", "")
        fName = StrConv(Trim(arryTmp(1)), vbProperCase)
        mName = Replace(StrConv(Trim(arryTmp(2)), vbProperCase), ".", "")
        bName = Replace(Replace(StrConv(Trim(arryTmp(3)), vbProperCase), ")", ""), "(", "")
    ElseIf UBound(arryTmp) = 2 Then
        lName = Replace(StrConv(Trim(arryTmp(0)), vbProperCase), ",", "")
        fName = StrConv(Trim(arryTmp(1)), vbProperCase)
        mName = Replace(StrConv(Trim(arryTmp(2)), vbProperCase), ".", "")
    ElseIf UBound(arryTmp) = 1 Then
        lName = Replace(StrConv(Trim(arryTmp(0)), vbProperCase), ",", "")
        fName = StrConv(Trim(arryTmp(1)), vbProperCase)
    End If
Else
    If UBound(arryTmp) = 3 Then
        lName = Replace(StrConv(Trim(arryTmp(0)), vbProperCase) & " " & StrConv(Trim(arryTmp(1)), vbProperCase), ",", "")
        fName = StrConv(Trim(arryTmp(2)), vbProperCase)
        mName = Replace(StrConv(Trim(arryTmp(3)), vbProperCase), ".", "")
    ElseIf UBound(arryTmp) = 2 Then
        lName = Replace(StrConv(Trim(arryTmp(0)), vbProperCase), ",", "")
        fName = StrConv(Trim(arryTmp(1)), vbProperCase)
        mName = Replace(StrConv(Trim(arryTmp(2)), vbProperCase), ".", "")
    ElseIf UBound(arryTmp) = 1 Then
        lName = Replace(StrConv(Trim(arryTmp(0)), vbProperCase), ",", "")
        fName = StrConv(Trim(arryTmp(1)), vbProperCase)
    End If
End If

MsgBox lName & " " & fName & " " & mName & " " & bName

MsgBox lName & " " & fName & " " & mName & " " & bName
...