VB6에서 문자가 문자인지 확인하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/93105

  •  01-07-2019
  •  | 
  •  

문제

문자를 매개변수로 취하고 문자이면 true를 반환하는 함수가 필요합니다.

도움이 되었습니까?

해결책

씨니보이의 IsCharAlphaA 답변 가까운.가장 좋은 방법은 다음과 같이 W 버전을 사용하는 것입니다.

Private Declare Function IsCharAlphaW Lib "user32" (ByVal cChar As Integer) As Long
Public Property Get IsLetter(character As String) As Boolean
    IsLetter = IsCharAlphaW(AscW(character))
End Property

물론 VB6의 모든 컨트롤은 ANSI 전용이므로 이 모든 것이 거의 중요하지 않습니다.

다른 팁

이것은 게시 된 코드의 일부였습니다. 르페트리치 에 대한 응답으로 질문 ~에 의해 조엘 스폴스키.나는 그것이 해결하는 문제와 관련된 게시물이 필요하다고 느꼈습니다.정말 훌륭합니다.

Private Function IsLetter(ByVal character As String) As Boolean
    IsLetter = UCase$(character) <> LCase$(character)
End Function

당신은 "이것은 항상 효과가 있을까요?" UCASE 및 LCASE 함수에 대한 문서는 다음과 같이 확인합니다.

U케이스 기능 소문자만 대문자로 변환됩니다. 모든 대문자와 문자가 아닌 문자는 변경되지 않습니다..

L케이스 기능 대문자만 소문자로 변환됩니다. 모든 소문자와 문자가 아닌 문자는 변경되지 않습니다..

Private Function IsLetter(Char As String) As Boolean
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function

모호한 언어 동작에 의존하지 않는 다음의 문제점은 무엇입니까?

Private Function IsLetter(ByVal ch As String) As Boolean
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function

나는 우리가 이 점을 좀 더 개선할 수 있다고 믿습니다. 르페트리치의 코드는 작동하지만 아마도 운이 좋을 것입니다.API 호출의 매개변수는 Long이 아닌 TCHAR(여기서는 실제로 WCHAR)여야 합니다.이는 또한 Long으로 변환하거나 &HFFFF로 마스킹하는 작업이 필요하지 않음을 의미합니다.그런데 이것은 Integer이고 여기에서도 Long에 대한 암시적 변환을 추가합니다.아마도 이 경우에는 &HFFFF&를 의미했을 것입니다.

또한 Win9X 호환성을 위해 이 API 호출에 대해 UnicoWS 래퍼를 명시적으로 호출하는 것이 가장 좋습니다.UnicoWS.dll을 배포해야 할 수도 있지만 최소한 해당 옵션을 얻을 수 있습니다.그런 다음 다시 VB6에서 자동으로 리디렉션될 수 있습니다. 테스트하기 위해 Win9X가 설치되어 있지 않습니다.

Option Explicit

Private Declare Function IsCharAlphaW Lib "unicows" (ByVal WChar As Integer) As Long

Private Function IsLetter(Character As String) As Boolean
    IsLetter = IsCharAlphaW(AscW(Character))
End Function

Private Sub Main()
    MsgBox IsLetter("^")
    MsgBox IsLetter("A")
    MsgBox IsLetter(ChrW$(&H34F))
    MsgBox IsLetter(ChrW$(&HFEF0))
    MsgBox IsLetter(ChrW$(&HFEFC))
End Sub

조금 둘러보니 아래와 같은 내용이 나오더군요..

Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long

나는 IsCharAlphaA가 ANSI 문자 세트를 테스트하고 IsCharAlpha가 ASCII를 테스트한다고 믿습니다.내가 틀렸을 수도 있습니다.

Private Function IsAlpha(ByVal vChar As String) As Boolean
  Const letters$ = "abcdefghijklmnopqrstuvwxyz"

  If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function

나는 이것을 VBA에서 사용합니다

Function IsLettersOnly(Value As String) As Boolean
   IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function

그 자체를 정확하게 문서화하지는 않습니다.그리고 속도가 느릴 수도 있습니다.그것은 영리한 해킹이지만 그게 전부입니다.나는 내 검사에서 더 분명해지고 싶은 유혹을 느낄 것입니다.정규식을 사용하거나 더 명확한 테스트를 작성하십시오.

public bool IsAlpha(String strToCheck)
{
    Regex objAlphaPattern=new Regex("[^a-zA-Z]");
    return !objAlphaPattern.IsMatch(strToCheck);
}

public bool IsCharAlpha(char chToCheck)
{
    return ((chToCheck=>'a') and (chToCheck<='z')) or ((chToCheck=>'A') and (chToCheck<='Z'))
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top