Saya memiliki serangkaian teks seperti ini:
var foo = "FooBar";
Saya ingin mendeklarasikan string kedua yang dipanggil bar
dan menjadikannya sama dengan karakter pertama dan keempat dari karakter pertama saya foo
, jadi saya melakukan ini seperti ini:
var bar = foo[0].ToString() + foo[3].ToString();
Ini berfungsi seperti yang diharapkan, tetapi ReSharper menyarankan saya untuk memasukkan Culture.InvariantCulture
kurung saya, jadi baris ini berakhir seperti ini:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
Apa artinya ini, dan apakah itu akan memengaruhi cara program saya berjalan?
Jawaban:
Tidak semua budaya menggunakan format yang sama untuk tanggal dan nilai desimal / mata uang.
Ini akan peduli untuk Anda ketika Anda mengkonversi nilai input (membaca) yang disimpan sebagai string untuk
DateTime
,float
,double
ataudecimal
. Juga penting jika Anda mencoba memformat tipe data tersebut ke string (tulis) untuk tampilan atau penyimpanan.Jika Anda tahu budaya spesifik seperti apa tanggal dan nilai desimal / mata uang Anda sebelumnya, Anda dapat menggunakan
CultureInfo
properti spesifik itu (yaituCultureInfo("en-GB")
). Misalnya jika Anda mengharapkan input pengguna.The
CultureInfo.InvariantCulture
properti digunakan jika Anda memformat atau parsing string yang harus diurai oleh software independen dari pengaturan lokal pengguna.Nilai defaultnya
CultureInfo.InstalledUICulture
jadi CultureInfo default tergantung pada pengaturan OS yang mengeksekusi. Inilah sebabnya mengapa Anda harus selalu memastikan info budaya sesuai dengan niat Anda (lihat jawaban Martin untuk panduan yang baik).sumber
en-US
. Ini budaya lokal. DanInvariantCulture
digunakan ketika Anda ingin memformat netral budaya yang independen dari sistem lokal. Misalnya ketika bekerja dengan format file berbasis teks.Ketika angka, tanggal dan waktu diformat menjadi string atau diurai dari string budaya digunakan untuk menentukan bagaimana hal itu dilakukan. Misalnya dalam
en-US
budaya dominan Anda memiliki representasi string ini:Dalam budaya saya (
da-DK
) nilai memiliki representasi string ini:Dalam sistem operasi Windows, pengguna bahkan dapat menyesuaikan bagaimana angka dan tanggal / waktu diformat dan juga dapat memilih budaya lain selain budaya sistem operasinya. Format yang digunakan adalah pilihan pengguna yang seharusnya.
Jadi ketika Anda memformat nilai yang akan ditampilkan kepada pengguna menggunakan misalnya
ToString
atauString.Format
atau diuraikan dari string menggunakanDateTime.Parse
atauDecimal.Parse
defaultnya adalah menggunakanCultureInfo.CurrentCulture
. Ini memungkinkan pengguna untuk mengontrol pemformatan.Namun, banyak pemformatan string dan parsing sebenarnya bukan string yang dipertukarkan antara aplikasi dan pengguna tetapi antara aplikasi dan beberapa format data (misalnya file XML atau CSV). Dalam hal ini Anda tidak ingin menggunakan
CultureInfo.CurrentCulture
karena jika pemformatan dan penguraian dilakukan dengan budaya yang berbeda, itu bisa rusak. Dalam hal ini Anda ingin menggunakanCultureInfo.InvariantCulture
(yang didasarkan padaen-US
budaya). Ini memastikan bahwa nilai-nilai dapat bolak-balik tanpa masalah.Alasan bahwa ReSharper memberikan peringatan adalah bahwa beberapa penulis aplikasi tidak menyadari perbedaan ini yang dapat menyebabkan hasil yang tidak diinginkan tetapi mereka tidak pernah menemukan ini karena mereka
CultureInfo.CurrentCulture
yaituen-US
yang memiliki perilaku yang sama denganCultureInfo.InvariantCulture
. Namun, segera setelah aplikasi digunakan dalam budaya lain di mana ada kemungkinan menggunakan satu budaya untuk memformat dan yang lain untuk mem-parsing aplikasi mungkin rusak.Jadi untuk meringkasnya:
CultureInfo.CurrentCulture
(default) jika Anda memformat atau mem-parsing string pengguna.CultureInfo.InvariantCulture
jika Anda memformat atau mem-parsing string yang seharusnya dapat diuraikan oleh perangkat lunak.sumber
Decimal
variabel yang berisi nilai tertentu dalam Dolar AS, apakah saya ingin membuat pengecualian dan menggunakanen-US
sebagai budaya saat menampilkannya untuk memastikan saya tidak mendapatkan hasil yang terlihat seperti angka dalam Euro? Saya mencobaCultureInfo.InvariantCulture
, tetapi mendapatkan ini untuk penanda mata uang¤
, jadi saya tidak yakin itu cara yang benar.CultureInfo.CurrentCulture
). Jika Anda selain menampilkan angka memerlukan mata uang maka mungkin Anda harus melakukannya secara konsisten, yaitu tidak menggunakanCultureInfo
dan sebaliknya menggunakan kode mata uang tiga huruf sepertiUSD 1,234.56
. Maka Anda tidak masuk ke masalah pemetaan mata uang ke budaya.Menurut Microsoft:
(dari http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )
Jadi InvariantCulture mirip dengan budaya "en-US" tetapi tidak persis sama. Jika Anda menulis:
kemudian s1 dan s2 akan memiliki format similair tetapi InvariantCulture menambahkan nol terkemuka dan "en-US" menggunakan AM atau PM.
Jadi InvariantCulture lebih baik untuk penggunaan internal, ketika Anda misalnya menyimpan tanggal untuk file teks atau mem-parsing data. Dan CultureInfo yang ditentukan lebih baik ketika Anda menyajikan data (tanggal, mata uang ...) kepada pengguna akhir.
sumber
Untuk hal-hal seperti angka (titik desimal, koma dalam jumlah), mereka biasanya lebih disukai dalam budaya tertentu.
Cara yang tepat untuk melakukan ini adalah mengaturnya di tingkat budaya (untuk Jerman) seperti ini:
sumber
JetBrains menawarkan penjelasan yang masuk akal ,
tetapi jika saya mengerjakan situs yang saya tahu hanya berbahasa Inggris, saya mengabaikan saran itu.
sumber