ما هي أفضل طريقة لتحديد ما إذا كان الحرف هو حرف في VB6?
-
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'))
}