Если бы у меня был такой номер телефона
string phone = "6365555796";
Который я храню только с числовыми символами в моей базе данных (в виде строки), можно ли вывести число следующим образом:
"636-555-5796"
Подобно тому, как я мог бы использовать число:
long phone = 6365555796;
string output = phone.ToString("000-000-0000");
Я пробовал искать, и все, что я мог найти в Интернете, это документы числового форматирования.
Причина, по которой я спрашиваю, заключается в том, что я думаю, что было бы интересной идеей иметь возможность хранить только числовые значения в БД и допускать различное форматирование с использованием постоянного строкового значения, чтобы определять, как форматируются мои телефонные номера. Или мне лучше использовать для этого номер?
Обновлено: вопрос в том, чтобы отформатировать строку, содержащую числа, а не само число.





Почему бы просто не сделать что-то подобное?
string phoneText = "6365555796";
long phoneNum = long.Parse(phoneText);
string output = phoneNum.ToString("000-000-0000");
Это интересная идея, но если я хочу включить числа в ASP.NET Gridview или Repeater, потребуется дополнительный код для правильного вывода чисел. Мне было интересно, есть ли однострочная функция .NET, которую я как-то упускал из виду ...
У вас уже есть ответ от swilliams. Но вы также можете использовать эту функцию «в одну строку», если используете анонимный делегат.
Если в начале числа 0, то вы можете получить ошибочный вывод.
Вы потенциально можете вставить строку в заданную точку символа. Вроде как: phone = phone.Insert (3, "-"); phone = phone.Insert (7, "-");
Это «медленно», так как приведет к созданию большого количества струнных инструментов.
Тем не менее, это должно быть быстрее, чем анализировать длинный.
Чтобы управлять строковым форматом числа для отображения в 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, чтобы вставить его в свой пост, но по какой-то причине забыл ...
Лучшее, что я могу придумать без преобразования в 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-значном формате. Если нужны расширения, они будут храниться в отдельном поле. Мы сохраняем числа для сравнения, так как введенные номера телефонов нужно будет сравнить, и удаление всех нечисловых чисел гарантирует, что форматирование пользователя не нарушит этого.
Простая версия:
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 проблемы.
Я удалил свой исходный ответ и отредактировал вопрос, чтобы прояснить, почему я ошибся.