2010-11-05 64 views
12

Không tìm thấy cách thực hiện điều đó. Những gì tôi thấy ít nhiều trên các dòng này (http://blog.stevex.net/string-formatting-in-csharp/):Có thể xác định số ký tự tối đa trong các chuỗi định dạng C# như trong C printf không?

Thực sự không có bất kỳ định dạng nào trong một chuỗi, ngoài sự liên kết của nó. Alignment hoạt động cho bất kỳ đối số nào được in trong một cuộc gọi String.Format. Tạo mẫu

String.Format(“->{1,10}<-”, “Hello”); // gives "->     Hello<-" (left padded to 10) 
String.Format(“->{1,-10}<-”, “Hello”); // gives "->Hello     <-" (right padded to 10) 
+0

biết chính xác là bạn đang cố gắng để đạt được? Bạn có thể đăng các ví dụ về những gì bạn muốn xem không? – Oded

+0

Tôi đang cố gắng chuyển đổi chuỗi định dạng C thành chuỗi định dạng C#. trong C bạn có thể chỉ định% -4.4s và tương tự. –

+0

tại sao bỏ phiếu xuống? đây là câu hỏi thiết yếu! –

Trả lời

7

Điều bạn muốn không được hỗ trợ bởi định dạng chuỗi C#, vì phương thức String.ToString của đối tượng chuỗi chỉ trả về chính chuỗi đó.

Khi bạn gọi

string.Format("{0:xxx}",someobject); 

nếu SomeObject cài đặt giao diện IFormattable, phương pháp quá tải ToString(string format,IFormatProvider formatProvider) được gọi là, với "xxx" như format tham số.

Vì vậy, nhiều nhất, đây không phải là lỗi trong thiết kế định dạng chuỗi .NET, nhưng chỉ thiếu chức năng trong lớp chuỗi.

Nếu bạn thực sự cần điều này, bạn có thể sử dụng bất kỳ giải pháp được đề xuất nào hoặc tạo lớp của riêng bạn triển khai giao diện IFormattable.

+0

cảm ơn! bạn chắc chắn đúng. đó là lớp chuỗi thiếu cái gì đó. nhưng bạn có sử dụng xxx làm ví dụ về một số định dạng hay không thực sự có ý nghĩa gì đó (ví dụ: 3 ký tự)? –

+0

@matti, không có xxx chỉ là một ví dụ. Trên thực tế, ý nghĩa của nó là quyết định bằng cách thực hiện giao diện IFormattable. Dù sao (nói như một người yêu C++), chuỗi định dạng trong c + + so với một trong C# * sucks *, nói về một lỗ hổng cho thực tế là tính năng này đặc biệt là mất tích có vẻ khá lạ với tôi;) –

0

Bạn không thể áp dụng đối số độ dài bằng tham số thay vì định dạng?

String.Format ("-> {0} < -", toFormat.PadRight (10)); // -> Xin chào < -

Hoặc viết trình định dạng của riêng bạn để cho phép bạn thực hiện việc này?

+0

c ý kiến ​​cho câu hỏi –

0

Tại sao không chỉ sử dụng Substr để giới hạn độ dài của chuỗi?

String s = "abcdefghijklmnopqrstuvwxyz"; 
String.Format("Character limited: {0}", s.Substr(0, 10)); 
+0

c ý kiến ​​cho câu hỏi –

+0

Tôi bỏ lỡ thực tế là ngay cả Substr có một số triển khai khó xử khác với mọi ngôn ngữ khác. Tôi đã sử dụng cách giải quyết này vì nó và nó không thành công, khi chuỗi ngắn hơn 10 ký tự ... –

0

Tôi đã viết trình định dạng tùy chỉnh triển khai trình định dạng định dạng "L" được sử dụng để đặt chiều rộng tối đa. Điều này rất hữu ích khi chúng ta cần kiểm soát kích thước của đầu ra được định dạng của chúng ta nói khi được đặt cho cột cơ sở dữ liệu hoặc trường Dynamics CRM.

public class StringFormatEx : IFormatProvider, ICustomFormatter 
{ 
    /// <summary> 
    /// ICustomFormatter member 
    /// </summary> 
    public string Format(string format, object argument, IFormatProvider formatProvider) 
    { 
     #region func-y town 
     Func<string, object, string> handleOtherFormats = (f, a) => 
     { 
      var result = String.Empty; 
      if (a is IFormattable) { result = ((IFormattable)a).ToString(f, CultureInfo.CurrentCulture); } 
      else if (a != null) { result = a.ToString(); } 
      return result; 
     }; 
     #endregion 

     //reality check. 
     if (format == null || argument == null) { return argument as string; } 

     //perform default formatting if arg is not a string. 
     if (argument.GetType() != typeof(string)) { return handleOtherFormats(format, argument); } 

     //get the format specifier. 
     var specifier = format.Substring(0, 1).ToUpper(CultureInfo.InvariantCulture); 

     //perform extended formatting based on format specifier. 
     switch(specifier) 
     { 
      case "L": 
       return LengthFormatter(format, argument); 
      default: 
       return handleOtherFormats(format, argument); 
     } 
    } 

    /// <summary> 
    /// IFormatProvider member 
    /// </summary> 
    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 
     else 
      return null; 
    } 

    /// <summary> 
    /// Custom length formatter. 
    /// </summary> 
    private string LengthFormatter(string format, object argument) 
    { 
     //specifier requires length number. 
     if (format.Length == 1) 
     { 
      throw new FormatException(String.Format("The format of '{0}' is invalid; length is in the form of Ln where n is the maximum length of the resultant string.", format)); 
     } 

     //get the length from the format string. 
     int length = int.MaxValue; 
     int.TryParse(format.Substring(1, format.Length - 1), out length); 

     //returned the argument with length applied. 
     return argument.ToString().Substring(0, length); 
    } 
} 

Cách sử dụng

var result = String.Format(
    new StringFormatEx(), 
    "{0:L4} {1:L7}", 
    "Stack", 
    "Overflow"); 

Assert.AreEqual("Stac Overflo", result); 
0

Đây không phải là một câu trả lời về cách sử dụng string.Format, nhưng một cách khác để rút ngắn một chuỗi sử dụng phương pháp khuyến nông. Bằng cách này cho phép bạn thêm độ dài tối đa vào chuỗi trực tiếp, ngay cả khi không có string.format.

public static class ExtensionMethods 
{ 
    /// <summary> 
    /// Shortens string to Max length 
    /// </summary> 
    /// <param name="input">String to shortent</param> 
    /// <returns>shortened string</returns> 
    public static string MaxLength(this string input, int length) 
    { 
     if (input == null) return null; 
     return input.Substring(0, Math.Min(length, input.Length)); 
    } 
} 

mẫu sử dụng:

string Test = "1234567890"; 
string.Format("Shortened String = {0}", Test.MaxLength(5)); 
string.Format("Shortened String = {0}", Test.MaxLength(50)); 

Output: 
Shortened String = 12345 
Shortened String = 1234567890 
Các vấn đề liên quan