Могу ли я отформатировать строку как число в .NET? - PullRequest
4 голосов
/ 29 октября 2008

Если бы у меня был такой номер телефона

string phone = "6365555796";

Который я храню только с числовыми символами в моей базе данных (в виде строки) , возможно ли вывести число следующим образом:

"636-555-5796"

Аналогично тому, как я мог бы использовать число:

long phone = 6365555796;
string output = phone.ToString("000-000-0000");

Я попытался выполнить поиск, и все, что я мог найти в Интернете, это числовое форматирование документов.

Причина, по которой я спрашиваю, заключается в том, что я думаю, что было бы интересно сохранить в БД только числовые значения и разрешить различное форматирование, используя строковое значение константы, чтобы определять форматирование моих телефонных номеров. Или мне лучше использовать номер для этого?

РЕДАКТИРОВАТЬ: Вопрос в том, чтобы отформатировать строку, содержащую числа, а не само число.

Ответы [ 9 ]

7 голосов
/ 29 октября 2008

Лучшее, что я могу придумать без необходимости преобразования в long / число, и поэтому оно умещается в одну строку:

string number = "1234567890";
string formattedNumber = string.Format("{0}-{1}-{2}", number.Substring(0,3), number.Substring(3,3), number.Substring(6));
6 голосов
/ 29 октября 2008

Простая версия:

string phone = "6365555796";
Convert.ToInt64(phone).ToString("000-000-0000");

Чтобы обернуть это утверждение и поместить его в хороший метод:

string FormatPhone(string phone)
{
   /*assume the phone string came from the database, so we already know it's
     only digits.  If this changes in the future a simple RegEx can validate 
     (or correct) the digits requirement. */

   // still want to check the length:
   if (phone.Length != 10) throw new InvalidArgumentException();

  return Convert.ToInt64(phone).ToString("000-000-0000");
}
6 голосов
/ 29 октября 2008

Имейте в виду, что не все используют североамериканский формат 3-3-4 для телефонных номеров. Европейские телефонные номера могут быть длиной до 15 цифр со значительной пунктуацией, например, + 44-XXXX-XXXX-XXXX отличается от 44 + XXXX-XXXX-XXXX. Вы также не рассматриваете АТС и добавочные номера, для которых может потребоваться более 30 цифр.

Военные и радиотелефоны могут иметь буквенные символы, нет, это не "2" = "ABC", который вы видите на телефонах с тональным набором.

4 голосов
/ 29 октября 2008

Я думаю, что это работает

string s = string.Format("{0:###-###-####}", ulong.Parse(phone));

Кроме того, это http://blog.stevex.net/index.php/string-formatting-in-csharp/ - хороший пост о форматировании строк в .NET.

Спасибо @swilliams за разъяснения.

1 голос
/ 29 октября 2008

Мне нравится какое-то действие метода расширения:

   /// <summary>
   ///   Formats a string of nine digits into a U.S. phone number.
   /// </summary>
   /// <param name="value">
   ///   The string to format as a phone number.
   /// </param>
   /// <returns>
   ///   The numeric string as a U.S. phone number.
   /// </returns>
   public static string
   ToUSPhone (this string value)
   {
      if (value == null)
      {
         return null;
      }

      long  dummy;

      if ((value.Length != 10) ||
         !long.TryParse (
            value,
            NumberStyles.None,
            CultureInfo.CurrentCulture,
            out dummy))
      {
         return value;
      }

      return string.Format (
         CultureInfo.CurrentCulture,
         "{0}-{1}-{2}",
         value.Substring (0, 3),
         value.Substring (3, 3),
         value.Substring (6));
   }
1 голос
/ 29 октября 2008

Почему бы просто не сделать что-то подобное?

string phoneText = "6365555796";
long phoneNum = long.Parse(phoneText);
string output = phoneNum.ToString("000-000-0000");
0 голосов
/ 30 октября 2008

Sure:

Regex.Replace(phone, @"^(\d{3})(\d{3})(\d{4})$", @"$1-$2-$3")

Конечно, теперь у вас 2 проблемы .

0 голосов
/ 29 октября 2008

Чтобы управлять строковым форматом числа для отображения в ASP.NET Gridview или другом элементе управления, вы можете заключить свой элемент в вспомогательный класс для целей отображения:

public class PhoneDisplay
{
    long phoneNum;
    public PhoneDisplay(long number)
    {
        phoneNum = number;
    }
    public override string ToString()
    {
        return string.Format("{0:###-###-####}", phoneNum);
    }

}

Затем определите поля данных или отображения как (например,):

PhoneDisplay MyPhone = new PhoneDisplay(6365555796);
0 голосов
/ 29 октября 2008

Вы могли бы потенциально вставить строку в заданную символьную точку. Вроде как: phone = phone.Insert (3, "-"); phone = phone.Insert (7, "-");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...