5

文字をパラメーターとして受け取り、文字の場合は true を返す関数が必要です。

4

9 に答える 9

10

これはJoel Spolskyの質問に応えてrpetrichが投稿したコードの一部です。解決する問題に特化した投稿が必要だと感じました。それは本当に素晴らしいです。

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

「これでうまくいくのだろうか?」と思うかもしれません。UCase および LCase 関数に関するドキュメントでは、次のことが確認されています。

UCase 関数小文字のみが大文字に変換されます。 すべての大文字と非文字は変更されません

LCase 関数大文字のみが小文字に変換されます。 すべての小文字と非文字は変更されません

于 2008-09-18T14:36:02.863 に答える
4

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のみであるため、これがすべて問題になることはめったにありません。

于 2008-09-20T20:11:44.310 に答える
2
Private Function IsLetter(Char As String) As Boolean
    IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function
于 2008-09-19T20:44:22.633 に答える
1

あいまいな言語の動作に依存しない次の何が問題になっていますか?

Private Function IsLetter(ByVal ch As String) As Boolean
    IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
于 2008-09-18T14:40:07.907 に答える
1

これをもう少し改善できると思います。 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
于 2009-06-21T19:49:12.050 に答える
0
Private Function IsAlpha(ByVal vChar As String) As Boolean
  Const letters$ = "abcdefghijklmnopqrstuvwxyz"

  If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function
于 2008-09-18T19:34:49.773 に答える
0

少し調べてみると、次のことがわかりました...

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

IsCharAlphaA は ANSI 文字セットをテストし、IsCharAlpha は ASCII をテストすると思います。私は間違っているかもしれません。

于 2008-09-18T14:55:13.987 に答える
0

これをVBAで使用します

Function IsLettersOnly(Value As String) As Boolean
   IsLettersOnly = Len(Value) > 0 And Not UCase(Value) Like "*[!A-Z]*"
End Function
于 2014-03-12T08:34:27.387 に答える
-2

それ自体を正確に文書化するわけではありません。そして、それは遅いかもしれません。巧妙なハックですが、それだけです。私は自分のチェックでもっと明白になりたいと思うでしょう。正規表現を使用するか、より明白なテストを作成してください。

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'))
}
于 2008-09-18T14:44:19.427 に答える