0埋めされた文字列から0を削除するには
文字列の左側についた0を削除して数値表示のように編集したい場合があります。
001→1
050→50
999→999
-0100→-100(マイナス文字は無視して0を削除したい)
このように文字列の左の0を削除したい場合、対応方法はいくつかあります。
- 数値変換して再度文字列に変換する 簡単!
- 正規表現を使う カスタマイズ+高速化が利点!
- 0以外がある部分以降を取得する
- 文字列を1文字ずつループして判定する
などが挙げられます。
コードが単純で簡単なのは1番の方法です。ほとんどの場合はこの方法で問題ないと思いますが文字列の長さがあまりに長いと数値化する際にオーバーフローする恐れはあります。でもまあそんなことはまずないでしょう。
2番の正規表現の方法はカスタマイズしやすいのと高速化が利点です。欠点とすれば正規表現が分からない方には難しい点です。
3番目は分かりやすいコードにはなると思います。ただ、1番目や2番目と比べるとコードは長くなります。
4番目は思いつきやすい設計ですがおすすめしません。かなり力技になりフラグや変数を多用する必要が出るでしょう。コードはおそらく一番長くなります。
それぞれサンプルコードを紹介します。ただ、4番目の方法はコードが長くなるためパスします。
なお、小数点については-00.123みたいなことは無いと思いましたので対応していません。
1. 数値変換して再度文字列に変換して0を削除する方法
Val関数でDouble型に変換し、それをCStr関数で文字列に戻す関数です。
引数に変換したい文字列を渡して使います。
1 2 3 4 5 6 7 |
Function DelZero1(s As String) As String Dim ret ret = CStr(Val(s)) DelZero1 = ret End Function |
利用方法
引数に変換したい文字列を渡すだけです。
1 2 3 4 5 6 |
Sub DelZero1Test() Debug.Print DelZero1("001") Debug.Print DelZero1("050") Debug.Print DelZero1("999") Debug.Print DelZero1("-0100") End Sub |
実行結果
1 2 3 4 |
1 50 999 -100 |
2. 正規表現を使って0を削除する方法
以下のVBAコードは事前に正規表現の参照設定をしておく必要があります。
VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。
正規表現の「”(\-*)(0*)([0-9]+)”」は、負号(マイナス記号の”-“)があればそれは文字列に変換し、それ以降の0、0以降の数字列、の3か所に分けています。
その上で、真ん中の1文字以上の0「(0*)の部分」を除いて再取得することで、0を削除しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Function DelZeroRegExp(s As String) As String Dim reg As New RegExp '// 正規表現クラスオブジェクト Dim ret '// 検索条件=負号部分、それ以降に続く0、0以降の数字、に分ける reg.Pattern = "(\-*)(0*)([0-9]+)" '// 検索範囲=文字列の最後まで検索 reg.Global = True '// 引数文字列の符号部分と0以降の数字部分を取得する ret = reg.Replace(s, "$1$3") DelZeroRegExp = ret End Function |
利用方法と実行結果は先と同じため省略します。
3. 0以外がある部分以降を取得して0を削除する方法
先頭から0がある位置を探して、それ以降の文字列を取得する考え方です。
ただ、マイナス文字がある場合を考慮しているためコードが長くなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Function DelZeroInstr(s As String) As String Dim i Dim sCopy Dim minusFlg As Boolean Dim ret sCopy = s '// マイナス文字があるかどうかを判定する If (Left(sCopy, 1) = "-") Then minusFlg = True '// マイナス文字を後処理用に除去する sCopy = Mid(sCopy, 2) Else minusFlg = False End If '// 先頭から"0"がある位置を探す For i = 1 To Len(sCopy) If (Mid(sCopy, i, 1) <> "0") Then Exit For End If Next '// 0以降の文字列を取得する ret = Mid(sCopy, i) '// マイナス文字がある場合は付ける If (minusFlg = True) Then ret = "-" & ret End If DelZeroInstr = ret End Function |
利用方法と実行結果は先と同じため省略します。