Pertanyaan String.Format - bagaimana cara kerjanya dan bagaimana menerapkan string format kustom


Dengan String.Format() dimungkinkan untuk memformat misalnya DateTime benda dalam berbagai cara. Setiap kali saya mencari format yang diinginkan saya perlu mencari di Internet. Hampir selalu saya menemukan contoh yang bisa saya gunakan. Sebagai contoh:

String.Format("{0:MM/dd/yyyy}", DateTime.Now);          // "09/05/2012"

Tapi saya tidak tahu bagaimana cara kerjanya dan kelas mana yang mendukung string tambahan 'ajaib' ini.

Jadi pertanyaan saya adalah:

  1. Bagaimana String.Format petakan informasi tambahan MM/dd/yyyy ke hasil string?
  2. Apakah semua objek Microsoft mendukung fitur ini?
    Apakah ini didokumentasikan di suatu tempat?
  3. Apakah mungkin melakukan sesuatu seperti ini:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

76
2018-05-09 08:20


asal


Jawaban:


String.Format cocok dengan setiap token di dalam string ({0} dll) terhadap objek yang bersangkutan: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

String format secara opsional disediakan:

{ index[,alignment][ : formatString] }

Jika formatString disediakan, objek yang sesuai harus diterapkan Dapat di-IFormattable dan khususnya ToString metode yang menerima formatString dan mengembalikan string berformat terkait: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx

Sebuah IFormatProvider dapat juga digunakan yang dapat digunakan untuk menangkap standar pemformatan dasar / default dll. Contoh sini dan sini.

Jadi jawaban atas pertanyaan Anda secara berurutan:

  1. Ini menggunakan IFormattable antarmuka ToString() metode pada DateTime objek dan melewati bahwa MM/dd/yyyy string format. Ini adalah implementasi yang mengembalikan string yang benar.

  2. Setiap objek yang diterapkan IFormattable mendukung fitur ini. Anda bahkan dapat menulis sendiri!

  3. Ya, lihat di atas.


80
2018-05-09 08:27



Dari pemahaman saya, Anda perlu menerapkan IFormattable di kelas Anda untuk mendukung ini. Yang kemudian memiliki metode, ToString yang mengambil parameter yang Anda berikan ke String.Format.

Berikut ini contohnya.

// Define other methods and classes here
public class Sample : IFormattable
{
     public string ToString(string format, IFormatProvider provider)
     {
         return String.Concat("Your custom format was ", format);
     }
}

String.Format("{0:MyCustomFormat}", new Sample())

16
2018-05-09 08:26



  1. Periksa dokumen resmi MSDN, ada daftar lengkap string format DateTime di sini: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx. Memang ada beberapa string "magis".

  2. Sejauh yang saya tahu tidak semua jenis memiliki format "menarik", tetapi semua jenis mendukung ToString(). Jika Anda perlu memformat objek yang sudah ada, Anda dapat menambahkan metode ekstensi untuk melakukannya, tetapi biasanya pemformatan disediakan di tempat mana pun diperlukan (atau dengan kata lain, saya hanya menulis pemformat khusus untuk jenis saya sendiri).

  3. Ya, Anda dapat menulis sendiri dan jika Anda memiliki data yang dapat diformat dengan cara yang berbeda Anda mungkin harus menulis formatter khusus dengan menerapkan IFormattable, lagi lihat dokumen di sini: http://msdn.microsoft.com/en-us/library/system.iformattable.aspx. Ini cukup sederhana, Anda cukup memeriksa string yang disediakan dan menulis data Anda berdasarkan ini, tidak ada sihir di balik layar :-)


4
2018-05-09 08:28



Di bawah penutup String.Format melakukan sesuatu sebagai berikut,

IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
    formattable.ToString(objectToFormat);
}
else
{
    objectToFormat.ToString();
}

Untuk pertanyaanmu,

  1. Bagaimana cara String.Format memetakan informasi tambahan MM / dd / yyyy ke hasil string?

    Sebagaimana disebutkan di atas, ia hanya memanggil IFormattable .ToString (format string, penyedia IFormatProvider). Penyedia sering sesuatu yang memberitahu Anda apa budaya dari sistem Anda. Seringkali batal karena orang tidak memberikannya String.Format () seperti yang Anda lakukan dalam kasus Anda.

  2. Apakah semua objek microsoft mendukung fitur ini? Apakah ini didokumentasikan di suatu tempat?

    Apapun yang mengimplementasikan IFormattable.

  3. Apakah mungkin melakukan sesuatu seperti ini: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    Pada dasarnya jika Anda ingin objek Anda sendiri untuk melakukan sesuatu dengan format yang disediakan Anda mengimplementasikan IFormattable.

Ada sejumlah besar kelas pendukung dan enumerator untuk memastikan bahwa format string tersebut sebagian besar serupa. Lebih lanjut di sini.


3
2018-05-09 08:32



Ya, itu mungkin - itu bisa sepenuhnya disesuaikan. Melihat ini tautan dokumentasi pada pemformatan khusus tanggal dan waktu.

Jika Anda memiliki objek sendiri, terserah Anda untuk menimpanya ToString() metode dan output apa pun yang Anda anggap representasi yang tepat. Setelah Anda melakukan ini, Anda dapat menggunakan String.Format("{0:MyCustomFormat}", new MyOwnClass()) karena ini panggilan implisit MyOwnClass.ToString()


0
2018-05-09 08:24



Dokumentasi untuk tanggal dapat ditemukan di sini: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

Itu harus memberi tahu Anda apa sebenarnya semua karakter pemformatan tanggal seperti MM.

Jika Anda ingin mengubah cara string dikeluarkan untuk kelas khusus, Anda dapat mengganti metode ToString, seperti ini:

public class User
{
     public string Name { get; set; }
     public int Age { get; set; }

     public override string ToString()
     {
         return this.Name + " is " + this.Age + " years old.";
     }
}

lalu Anda bisa melakukan sesuatu seperti itu myUser.ToString() dan dapatkan hasil yang Anda tentukan.


0
2018-05-09 08:26



Dan untuk menjawab pertanyaan ketiga Anda: Itu tidak mungkin dengan sintaks ini, tetapi Anda dapat memberikan contoh IFormatProvider dan ICustomFormatter untuk tipe yang tidak Anda buat, atau terapkan IFormattable di dalam tipe Anda (meskipun, itu pada dasarnya meluas ToString).


0
2018-05-09 08:29