文字をパラメーターとして受け取り、文字の場合は true を返す関数が必要です。
9 に答える
これはJoel Spolskyの質問に応えてrpetrichが投稿したコードの一部です。解決する問題に特化した投稿が必要だと感じました。それは本当に素晴らしいです。
Private Function IsLetter(ByVal character As String) As Boolean
IsLetter = UCase$(character) <> LCase$(character)
End Function
「これでうまくいくのだろうか?」と思うかもしれません。UCase および LCase 関数に関するドキュメントでは、次のことが確認されています。
UCase 関数小文字のみが大文字に変換されます。 すべての大文字と非文字は変更されません。
LCase 関数大文字のみが小文字に変換されます。 すべての小文字と非文字は変更されません。
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のみであるため、これがすべて問題になることはめったにありません。
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のコードは機能しますが、おそらく運次第です。API 呼び出しのパラメーターは、TCHAR (ここでは実際には WCHAR) であり、Long ではありません。これは、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 Function IsAlpha(ByVal vChar As String) As Boolean
Const letters$ = "abcdefghijklmnopqrstuvwxyz"
If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function
少し調べてみると、次のことがわかりました...
Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
IsCharAlphaA は ANSI 文字セットをテストし、IsCharAlpha は ASCII をテストすると思います。私は間違っているかもしれません。
これを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'))
}