6

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

(123)456-7890 x1234

になります

12345678901234

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

(123)456-7890 x1234

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

4

6 に答える 6

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

(123) 456-7890 x 123 になります

于 2009-01-08T20:49:59.590 に答える
4

正規表現を使用すると、次のものを置き換えることができます。

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

と:

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

(私は米国の電話番号に慣れていないので、他にもあるかもしれませんが。)

于 2009-01-08T20:46:55.227 に答える
2

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

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

もちろん、電話番号を長いものとして取り、文字列を返す関数に分解します(メソッドに定数としてロードまたは保存された形式、または状況に適したもので)。

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

于 2009-01-08T20:49:47.217 に答える
1

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

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

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

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

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

(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)。

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

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

于 2009-01-08T21:13:53.067 に答える
0

DBのためにそれを分解する必要がありますか? そうでない場合は、しないでください。必要な場合は、さまざまな部分をさまざまなフィールド (エリアコード、プレフィックス、加入者番号、内線番号) に格納できます。

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

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

于 2009-01-08T20:48:19.217 に答える
0

役立つ拡張メソッドを次に示します。

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});
于 2009-03-26T00:21:18.817 に答える