C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 電話番号のFormatについて


(過去ログ 116 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■68508 / inTopicNo.1)  電話番号のFormatについて
  
□投稿者/ みや (4回)-(2013/10/24(Thu) 17:51:36)

分類:[.NET 全般] 

いつもお世話になっております。
過去ログで見つけられなかったので、質問させていただきます。

OS:Win7
言語:VB2012

ファイルから取り込んだ指定箇所を取得して、そのデータを置換したいのですが、うまく変換できず困っています。

●↓取得データ(電話番号)
03-1111-2222
043(1111)2222
090-(1111)-2222
012011112222
取得する情報は「数値・ハイフン・カッコ」のみです
が、ハイフンとカッコの位置はいろいろあります。
これらを、

●↓変換後
03-0000-0001
043(0000)0001
090-(0000)-0001
012000000001

のように、元の電話番号に合わせたFormatと文字数で置換していきたいのです。
012011112222→012000000001のような変換は簡単なのですが、各位置に配されたハイフンやカッコのまま変換かけてやることがどうしてもできず…
Format関数ではできないのでしょうか?
なにか方法がありましたら、お手数ですがご教授をお願いいたします
引用返信 編集キー/
■68510 / inTopicNo.2)  Re[1]: 電話番号のFormatについて
□投稿者/ 魔界の仮面弁士 (393回)-(2013/10/24(Thu) 20:26:28)
No68508 (みや さん) に返信
> 取得する情報は「数値・ハイフン・カッコ」のみです
区切り位置にある程度の決まりはありますが、複雑なんですよね…。
http://www5d.biglobe.ne.jp/%257estssk/mobiletel.html
http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html


> のように、元の電話番号に合わせたFormatと文字数で置換していきたいのです。
具定例はありがたいですが、肝心の置換ルールを書いてもらわないと、仕様が分からないです。(^^;

例示されたものを見る限りでは、
 ・末尾を1にする
 ・先頭のサービス番号/市外局番の部分は置換しない
 ・残りの部分は、すべて 0 に置換する
という形でしょうか?


とりあえず、単純に一文字ずつ判定するとしたら、こんな感じ。


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 TextBox2.Text = Foo(TextBox1.Text)
End Sub

Public Function Foo(phone As String) As String
 Dim sb As New StringBuilder(phone)
 Dim rep As Boolean = False
 For n = 1 To sb.Length - 2
  If Not sb(n) Like "[1-9]" Then
   rep = True
  End If
  If rep AndAlso sb(n) Like "#" Then
   sb(n) = "0"c
  End If
 Next
 sb(sb.Length - 1) = "1"c '末尾は 1 固定
 Return sb.ToString()
End Function



とりあえず、例に挙げられた 4 パターンについては網羅させていますが、最後の
012011112222 → 012000000001 については、変換ルールが不明の為、かなり手抜きです。

「2番目の 0 または最初の非数値までは置換しない、それ以降は末尾直前まで 0 に置換」という
ルールで置き換えていますので、「括弧やハイフン無しの固定電話の番号」だと通用しません。
引用返信 編集キー/
■68519 / inTopicNo.3)  Re[2]: 電話番号のFormatについて
□投稿者/ みや (5回)-(2013/10/25(Fri) 11:44:12)
No68510 (魔界の仮面弁士 さん) に返信
何度もお世話になっております。ご返答ありがとうござい(__)ます

> 具定例はありがたいですが、肝心の置換ルールを書いてもらわないと、仕様が分からないです。(^^;
あ、申し訳ありません。
置換文字については、単純に1度置換するごとに1カウントUPで、それについては自身で解決住みのため記述いたしませんでした。
人様に質問してるんですからちゃんと書くべきでしたね。申し訳ありません

●各電話番号を取得しその番号の文字数に合わせて[前ゼロ付与したカウントを1UPしていく
※ただし、左から3文字(数値のみ)はそのまま

03-1111-2222  → 03-1000-0001
043(1111)2222  → 043(0000)0002
090-(1111)-2222 → 090-(0000)-0003
012011112222  → 012000000004

なので、ここに変換内容については終了しておりまして…問題は、()やら-を元のように付け直すことだったのです。
やはり、1文字ずつ判定させるしかないのでしょうかね…。
ご提示いただいた内容を元に、今から作成・テストしてみます。

引用返信 編集キー/
■68522 / inTopicNo.4)  Re[3]: 電話番号のFormatについて
□投稿者/ King (7回)-(2013/10/25(Fri) 11:53:03)
> ※ただし、左から3文字(数値のみ)はそのまま

市外局番は1〜4ケタですが問題ないのでしょうか。
引用返信 編集キー/
■68523 / inTopicNo.5)  Re[4]: 電話番号のFormatについて
□投稿者/ 魔界の仮面弁士 (396回)-(2013/10/25(Fri) 12:15:30)
2013/10/25(Fri) 12:40:23 編集(投稿者)

No68519 (みや さん) に返信
> ご提示いただいた内容を元に、今から作成・テストしてみます。
実はあのコードだと、
 (03)3456-7890
といった表記には対応できません。

固定電話同士の市内通話では、市外局番を省略できるので、
市外局番部分をカッコで囲んだ、上記のような表記もよく見かけます。


また、今回は「数値・ハイフン・カッコ」のみなので、関係ないですが、
多国籍企業の方の名刺などでは、
 81+3-3456-7890
のように、"国番号+" を付与した表記も見かけますね。


> 03-1111-2222  → 03-1000-0001
最初の質問では
 03-1111-2222  → 03-0000-0001
だったのにのにのにっ。


No68522 (King さん) に返信
>>※ただし、左から3文字(数値のみ)はそのまま
市内局番以降は、どうせ握りつぶしてしまうので、あまり気にするところでは
ないのかもしれませんが、その仕様だと、
  0123-yy-zzzz  北海道夕張市
の電話番号が、
  0120-yy-zzzz
になってしまい、まるでフリーダイヤルに見えてしまう点が気になります。

「0070」系のフリーダイヤルと
「0077」系のフリーダイヤルは、どちらも
同じ 0070 に置き換えられてしまいますね。


> 市外局番は1〜4ケタですが問題ないのでしょうか。

先頭 0 も市外局番の一部と見なすこともありますので、
その場合は 2桁〜5桁という表現になりますね。

なお、長い市外局番(4桁)としては、具体的には
 01586-y-zzzz … 北海道紋別郡湧別町
 01587-y-zzzz … 北海道常呂郡佐呂間町
などがあります。この場合、市内局番は 1 桁です。


日本の固定電話の場合、
 先頭は 0 固定(国内プレフィックス)、
 続けて局番5桁(市外局番1〜4桁、市内局番4〜1桁)、
 最後に加入者番号 4 桁
という仕様ですね。すなわち
 0x-yyyy-zzzz
 0xx-yyy-zzzz
 0xxx-yy-zzzz
 0xxxx-y-zzzz
の形式です。(昔は、0x-yyy-zzzz などの 9 桁番号もありましたが)
引用返信 編集キー/
■68524 / inTopicNo.6)  Re[4]: 電話番号のFormatについて
□投稿者/ shu (404回)-(2013/10/25(Fri) 12:21:19)
正規表現を使う例

Imports System.Text.RegularExpressions


Dim re As New Regex("(?<no1>\d{1,4})(?<s1>[^\d]*)(?<no2>\d+)(?<s2>[^\d]*)(?<no3>\d{4})")
Dim samples = {"03-1111-2222", "043(1111)2222", "090-(1111)-2222", "012011112222"}
For Each sample In samples
Dim m = re.Match(sample)
Console.WriteLine("sample={0}, no1={1}, s1={2}, no2={3}, s2={4}, no3={5}", sample, _
m.Groups("no1").Value, m.Groups("s1").Value, _
m.Groups("no2").Value, m.Groups("s2").Value, m.Groups("no3").Value)
Next


実行時の結果:
sample=03-1111-2222, no1=03, s1=-, no2=1111, s2=-, no3=2222
sample=043(1111)2222, no1=043, s1=(, no2=1111, s2=), no3=2222
sample=090-(1111)-2222, no1=090, s1=-(, no2=1111, s2=)-, no3=2222
sample=012011112222, no1=0120, s1=, no2=1111, s2=, no3=2222


となるのでこのno1,s1,no2,s2,no3を使用すればなんとかなりそうな気がします。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -