tetapi kode VB bergantung pada c # fungsi substring di strings.sc
Our Man in Bananas
Ini sebenarnya bukan cara yang baik untuk melakukannya, tetapi jika Anda dalam keadaan darurat, Anda dapat menambahkan referensi ke Microsoft.VisualBasic.dll, dan menggunakan metode yang Benar. Ini bukan metode ekstensi. Anda harus menggunakannya seperti ini:string endOfString = Strings.Right(wholeString, 6);
Pendekatan ini tidak bekerja dengan benar jika string tidak sepanjang jumlah karakter yang dibutuhkan.
stevehipwell
1
Bergantung pada apa yang diinginkan OP, seseorang mungkin juga melempar ekspresi reguler pada ini. Jika dia hanya menginginkan nomor di akhir string, itu pasti solusi yang paling tidak menyakitkan, terutama ketika jumlah digit dapat bervariasi dalam beberapa peningkatan perangkat lunak nanti.
Joey
2
@Johannes Rössel - Saya penggemar berat ekspresi reguler (lihat jawaban saya), tetapi saya tidak pernah merekomendasikan mereka untuk situasi sederhana seperti ini. Setiap jawaban yang menggunakan pembungkus fungsi lebih cocok untuk pemeliharaan kode daripada ekspresi reguler. Metode ekstensi (atau fungsi standar jika .NET 2.0) adalah solusi terbaik.
stevehipwell
@ Stevo3000 - memiliki solusi yang melempar jika string adalah panjang yang salah adalah solusi yang valid. Bukan satu-satunya solusi, tapi tetap saja.
Marc L.
3
@James - untuk menjadi seperti pernickity, hanya judul yang menyebutkan "huruf n". Pertanyaan sebenarnya yang diajukan meminta "enam huruf paling kanan" :)
Chris Rogers
69
Tulis metode ekstensi untuk mengekspresikan Right(n);fungsi tersebut. Fungsi ini harus menangani string kosong atau kosong yang mengembalikan string kosong, string lebih pendek dari panjang maksimal yang mengembalikan string asli dan string lebih panjang dari panjang maksimal yang mengembalikan panjang maksimal karakter paling kanan.
publicstaticstringRight(thisstring sValue,int iMaxLength){//Check if the value is validif(string.IsNullOrEmpty(sValue)){//Set valid empty string as string could be null
sValue =string.Empty;}elseif(sValue.Length> iMaxLength){//Make the string no longer than the max length
sValue = sValue.Substring(sValue.Length- iMaxLength, iMaxLength);}//Return the stringreturn sValue;}
@James - Ini tidak akan seperti sValue.Length > iMaxLengthsebelum substring dipanggil!
stevehipwell
3
Jawaban yang bagus, tapi agak butuh waktu lama untuk melihat notasi Hongaria dalam kode C #.
Jerad Rose
1
@JeradRose - Saya bekerja dalam sebuah proyek di mana basis kode berevolusi dari aplikasi VB3 (sebagian besar adalah VB.NET) jadi ada beberapa sisa.
stevehipwell
4
@Jalle, VB.NET memiliki Kiri, Kanan dan Tengah sebagai fungsi tingkat atas, ditambah banyak hal bermanfaat lainnya yang bukan bagian dari C #. Tidak yakin mengapa, karena banyak dari mereka adalah fungsi yang layak.
Maka itu akan melempar NullReferenceException seperti jika Anda mencoba menggunakan metode apa pun pada string nol ...
James
1
str.Length - lengthbisa menjadi negatif. Juga parameter kedua adalah opsional. Tidak perlu melewati panjangnya.
iheartcsharp
1
@ JMS10 pasti bisa tapi itu lebih perhatian penelepon daripada saya. Juga, ya poin yang adil, Anda dapat menggunakan override yang hanya mengambil satu parameter di sini.
Seharusnya tidak error, mengembalikan null sebagai string kosong, mengembalikan nilai terpangkas atau dasar. Gunakan seperti "testx" .Left (4) atau str.Right (12);
jika Anda tidak yakin dengan panjang string Anda, tetapi Anda yakin jumlah kata (selalu 2 kata dalam kasus ini, seperti 'xxx yyyyyy') sebaiknya Anda menggunakan split.
stringResult="PER 343573".Split(" ")[1];
ini selalu mengembalikan kata kedua dari string Anda.
Ya; anggap saja teks OP SELALU memiliki spasi; seperti dalam contohnya :)
Christian
1
Hei Christian :) kita semua tahu lebih dari beberapa baris jawaban. Saya baru saja menjawab pertanyaan itu secara singkat, tentu saja, ada lebih banyak hal yang perlu dipertimbangkan dalam kode nyata.
Mahdi Tahsildari
7
Ini tidak persis seperti yang Anda minta, tetapi hanya dengan melihat contohnya, tampaknya Anda sedang mencari bagian numerik dari string.
Jika ini selalu terjadi, cara yang baik untuk melakukannya adalah menggunakan ekspresi reguler.
var regex=newRegex("\n+");string numberString = regex.Match(page).Value;
-1 ekspresi reguler agak berlebihan untuk sesuatu seperti ini, terutama bila sudah ada metode bawaan untuk melakukannya.
Yakobus
1
Saya tidak berdebat untuk menggunakan metode ini jika Anda benar-benar hanya membutuhkan 6 terakhir, tetapi jika tujuan Anda adalah mengekstrak angka (seperti id) yang dapat berubah menjadi 5 atau 7 digit di beberapa titik di masa depan, ini adalah cara yang lebih baik.
kedinginan 42
1
Jawaban lama, tetapi +1 untuk mendukung penggunaan ekspresi reguler. Terutama karena (masih) tidak ada metode bawaan dalam implementasi String .NET untuk melakukan @James ini. Jika tidak, pertanyaan ini mungkin tidak pernah ada.
CrazyIvan1974
@ CrazyIvan1974 tidak yakin mengapa Anda menyebut saya dalam komentar Anda
James
5
Gunakan ini:
String text ="PER 343573";String numbers = text;if(text.Length>6){
numbers = text.Substring(text.Length-6);}
using Microsoft.VisualBasic;...string input ="PER 343573";string output =Strings.Right(input,6);
Tidak perlu membuat metode ekstensi khusus atau pekerjaan lain. Hasilnya dicapai dengan satu referensi dan satu baris kode sederhana.
Sebagai info lebih lanjut tentang ini, menggunakan metode Visual Basic dengan C # telah didokumentasikan di tempat lain . Saya pribadi tersandung di atasnya pertama kali ketika mencoba untuk mengurai file, dan menemukan benang SO ini menggunakan Microsoft.VisualBasic.FileIO.TextFieldParserkelas menjadi sangat berguna untuk mem -parsing file .csv.
Inilah solusi yang saya gunakan ... Ini memeriksa bahwa panjang string input tidak lebih rendah dari panjang yang diminta. Sayangnya, solusi yang saya lihat diposting di atas tidak memperhitungkan hal ini - yang dapat menyebabkan crash.
/// <summary>/// Gets the last x-<paramref name="amount"/> of characters from the given string./// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned./// If the given <paramref name="amount"/> is negative, an empty string will be returned./// </summary>/// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>/// <param name="amount">The amount of characters to return.</param>/// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>publicstaticstringGetLast(thisstring@string,int amount){if(@string==null){return@string;}if(amount <0){returnString.Empty;}if(amount >=@string.Length){return@string;}else{return@string.Substring(@string.Length- amount);}}
Kode harus disertai dengan penjelasan tertulis tentang bagaimana cara memperbaiki masalah di OP.
Zze
1
Yah, saya pikir penjelasan tertulis di komentar sudah cukup, bukan?
vldmrrr
0
Tanpa menggunakan bit converter dan bit shifting (perlu memastikan encoding) ini adalah metode tercepat yang saya gunakan sebagai metode ekstensi 'Benar'.
string myString ="123456789123456789";if(myString >6){char[] cString = myString.ToCharArray();Array.Reverse(myString);Array.Resize(ref myString,6);Array.Reverse(myString);string val =newstring(myString);}
Array.Reversemengambil array, bukan string, dan if (myString.length > 6). Selain kesalahan sintaks, mengapa ini menjadi metode tercepat? Tentunya hanya menggunakan substring akan menjadi cara yang lebih baik, itu tidak memerlukan semua penyalinan array ini.
1800 INFORMASI
0
Saya menggunakan Min untuk mencegah situasi negatif dan juga menangani string nol
// <summary>/// Returns a string containing a specified number of characters from the right side of a string./// </summary>publicstaticstringRight(thisstringvalue,int length){string result =value;if(value!=null)
result =value.Substring(0,Math.Min(value.Length, length));return result;}
string endOfString = Strings.Right(wholeString, 6);
Jawaban:
sumber
Tulis metode ekstensi untuk mengekspresikan
Right(n);
fungsi tersebut. Fungsi ini harus menangani string kosong atau kosong yang mengembalikan string kosong, string lebih pendek dari panjang maksimal yang mengembalikan string asli dan string lebih panjang dari panjang maksimal yang mengembalikan panjang maksimal karakter paling kanan.sumber
sValue.Length > iMaxLength
sebelum substring dipanggil!Mungkin lebih baik menggunakan metode ekstensi:
Pemakaian
sumber
str.Length - length
bisa menjadi negatif. Juga parameter kedua adalah opsional. Tidak perlu melewati panjangnya.Seharusnya tidak error, mengembalikan null sebagai string kosong, mengembalikan nilai terpangkas atau dasar. Gunakan seperti "testx" .Left (4) atau str.Right (12);
sumber
MSDN
EDIT: terlalu lambat ...
sumber
jika Anda tidak yakin dengan panjang string Anda, tetapi Anda yakin jumlah kata (selalu 2 kata dalam kasus ini, seperti 'xxx yyyyyy') sebaiknya Anda menggunakan split.
ini selalu mengembalikan kata kedua dari string Anda.
sumber
Ini tidak persis seperti yang Anda minta, tetapi hanya dengan melihat contohnya, tampaknya Anda sedang mencari bagian numerik dari string.
Jika ini selalu terjadi, cara yang baik untuk melakukannya adalah menggunakan ekspresi reguler.
sumber
Gunakan ini:
sumber
Menebak kebutuhan Anda, tetapi ekspresi reguler berikut hanya akan menghasilkan 6 alfanumerik sebelum akhir string dan tidak ada kecocokan sebaliknya.
sumber
Karena Anda menggunakan .NET, yang semuanya dikompilasi ke MSIL , cukup referensikan Microsoft.VisualBasic , dan gunakan
Strings.Right
metode bawaan Microsoft :Tidak perlu membuat metode ekstensi khusus atau pekerjaan lain. Hasilnya dicapai dengan satu referensi dan satu baris kode sederhana.
Sebagai info lebih lanjut tentang ini, menggunakan metode Visual Basic dengan C # telah didokumentasikan di tempat lain . Saya pribadi tersandung di atasnya pertama kali ketika mencoba untuk mengurai file, dan menemukan benang SO ini menggunakan
Microsoft.VisualBasic.FileIO.TextFieldParser
kelas menjadi sangat berguna untuk mem -parsing file .csv.sumber
ini mendukung sejumlah karakter di
str
. kode alternatif tidak mendukungnull
string. dan, yang pertama lebih cepat dan yang kedua lebih kompak.Saya lebih suka yang kedua jika mengetahui
str
berisi string pendek. jika senar panjang, yang pertama lebih cocok.misalnya
atau
sumber
Gunakan ini:
string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));
sumber
Solusi lain yang mungkin tidak disebutkan
sumber
Metode Aman Nol:
String yang lebih pendek dari panjang maksimal yang mengembalikan string asli
Metode Ekstensi String Kanan
Metode Ekstensi String Kiri
sumber
Inilah solusi yang saya gunakan ... Ini memeriksa bahwa panjang string input tidak lebih rendah dari panjang yang diminta. Sayangnya, solusi yang saya lihat diposting di atas tidak memperhitungkan hal ini - yang dapat menyebabkan crash.
sumber
Ini adalah metode yang saya gunakan: Saya suka membuat semuanya tetap sederhana.
sumber
Hanya pemikiran saja:
sumber
sumber
Tanpa menggunakan bit converter dan bit shifting (perlu memastikan encoding) ini adalah metode tercepat yang saya gunakan sebagai metode ekstensi 'Benar'.
sumber
Array.Reverse
mengambil array, bukan string, danif (myString.length > 6)
. Selain kesalahan sintaks, mengapa ini menjadi metode tercepat? Tentunya hanya menggunakan substring akan menjadi cara yang lebih baik, itu tidak memerlukan semua penyalinan array ini.Saya menggunakan Min untuk mencegah situasi negatif dan juga menangani string nol
sumber
keluarannya adalah "Word"
sumber