문제

C# 응용 프로그램에서는 정규 표현식을 사용하여 미국 전화 번호의 기본 형식을 검증하여 사용자가 가짜 데이터를 입력하지 않도록합니다. 그런 다음 숫자를 제외한 모든 것을 벗겨냅니다.

(123) 456-7890 x1234

becomes

12345678901234

데이터베이스에서. 그러나 응용 프로그램의 여러 부분 에서이 정규화 된 전화 번호를 다시 전환하고 싶습니다.

(123) 456-7890 x1234

그런 일을하는 가장 좋은 방법은 무엇입니까? (국제 전화 번호 형식의 회계에 대해 걱정하지 마십시오.)

도움이 되었습니까?

해결책

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

(123) 456-7890 x 123을 초래할 것입니다

다른 팁

REGEX를 사용하면 다음을 교체 할 수 있습니다.

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

와 함께:

(\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);
    }
}

물론, 전화 번호를 길게 가져 오는 함수로 고려한 다음 문자열을 반환합니다 (형식이 방법에서 상수로로드되거나 저장된 형식으로, 또는 상황에 적합한 것).

아, 그리고 길이가 아니고 길이가 아니라면 문자열을 쉽게 길게 변환 한 다음 형식 함수로 전달할 수 있습니다. 물론, 당신이 그것을 반복적으로 수행하는 경우 여기에는 성능 고려 사항이 있습니다 (스트링을 반복하여 길이를 만들고 서브 스트링 만 사용할 수있을 때 문자열로 다시 변환하기 때문에).

당신이 우리 숫자 만 지원하는 경우, 당신은 단순히 숫자를 형성하여 괄호와 원하는 곳에 x를 표시 할 수 있습니다.

나는 전체 문자열을 저장하는 것을 선호합니다. 정학을 사용하여 구문 분석하여 그것을 검증 한 다음 정규화 된 문자열에 저장합니다.

모든 국가를 받아들이려면 다음을 수행 할 것입니다.

IDD 코드를 모든 전화 번호에 추가 한 다음 해당 국가의 사용자로부터 숨 깁니다.

SO : (123) 456-7890 X1234는 +1 (123) 456-7890 X1234로 저장됩니다.

(perl-compative) Regex는 (완전히 테스트되지 않은 상태에서 작동하지 않을 것입니다)와 같은 것입니다.

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

  • 이것은 선택의 숫자 숫자입니다.
  • 하나 이상의 공간이 이어집니다
  • 그런 다음 괄호 사이에 최대 3 자리의 선택적 그룹
  • 그런 다음 하나 이상의 공간
  • 그런 다음 6 자리 이상, 대시 또는 도트 그룹
  • 그런 다음 하나 이상의 공간
  • 그런 다음 ext (ext, extension ...)로 시작하는 옵션 X 또는 최대 4 자리 그룹으로 시작하는 단어

국가 및 지역 코드를 포함한 사용자 데이터베이스를 보유한 다음 누락 된 경우 자동으로 사용자를 채우고, 국가는 전화 번호에 대한 기본 숫자 그룹화 협약 (미국의 경우 3,4)을 가질 것입니다.

  • 따라서 미국의 123 개 지역에 있고 456.7890에 들어가면 +1 (123) 4567890으로 구문 분석되며 456-7890으로 만 볼 수 있습니다.
  • 카타르에 있고 숫자 4444555 Extenshn 33을 입력한다면 +974 4444555 x33으로 저장되면 4444555 x33로 표시됩니다.

같은 국가의 사용자에게는 국제 코드가 표시되지 않으며 동일한 국가 및 지역 코드의 사용자에게는 영역 코드가 표시되지 않습니다. 전체 번호는 OnMouseOver (HTML 레이블?)로 표시됩니다.

DB를 위해 그것을 분해해야합니까? 그렇지 않다면. 그렇다면 다른 부분을 다른 필드 (지역 코드, 접두사, 가입자, extenion)에 저장할 수 있습니다.

또는 숫자를 추출하고 구문 분석을 시작하십시오. 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