ما هي أفضل طريقة لتحديد ما إذا كان الحرف هو حرف في VB6?

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

  •  01-07-2019
  •  | 
  •  

سؤال

تحتاج دالة التي تأخذ حرف كمعلمة و ترجع صحيح إذا كان هو الرسالة.

هل كانت مفيدة؟

المحلول

Seanyboy هو 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 فقط

نصائح أخرى

كان هذا جزء من قانون نشرت من قبل rpetrich ردا على السؤال قبل جويل سبولسكي.شعرت أنه بحاجة إلى وظيفة محددة المشكلة أنه لا يحل.انها حقا رائعة.

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

كنت قد يكون التفكير في نفسك "هل هذا دائما؟" الوثائق على UCase و LCase وظائف يؤكد أنه سوف:

UCase وظيفة فقط أحرف صغيرة يتم تحويلها إلى أحرف كبيرة; كافة الأحرف الكبيرة و nonletter الشخصيات لم تتغير.

LCase وظيفة يتم تحويل الأحرف الكبيرة إلى صغيرة ؛ جميع أحرف صغيرة و nonletter الشخصيات لم تتغير.

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

وأعتقد أننا يمكن تحسين على هذا أكثر من ذلك بقليل. rpetrich's قانون العمل ، ولكن ربما فقط عن طريق الحظ.API استدعاء المعلمة يجب أن يكون TCHAR (WCHAR هنا في الواقع) وليس طويل.وهذا يعني أيضا لا تافه مع تحويل طويل أو اخفاء مع &HFFFF.هذا بالمناسبة هو عدد صحيح و يضيف التحويل الضمني طويلة هنا أيضا.ربما كان يقصد &HFFFF& في هذه الحالة ؟

وعلاوة على ذلك قد يكون من الأفضل أن explictly استدعاء UnicoWS المجمع لهذه استدعاء API ، Win9X التوافق.على 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