Không làm sống lại một câu hỏi cũ nhưng hình dung tôi có thể cung cấp ít nhất một phương pháp dễ sử dụng hơn một chút, nếu thiết lập phức tạp hơn một chút.
Vì vậy, nếu chúng ta tạo một trình định dạng tùy chỉnh mới, chúng ta có thể sử dụng định dạng đơn giản hơn của string.Format
mà không phải chuyển đổi số điện thoại của mình thànhlong
Vì vậy, trước tiên hãy tạo trình định dạng tùy chỉnh:
using System;
using System.Globalization;
using System.Text;
namespace System
{
/// <summary>
/// A formatter that will apply a format to a string of numeric values.
/// </summary>
/// <example>
/// The following example converts a string of numbers and inserts dashes between them.
/// <code>
/// public class Example
/// {
/// public static void Main()
/// {
/// string stringValue = "123456789";
///
/// Console.WriteLine(String.Format(new NumericStringFormatter(),
/// "{0} (formatted: {0:###-##-####})",stringValue));
/// }
/// }
/// // The example displays the following output:
/// // 123456789 (formatted: 123-45-6789)
/// </code>
/// </example>
public class NumericStringFormatter : IFormatProvider, ICustomFormatter
{
/// <summary>
/// Converts the value of a specified object to an equivalent string representation using specified format and
/// culture-specific formatting information.
/// </summary>
/// <param name="format">A format string containing formatting specifications.</param>
/// <param name="arg">An object to format.</param>
/// <param name="formatProvider">An object that supplies format information about the current instance.</param>
/// <returns>
/// The string representation of the value of <paramref name="arg" />, formatted as specified by
/// <paramref name="format" /> and <paramref name="formatProvider" />.
/// </returns>
/// <exception cref="System.NotImplementedException"></exception>
public string Format(string format, object arg, IFormatProvider formatProvider)
{
var strArg = arg as string;
// If the arg is not a string then determine if it can be handled by another formatter
if (strArg == null)
{
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format), e);
}
}
// If the format is not set then determine if it can be handled by another formatter
if (string.IsNullOrEmpty(format))
{
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format), e);
}
}
var sb = new StringBuilder();
var i = 0;
foreach (var c in format)
{
if (c == '#')
{
if (i < strArg.Length)
{
sb.Append(strArg[i]);
}
i++;
}
else
{
sb.Append(c);
}
}
return sb.ToString();
}
/// <summary>
/// Returns an object that provides formatting services for the specified type.
/// </summary>
/// <param name="formatType">An object that specifies the type of format object to return.</param>
/// <returns>
/// An instance of the object specified by <paramref name="formatType" />, if the
/// <see cref="T:System.IFormatProvider" /> implementation can supply that type of object; otherwise, null.
/// </returns>
public object GetFormat(Type formatType)
{
// Determine whether custom formatting object is requested.
return formatType == typeof(ICustomFormatter) ? this : null;
}
private string HandleOtherFormats(string format, object arg)
{
if (arg is IFormattable)
return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture);
else if (arg != null)
return arg.ToString();
else
return string.Empty;
}
}
}
Vì vậy, nếu bạn muốn sử dụng cái này, bạn sẽ làm một cái gì đó:
String.Format(new NumericStringFormatter(),"{0:###-###-####}", i["MyPhone"].ToString());
Một số điều khác để suy nghĩ về:
Ngay bây giờ nếu bạn đã chỉ định một trình định dạng dài hơn bạn đã tạo một chuỗi để định dạng, nó sẽ chỉ bỏ qua các dấu # bổ sung. Ví dụ nàyString.Format(new NumericStringFormatter(),"{0:###-###-####}", "12345");
sẽ dẫn đến 123-45- vì vậy bạn có thể muốn nó lấy một số loại ký tự phụ có thể có trong hàm tạo.
Ngoài ra, tôi không cung cấp cách thoát dấu # vì vậy nếu bạn muốn đưa nó vào chuỗi đầu ra của mình, bạn sẽ không thể theo cách đó ngay bây giờ.
Lý do tôi thích phương pháp này hơn Regex là tôi thường có yêu cầu cho phép người dùng tự xác định định dạng và tôi dễ dàng giải thích cách sử dụng định dạng này hơn là cố gắng dạy cho người dùng regex.
Ngoài ra, tên lớp là một chút sai lầm vì nó thực sự hoạt động để định dạng bất kỳ chuỗi nào miễn là bạn muốn giữ nó theo cùng một thứ tự và chỉ cần chèn các ký tự bên trong nó.