正規化された電話番号をユーザーフレンドリーなバージョンに変換する

StackOverflow https://stackoverflow.com/questions/425814

質問

C#アプリケーションでは、正規表現を使用して米国の電話番号の基本形式を検証し、ユーザーが偽のデータを入力していないことを確認しています。次に、数字以外のすべてを削除します。

  

(123)456-7890 x1234

なる

  

12345678901234

データベース内の

。ただし、アプリケーションのさまざまな部分で、この正規化された電話番号を元に戻したいと思います

  

(123)456-7890 x1234

そのようなことをする最良の方法は何ですか? (ちなみに、国際電話番号形式の会計については心配しないでください。)

役に立ちましたか?

解決

String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))

結果は(123)456-7890 x 123となります

他のヒント

正規表現を使用して置き換えることができます:

(\d{3})(\d{3})(\d{4})(\d{4})

with:

(\1) \2-\3 x\4

(私は米国の電話番号に精通していませんが、多分もっとあるかもしれません。)

カスタム形式の文字列を使用して、数値を再び文字列に変換します。

class Program
{
    static void Main(string[] args)
    {
        long phoneNumber = 12345678901234;
        string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
        Console.WriteLine(phoneNumberString);
    }
}

もちろん、電話番号をlongとして、文字列を返す関数にファクタリングします(メソッドに定数としてロードまたは保存された形式、または状況に適したもの)。

ああ、文字列に長い文字列が含まれていない場合は、文字列を簡単に長い文字列に変換してから、それをformat関数に渡すことができます。もちろん、繰り返し実行する場合は、ここでパフォーマンスの考慮事項があります(文字列を繰り返してlongを作成し、サブ文字列を使用するだけで文字列に変換するため)。

米国の数字のみをサポートしている場合は、数字を書式設定して、必要な場所に括弧とxを表示できます。

文字列全体を保存し、正規表現を使用して解析して検証し、正規化された文字列に保存します。

どの国でも受け入れられるようにするには、次のようにします:

すべての電話番号にIDDコードを追加し、その国のユーザーに対してIDDコードを非表示にします。

so:(123)456-7890 x1234は+1(123)456-7890 x1234として保存されます

(perl互換の)正規表現は次のようになります(完全にテストされておらず、動作しません):

(+ \ d +)?\ s +(((\ d {、3}))(?\ s +([-。0-9] {6、})\ s +((x | ext \ w *) \ d {、4})

  • これは、先頭に+が付いたオプションの桁数です
  • 1つ以上のスペースが続く
  • 次に、括弧で囲まれた最大3桁のオプションのグループ
  • 1つ以上のスペース
  • 次に6桁以上の数字、ダッシュ、またはドットのグループ
  • 1つ以上のスペース
  • オプションのxまたはext(ext、extension ...)で始まる単語と最大4桁のグループ

国と市外局番を含むユーザーのデータベースがあり、不足している場合は自動的に入力します。国には電話番号のデフォルトの数字グループ化規則があります(米国では3、4)。 / p>

  • したがって、米国のエリア123にいて456.7890と入力した場合、+ 1(123)4567890と解析され、456-7890のみが表示されます
  • カタールにいて、番号4444555 extenshn 33を入力すると、+ 974 4444555 x33として保存され、4444555 x33として表示されます

国際コードは同じ国のユーザーには表示されず、市外局番は同じ国と市外局番のユーザーには表示されません。完全な番号はマウスオーバーで表示されます(HTMLラベル?)

DBに分割する必要がありますか?そうでない場合は、しないでください。必要な場合は、異なるフィールド(エリアコード、プレフィックス、SubscriberNum、エクステンション)に異なるパーツを保存できます。

または、数値を抽出し、解析を開始します。 10桁しかない場合は、拡張子がないことがわかります。 10を超えるすべての数字は、「x」または何かの後の文字列に貼り付けます。

C ++アプリでこれと似たようなことをして、保存された異なる連絡メカニズムを単一の文字列として記述しましたが、代わりに、あなたがしていることの逆を行いました。ダイアログからフィールドを取り出し、フォーマットされた数値を作成して文字列として保存しました。

これが役立つ拡張メソッドです:

public static string InsertStringAtPositions(this string str, string insertStr, IEnumerable<int> positions)
{
    if (str != null && insertStr != null && positions != null)
    {
        string newString = string.Empty;
        int previousPos = 0;
        foreach (var pos in positions)
        {
            if (pos < str.Length)
            {
                newString += str.Substring(previousPos, pos - previousPos) + insertStr;
                previousPos = pos;
            }
        }
        if (positions.Last() < str.Length)
        {
            return newString + str.Substring(positions.Last(), str.Length - positions.Last());
        }
        return newString;
    }
    return str;
}

使用法:

// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top