[[20160315110243]] 『半角の正の整数判定(1,2,3,…)をする関数を自作』(マリオ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『半角の正の整数判定(1,2,3,…)をする関数を自作したい』(マリオ)

 半角の正の整数判定(1,2,3,…)をする関数を自作したいです。

 '正の整数(PositiveInteger)

 イメージは、次のような感じです。

 Sub Main()
   If IsPositiveInteger(str)=True Then 【処理1】
 End Sub

 Public Function IsPositiveInteger(ByVal str As String) As Boolean
     正規表現のCreateObject("VBScript.RegExp")を使った処理
 End Function

 できれば、Functionで正規表現を使いたいです。
 正規表現を使わない方法もあれば、それも知りたいです。

 ************************************************************

 次なら簡単なんですが…
 数字判定
 If IsNumeric(x) Then

 正の数字判定
 If Sgn(x)=1 Then

< 使用 Excel:Excel2013、使用 OS:Windows 8.1 >


Public Function IsPositiveInteger(ByVal str As String) As Boolean
     '御参考:正規表現を使わない方法
    Dim flg As Boolean, n As Variant, i As Integer
    If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then IsPositiveInteger = False: Exit Function '"0"や"01"はFalseとする
    For i = 1 To Len(str)
    flg = False
    For Each n In Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
    If Mid(str, i, 1) = n Then flg = True
    Next n
    If Not flg Then IsPositiveInteger = False: Exit Function
    Next i
    IsPositiveInteger = True
End Function
(mm) 2016/03/15(火) 12:47

Public Function IsPositiveInteger(ByVal str As String) As Boolean
     '御参考:正規表現
    Dim i As Integer, RE
    Set RE = CreateObject("VBScript.RegExp")
    RE.Pattern = "[0-9]"
        If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then IsPositiveInteger = False: Exit Function '"0"や"01"はFalseとする
        For i = 1 To Len(str)
           If Not RE.test(Mid(str, i, 1)) Then IsPositiveInteger = False: Exit Function
        Next i
    IsPositiveInteger = True
End Function
(mm) 2016/03/15(火) 13:19

 ネット検索すると、
 【正規表現 数値チェック】
http://ips.nekotype.com/1350/

 こんなパターンで一発みたいですね。

 ^([1-9][0-9]*)$   

(半平太) 2016/03/15(火) 13:49


 こんな感じかな

 Sub test()
    Dim e
    For Each e In Array(10, -10, "100.00", 100.01)
        MsgBox e & " is " & IIf(IsPositiveInteger(e), "", "not ") & " an integer"
    Next
End Sub

 '正規表現
 Function IsPositiveInteger(ByVal txt As String) As Boolean
    With CreateObject("VBScript.RegExp")
        .Pattern = "^\d+(\.0+)?$"
        IsPositiveInteger = .test(txt)
    End With
End Function

 'VBA built-in function
 Function IsPositiveInteger2(ByVal txt As String) As Boolean
    IsPositiveInteger2 = Int(Abs(txt)) = txt
End Function
(seiya) 2016/03/15(火) 17:43

 こんにちは。

 ふだん正規表現など使わないので、資料と首っ引きで作ってみました。
 pattern = "^[1-9](\d)*(,(\d){3})*(.\d+)?$"
 書き上げてふと見ると、なんとご要望は「整数」じゃない ですか(ガ〜ン

 しかも、いまのパターンでは 300000,000が通ってしまう。 
 (\d)*(,(\d){3})*の部分をカンマのあるパターンないパターンに分ければいいのは分かるのだが、
 それでは面白くない。できればワンセンテンスで実現したいという野望を抱き さらに考えてみます。

 せっかく書いたので一応そのままアップしておきます。

 実務的には、もとの文字列からカンマと小数点をreplaceしたうえで 半平太さんのパターンを適用するのが
 パターンもシンプルで分かりやすくて良さげです。
( 佳 ) 2016/03/15(火) 18:39

 マリオさん

 もし桁区切り(カンマ)も考慮するであれば

 .Pattern = "^([1-9]\d{0,2}(,\d{3})*|[1-9]\d*)(\.0+)?$"

 に変更してください。
(seiya) 2016/03/15(火) 19:23

 To mmさん

 '正規表現を使わない方法について
 ★If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then
 なるほど(^^♪

 上記のIf処理では、
 Val関数の返り値
 ex.) 「あ」→「0」
 ex.) 「01」→「1」
 さらに、半角判定もしてるのですね。

 数字には、正の整数以外の数字(小数点「.」、マイナス「-」を含む数字)もあるから、
 さらに、For〜nextで調べてるんですかね。
 *******************************************************
 '正規表現を使う方法について

 正規表現、あまり理解してないのですが、
 正規表現を使わない方法と発想は同じなのが分かります。

 *******************************************************
 IsPositiveIntegerを次のMainで呼び出してみました。

 Sub Main()
     Dim str As Variant
     str = Range("A1").Value
     If IsPositiveInteger(str) = True Then MsgBox "正の整数ですよ(A1セル)"
  End Sub

 mmさん、ありがとうございます。たいへん勉強になりましたm(_ _)m
(マリオ) 2016/03/15(火) 19:55

 To 半平太さん

 ありがとうございますm(_ _)m
 正規表現苦手ざんす(^^♪
 サクラエディタでは、よく使うけど。

 エクセルの学校に投稿するとき、行のはじめに半角スペースを入れたいので(^^♪
 正規表現による置換
 置換前「^」
 置換後「半角スペース文字」
 してます(^^♪

(マリオ) 2016/03/15(火) 19:59


 To seiya さん

 ありがとうございます。
 はじめ、Array(0, "01", "10.00")にして   ?って思いました。

 .Pattern = "^([1-9]\d{0,2}(,\d{3})*|[1-9]\d*)(\.0+)?$"
 にしたら、「0」「"01"」は正の整数でなくなりました(#^^#)

 「10.00」を正の整数から除外するには、どうするんですかね?
 小数点「.」を含むものは全部除外できますか?
 正規表現、苦手ざんす(+_+)
(マリオ) 2016/03/15(火) 20:00

 自分で、いろいろ考えてみたのですが、正規表現を使わないなら、こんなのでもいいかもです。
 mmさん、seiyaさんのコードがヒントになりました。

 Public Function IsPositiveInteger(ByVal str As String) As Boolean
     Dim flg As Boolean, x As Long
     '半角判定
     If StrConv(str, vbNarrow) <> str Then Exit Function
     x = CLng(str)'Clng:表示形式、文字列に対応するため
     If IsNumeric(x) And x = Int(x) And x >= 1 Then IsPositiveInteger = True
 End Function
(マリオ) 2016/03/15(火) 20:02

 そういうことでしたら

         .Pattern = "^(\d{1,2}(,\d{3})*|\d+)$"

 でよさそうな...
(seiya) 2016/03/15(火) 20:06

 こっちです (上記編集できず...)
         .Pattern = "^(\d{1,3}(,\d{3})*|\d+)$"

(seiya) 2016/03/15(火) 20:09


 To seiyaさん
 対応が早すぎます(^^♪

 考えてみたら、「10.00」を正の整数から除外する必要ないかな〜。微妙なとこ。
 .Pattern = "^(\d{1,3}(,\d{3})*|\d+)$"
 も試してみました。ん〜難解な文字が並んでますね(^^♪さっぱり分かりませんが…。
 ありがとうございま〜す!(^^)!

(マリオ) 2016/03/15(火) 20:13


 To 佳さん

 ありがとうございます。試してみました。
 .pattern = "^[1-9](\d)*(,(\d){3})*(.\d+)?$"
 ん〜。

 素直なのは、mmさんの
 If Val(str) = 0 Or StrConv(Val(str), vbNarrow) <> str Then  _
 IsPositiveInteger = False: Exit Function 
 の後、
 文字列に、カンマ「,」、小数点「.」,マイナス「-」がないなら、
 IsPositiveInteger = Trueにする方法なのかな〜??

 だから、「0〜9」の文字も使わずに、正規表現で調べられるかもかも?

 正規表現で、どう表現するのか分かりません…(汗)。

(マリオ) 2016/03/15(火) 20:26


 ほとんのどパターンが出尽くしている様相ですが、無理やり。
 カンマ混在はOKにしています。

 Function IsPositiveInteger(str As String) As Boolean
    Dim n As Variant

    If Len(str) = LenB(StrConv(str, vbFromUnicode)) Then
        If IsNumeric(str) Then
            n = CDbl(str)
            If Sgn(n) = 1 Then
                If Int(n) = n Then IsPositiveInteger = True
            End If
        End If
    End If

 End Function

(β) 2016/03/15(火) 21:20


 > 正規表現で、どう表現するのか分かりません…(汗)。

 それは回答側で考えます。

 あなたのイメージする「半角の正の整数」とは何なのか、言葉でご説明ください。
 そこが不明瞭だから、いろんな回答が出ちゃうのです。

(半平太) 2016/03/15(火) 21:33


最終的にこれでいきます。私としては、解決しました。
正規表現つかってません(汗)すいませ〜ん。

 'strが、正の整数ならTrueを返す
 Public Function IsPositiveInteger(ByVal str As String) As Boolean
    Dim flg As Boolean, x As Long

    If StrConv(str, vbNarrow) <> str Or IsNumeric(str) = False Then Exit Function
    If str = Int(str) And str >= 1 Then IsPositiveInteger = True
 End Function

 'strが、正の整数またはゼロならTrueを返す
 Public Function IsPositiveInteger_Zero(ByVal str As String) As Boolean
    Dim flg As Boolean, x As Long

    If StrConv(str, vbNarrow) <> str Or IsNumeric(str) = False Then Exit Function
    If str = Int(str) And str >= 0 Then IsPositiveInteger_Zero = True
 End Function
(マリオ) 2016/03/15(火) 22:11

 To βさん
 ありがとうございます。

 To 半平太さん
 すいません。気が回りませんでした。

 「半角の正の整数」
 明確にすると次のようになります。

 ■整数のうち、正で負は含まない。
 ■ゼロを含まない。
 ■100,000は整数←カンマを含んでもOK 「,」
 ■100.000は整数←小数点があるがOK  「.」 

ex.) -2 , 100.123 などは整数ではありません。
(マリオ) 2016/03/15(火) 22:26


 こんなのはダメですよね?
「,12,87」「,,,,」「1,2,3」
(マリオ) 2016/03/15(火) 22:28

 もう出してあるよね?

 .Pattern = "^([1-9]\d{0,2}(,\d{3})*|[1-9]\d*)(\.0+)?$"
(seiya) 2016/03/15(火) 23:08

 To seiyさん
 そうでした。

「,12,87」「,,,,」「1,2,3」は、「not an integer」になりました。

 ありがとうございます。

(マリオ) 2016/03/16(水) 00:14


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.