3

完全な文字列の特定の部分のみを読み取る必要があります。文字列は次の形式になります。

「1いくつかの通貨名=0.4232他の通貨名」

したがって、私が思いついた最も簡単な方法は、文字列を等しい(=)演算子で分割し、次のように2つの値を配列に追加することでした。

string rawInput = "1 Some Currency Name = 0.4232 Other Currency Name";
string[] rawSplit = rawInput.Split('=');
string firstRate = rawSplit[0].ToString();
string secondRate = rawSplit[1].ToString();

ここで、secondRate文字列の最初の部分( "0.4232")のみを取得する必要があります。だから私はその文字列をもう一度分割します(悪いコーディング):

string[] lastSplit = secondRate.Split(); //Split at whitespace characters
string firstValue = lastSplit[0].ToString(); //Should return "0.4232" but instead returns ""

この関数をテストするためにアプリケーションを実行すると、値「0.4232」の代わりに空の文字列が返されます。なぜこうなった?ここで何が欠けていますか?

完全な方法:

private void btnTest_Click(object sender, EventArgs e)
{
    string rawInput = "1 Some Currency Name = 0.4232 Other Currency Name";
    string[] rawSplit = rawInput.Split('=');
    string baseRate = rawSplit[0].ToString(); //1 Some Currency Name
    string conversionRate = rawSplit[1].ToString(); //0.4232 Other Currency Name

    rawSplit = GetSplit(conversionRate);
    XtraMessageBox.Show(rawSplit[0].ToString()); //Returns blank string here???
}

private string[] GetSplit(string inputString)
{
    return inputString.Split();
}

どんなアイデアや提案も歓迎し、大歓迎です!

4

5 に答える 5

14

問題は、元の文字列を で分割する'='と、結果の先頭に余分なスペースがある結果が得られることです。基本的にrawSplit[1]は に等しい" 0.4232 Other Currency Name"です。

String.Splitのオーバーロードを使用すると、空のエントリを削除するように指定できます。これにより、結果の空白のエントリが削除されます。

string[] lastSplit = secondRate.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);

ToString()ちなみに、入力がすでに文字列の場合は使用する必要はありません。

string[] rawSplit = rawInput.Split('=');
// rawSplit is a string array, so rawSplit[0] is already a string...
string firstRate = rawSplit[0]; // .ToString();
于 2012-08-29T19:59:08.577 に答える
1

現在の問題は、Reed Copsey によって既に回答されているため、解決できます。

new[] {' '}

しかし、私はそうするいくつかの他の方法を示しています

正規表現を使用する

var result = Regex.Match(secondRate, @"\d+(\.\d+)?").Value;

しかし、入力文字列が、"0.4232 Other Currency Name 0.45"両方の 10 進数値を一致させる必要があるタイプであるとします。その場合、先に進むことができますRegex.Matches

例えば

string secondRate ="0.4232 Other Currency Name 0.45";
var result = Regex.Match(secondRate, @"\d+(\.\d+)?").Value;

            MatchCollection matches = Regex.Matches(secondRate, @"\d+(\.\d+)?");
            foreach (Match match in matches)
            {
               foreach (Capture capture in match.Captures)
               {
                   Console.WriteLine("Value={1}", capture.Index, capture.Value);
               }
           }

Where 拡張メソッドを使用する

完全なコード

string rawInput = "1 Some Currency Name = 0.4232 Other Currency Name 0.45";
            string[] rawSplit = rawInput.Split('=');
            string firstRate = rawSplit[0].ToString();
            string secondRate = rawSplit[1].ToString();
            string[] lastSplit = secondRate.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            decimal num = 0;
            lastSplit
                .Where(d => decimal.TryParse(d, out num))
                .ToList()
                .ForEach(i => Console.WriteLine(i));

出力

0.4232
0.45
于 2012-08-30T11:38:45.510 に答える
0

以下は、文字列「0.4232 Other Currency Name」を返します。

string conversionRate = rawSplit[1].ToString();

これには前にスペースがあるため、次の場所で再度分割すると:

return inputString.Split();

配列の 0 の位置はそのスペースです。位置 1 が必要か、最後の分割の前にトリミングを行います。

于 2012-08-29T20:02:01.357 に答える
0

文字列の 2 番目の部分は= 0.4232、= と 0.4232 の間に空白があります。したがって、分割すると、最初のエントリは空の文字列になります。2番目のエントリを確認することもできますが、より良い方法はstring.Trim()使用する前に行うことですstring.Split()

于 2012-08-29T20:02:46.357 に答える
0

他のユーザーが前に述べたように、問題は空白です。シンプルな解決策の 1 つは、trim() を conversionRate に追加することです。

rawSplit = GetSplit(conversionRate.Trim());

これにより、コードの残りの部分をそのまま維持できます (それでも、ToString() の不要な使用を取り除くことをお勧めします)。

于 2012-08-29T20:22:52.720 に答える