現在C#でアプリケーションを開発していますが、文字列内の特定の文字の後に部分文字列を取得する必要があります。
else if (txtPriceLimit.Text.Contains('.') && char.IsNumber(e.KeyChar))
{
int index = txtPriceLimit.Text.IndexOf('.');
string pennies = txtPriceLimit.Text.Substring(index, txtPriceLimit.Text.Length);
Console.WriteLine("Pennies: " + pennies);
}
なんらかの理由でIndexOutOfRangeException
が思い付き続けます。文字列の内容をインデックスから最後まで取得するにはどうすればよいですか?
あなたが提供できるあらゆる助けをありがとう。
編集:提案されているさまざまなことは、テキストフィールドに最後に押したボタンから値を取得しないことを除いて、機能しているようです。これを行うためにKeyPressイベントを使用しています。
たとえば、.123と入力すると、12しか印刷されません。最後に4を追加すると、123と印刷されます。
使用している String.Substring
のオーバーロードは、開始インデックスと指定された長さを取ります。開始インデックスとして、「.
」の場所を使用していますが、長さとして、文字列全体の長さを使用しています。 index
がより大きい場合、これにより例外が発生します(ご覧のとおり)。
代わりに、これを使用してください:
string pennies = txtPriceLimit.Text.Substring(index + 1);
これは、「txtPriceLimit.Text
」の場所の.
after内のすべての文字を取得します。インデックスに1を追加する必要があることに注意してください。それ以外の場合、「.
」は結果のサブストリングに含まれます。
代わりにこれをやってみてください
string pennies = txtPriceLimit.Text.Split('.')(1);
これは、1つだけがあると仮定します.
は文字列に含まれ、文字列には1が含まれます。
多くの人がこれが便利だと思っているようですので、私が作成したコードをコミュニティに寄稿したいと思いました。
これは、パラメータstring valueに続くthis string txtのテキストを返す、私が作成した拡張メソッドです。
public static string TextFollowing(this string txt, string value) {
if (!String.IsNullOrEmpty(txt) && !String.IsNullOrEmpty(value)) {
int index = txt.IndexOf(value);
if (-1 < index) {
int start = index + value.Length;
if (start <= txt.Length) {
return txt.Substring(start);
}
}
}
return null;
}
string exampleText = "My cat is bad.";
string afterCat = exampleText.TextFollowing("cat");
// afterCat = " is bad.";
拡張メソッドにまだ来ていない人は、次のように同様に定義されたツールから同じ結果を得ることができます。
public static string TextFollowing(string searchTxt, string value) {
if (!String.IsNullOrEmpty(searchTxt) && !String.IsNullOrEmpty(value)) {
int index = searchTxt.IndexOf(value);
if (-1 < index) {
int start = index + value.Length;
if (start <= searchTxt.Length) {
return searchTxt.Substring(start);
}
}
}
return null;
}
string exampleText = "My cat is bad.";
string afterCat = TextFollowing(exampleText, "cat");
// afterCat = " is bad.";
上記の各例で、exampleText
が空の文字列の場合、検索値はnull
または空の文字列でした。または、検索値が見つからない場合、結果の文字列はnull
になります。
私のツールリストにはこのコードが含まれており、多数のプロジェクトの無数の場所で使用されており、常に適切に機能します。
これを使用してください、これは間違いなく動作します:-
else if (txtPriceLimit.Text.Contains('.') && char.IsNumber(e.KeyChar))
{
int index = txtPriceLimit.Text.IndexOf('.');
string pennies = txtPriceLimit.Text.Substring(index+1, txtPriceLimit.Text.Length-(index+1));
pennies=pennies+e.KeyChar.ToString();
Console.WriteLine("Pennies: " + pennies);
}
ドーナツの答えは正しいです。
Substringの2番目のパラメーターはlengthであるので、 'end index'ではないので、彼の答えは次のようにはるかに明確になります。
string pennies = txtPriceLimit.Text.Substring(index, index-txtPriceLimit.Text.Length);
部分文字列を検索するコードは、見つかった場合、末尾部分を返します-見つかった部分文字列の直後(末尾を追跡)の残りの文字列。
jp2codeの答えは、エレガントな方法で私の目的に適合しました。例に加えて、作成者は、コードが長い間十分に試行およびテストされていることも示しました。 VisualBasic彼/彼女のコードと同等:
_Imports System.Runtime.CompilerServices
Module StringExtensions
<Extension()>
Public Function TextFollowing(txt As String, value As String) As String
If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
Dim index As Integer = txt.IndexOf(value)
If -1 < index Then
Dim start As Integer = index + value.Length
If start <= txt.Length Then
Return txt.Substring(start)
End If
End If
End If
Return Nothing
End Function
End Module
_
コードはVS Community 2017を使用してテストされています。
_Dim exampleText As String = "C-sharp to VisualBasic"
Dim afterCSharp = exampleText.TextFollowing("to")
'afterCSharp = " VisualBasic"
_
拡張メソッドTextFollowing()
がString
オブジェクトで使用できるようになりました。
exampleText
はString
であるため、拡張メソッドを使用できますexampleText.TextFollowing()
は拡張メソッドを使用します文字列の前の部分を取得する、補完的な方法があると便利な場合があります。補完的な拡張メソッドは、1つの結合コードモジュールにまとめて記述されます。
_Imports System.Runtime.CompilerServices
Module StringExtensions
<Extension()>
Public Function TextFollowing(txt As String, value As String) As String
If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
Dim index As Integer = txt.IndexOf(value)
If -1 < index Then
Dim start As Integer = index + value.Length
If start <= txt.Length Then
Return txt.Substring(start)
End If
End If
End If
Return Nothing
End Function
<Extension()>
Public Function TextPreceding(txt As String, value As String) As String
If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
Dim index As Integer = txt.IndexOf(value)
If -1 < index Then
Return txt.Substring(0, index)
End If
End If
Return Nothing
End Function
End Module
_
_Dim exampleText As String = "C-sharp to VisualBasic"
Dim beforeVisualBasic = exampleText.TextPreceding("to")
'beforeVisualBasic = "C-sharp "
_
私の使用例では、これらの拡張メソッドを使用する前にLargeString.Contains(SmallString)
かどうかを確認する必要があります。より高速なコード実行のために、これは私がしなかった上記の拡張メソッドと組み合わせることができたでしょう。これは、スローネスが発生しないため、コードの再利用性が優先されるためです。