Saya ingin mengurai string seperti "3.5"
menjadi ganda. Namun,
double.Parse("3.5")
hasil 35 dan
double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint)
melempar a FormatException
.
Sekarang komputer saya disetel ke bahasa Jerman, di mana koma digunakan sebagai pemisah desimal. Mungkin harus melakukan sesuatu dengan itu dan double.Parse()
berharap "3,5"
sebagai masukan, tapi saya tidak yakin.
Bagaimana cara mengurai string yang berisi angka desimal yang mungkin atau mungkin tidak diformat seperti yang ditentukan dalam lokal saya saat ini?
Jawaban:
sumber
XmlConvert
kelas ... apakah Anda punya ide apakah ini lebih baik, lebih buruk, dan / atau berbeda daripada menggunakanCultureInfo.InvariantCulture
?XmlConvert
sebenarnya tidak dimaksudkan untuk digunakan untuk mengurai nilai ganda tunggal dalam kode. Saya lebih suka menggunakandouble.Parse
atauConvert.ToDouble
yang membuat niat saya jelas.Saya biasanya menggunakan fungsi multi-budaya untuk mem-parsing input pengguna, terutama karena jika seseorang terbiasa dengan numpad dan menggunakan budaya yang menggunakan koma sebagai pemisah desimal, orang itu akan menggunakan titik numpad bukan koma.
Namun waspadalah, komentar @nikie benar. Untuk pertahanan saya, saya menggunakan fungsi ini di lingkungan yang terkendali di mana saya tahu bahwa budaya dapat berupa en-US, en-CA atau fr-CA. Saya menggunakan fungsi ini karena dalam bahasa Prancis, kami menggunakan koma sebagai pemisah desimal, tetapi siapa pun yang pernah bekerja di bidang keuangan akan selalu menggunakan pemisah desimal pada numpad, tetapi ini adalah poin, bukan koma. Jadi, bahkan dalam budaya fr-CA, saya perlu menguraikan angka yang akan memiliki titik sebagai pemisah desimal.
sumber
Saya tidak bisa menulis komentar, jadi saya menulis di sini:
double.Parse ("3.5", CultureInfo.InvariantCulture) bukan ide yang baik, karena di Kanada kita menulis 3,5 bukan 3,5 dan hasilnya fungsi ini memberi kita 35 hasilnya.
Saya menguji keduanya di komputer saya:
Ini adalah cara yang benar yang disebutkan Pierre-Alain Vigeant
sumber
Ganti koma dengan titik sebelum parsing. Berguna di negara-negara dengan koma sebagai pemisah desimal. Pikirkan tentang membatasi input pengguna (jika perlu) ke satu koma atau titik.
sumber
Caranya adalah dengan menggunakan budaya invarian, untuk mengurai titik di semua budaya.
sumber
Lihat, setiap jawaban di atas yang mengusulkan penulisan penggantian string dengan string konstan hanya bisa salah. Mengapa? Karena Anda tidak menghormati pengaturan wilayah Windows! Windows meyakinkan pengguna untuk memiliki kebebasan untuk mengatur karakter pemisah apa pun yang diinginkannya. Ia dapat membuka panel kontrol, masuk ke panel wilayah, klik maju dan ubah karakter kapan saja. Bahkan selama program Anda berjalan. Pikirkan ini. Solusi yang baik harus menyadari hal ini.
Jadi, pertama Anda harus bertanya pada diri sendiri, dari mana nomor ini berasal, bahwa Anda ingin menguraikan. Jika itu berasal dari input dalam .NET Framework tidak ada masalah, karena itu akan berada dalam format yang sama. Tapi mungkin itu datang dari luar, mungkin dari server eksternal, mungkin dari DB lama yang hanya mendukung properti string. Di sana, admin db seharusnya memberikan aturan di mana format angka yang akan disimpan. Jika Anda tahu misalnya bahwa itu akan menjadi DB AS dengan format AS, Anda dapat menggunakan kode ini:
Ini akan bekerja dengan baik di mana saja di dunia. Dan tolong jangan gunakan 'Convert.ToXxxx'. Kelas 'Konversi' dianggap hanya sebagai basis untuk konversi ke segala arah. Selain itu: Anda juga dapat menggunakan mekanisme serupa untuk DateTimes.
sumber
sumber
Dua sen saya pada topik ini, mencoba memberikan metode konversi ganda umum:
Bekerja seperti yang diharapkan dengan:
Tidak ada konversi default yang diterapkan, sehingga gagal mencoba menguraikan
1.3,14
,1,3.14
atau kasus serupa.sumber
Kode berikut melakukan pekerjaan dalam skenario apa pun. Ini sedikit parsing.
sumber
Saya pikir konversi 100% benar tidak mungkin, jika nilainya berasal dari input pengguna. misalnya jika nilainya 123.456, bisa berupa pengelompokan atau bisa menjadi titik desimal. Jika Anda benar-benar membutuhkan 100%, Anda harus menggambarkan format dan melemparkan pengecualian jika itu tidak benar.
Tapi saya memperbaiki kode JanW, jadi kami mendapat sedikit lebih banyak ke depan ke 100%. Gagasan di baliknya adalah, bahwa jika pemisah terakhir adalah groupSeperator, ini akan lebih merupakan tipe integer, daripada double.
Kode yang ditambahkan adalah yang pertama jika dari GetDouble .
sumber
sumber
Alih-alih harus menentukan lokal di semua parse, saya lebih memilih untuk menetapkan lokal aplikasi yang luas, meskipun jika format string tidak konsisten di seluruh aplikasi, ini mungkin tidak berfungsi.
Menentukan ini pada awal aplikasi Anda akan membuat semua parses ganda mengharapkan koma sebagai pembatas desimal. Anda dapat mengatur lokal yang sesuai sehingga pemisah desimal dan ribuan sesuai dengan string yang Anda parsing.
sumber
Sulit tanpa menentukan pemisah desimal apa yang harus dicari, tetapi jika Anda melakukannya, inilah yang saya gunakan:
Ini harus bekerja dengan budaya apa pun. Itu benar gagal untuk mem-parsing string yang memiliki lebih dari satu pemisah desimal, tidak seperti implementasi yang menggantikan bukan swap.
sumber
Saya memperbaiki kode @JanW juga ...
Saya membutuhkannya untuk memformat hasil dari instrumen medis, dan mereka juga mengirim "> 1000", "23.3e02", "350E-02", dan "NEGATIF".
sumber
sumber
Saya pikir itu adalah jawaban terbaik:
sumber
Di bawah ini kurang efisien, tetapi saya menggunakan logika ini. Ini hanya valid jika Anda memiliki dua digit setelah titik desimal.
sumber
Lipat gandakan jumlahnya dan kemudian bagikan dengan apa yang Anda gandakan sebelumnya.
Sebagai contoh,
sumber