Могу ли я отформатировать строку как число в .NET?

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

string phone = "6365555796";

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

"636-555-5796"

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

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

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

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

Обновлено: вопрос в том, чтобы отформатировать строку, содержащую числа, а не само число.

Я удалил свой исходный ответ и отредактировал вопрос, чтобы прояснить, почему я ошибся.

swilliams 29.10.2008 20:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
2 436
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

string phoneText = "6365555796";
long phoneNum = long.Parse(phoneText);
string output = phoneNum.ToString("000-000-0000");

Это интересная идея, но если я хочу включить числа в ASP.NET Gridview или Repeater, потребуется дополнительный код для правильного вывода чисел. Мне было интересно, есть ли однострочная функция .NET, которую я как-то упускал из виду ...

Dan Herbert 29.10.2008 18:52

У вас уже есть ответ от swilliams. Но вы также можете использовать эту функцию «в одну строку», если используете анонимный делегат.

Sunny Milenov 29.10.2008 18:57

Если в начале числа 0, то вы можете получить ошибочный вывод.

faulty 29.10.2008 18:58

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

Это «медленно», так как приведет к созданию большого количества струнных инструментов.

Sunny Milenov 29.10.2008 18:53

Тем не менее, это должно быть быстрее, чем анализировать длинный.

configurator 29.10.2008 19:10

Чтобы управлять строковым форматом числа для отображения в 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);

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

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

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

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

Хех, я скопировал URL, чтобы вставить его в свой пост, но по какой-то причине забыл ...

swilliams 29.10.2008 19:09
Ответ принят как подходящий

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

string number = "1234567890";
string formattedNumber = string.Format("{0}-{1}-{2}", number.Substring(0,3), number.Substring(3,3), number.Substring(6));

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

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

Мое приложение. сохраняет только номера США в 10-значном формате. Если нужны расширения, они будут храниться в отдельном поле. Мы сохраняем числа для сравнения, так как введенные номера телефонов нужно будет сравнить, и удаление всех нечисловых чисел гарантирует, что форматирование пользователя не нарушит этого.

Dan Herbert 29.10.2008 19:33

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

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");
}

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

   /// <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));
   }

Конечно:

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

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

Другие вопросы по теме