C#の文字列から最後の文字を削除します。エレガントな方法?


84

私はこのような数値文字列を持っています2223,00。に変換したいと思い2223ます。これは、「」のに情報がない場合です。「」の後に小数点以下2桁しかないと仮定します。

やった:

str = str.Remove(str.Length - 3, 3);

よりエレガントな解決策はありますか?たぶん別の機能を使用していますか?-明示的な数字を入れるのは好きではありません-

回答:


173

実際には、次の1つのパラメーターを取るRemoveオーバーロードを使用できます。

str = str.Remove(str.Length - 3);

ただし、長さのハードコーディングを回避しようとしている場合は、次を使用できます。

str = str.Remove(str.IndexOf(','));

良い答えがたくさんありました。しかし、これは私がエレガンスの観点から使用するものです。それにもかかわらず、低レベルでは、どちらがより効率的かはわかりません。だから、あなたの選択をしてください!
カニ

6
2番目のソリューションは、読み、理解、および保守がはるかに簡単であり、低レベルのパフォーマンスの観点から、違いは非常に重要ではありません。,が常に位置-3にあることを知っている場合、最初の解決策はまだ問題ありませんが、時期尚早の最適化は時間を無駄にするひどいことです。
スコットリッペイ2011

2
@Kani最初のものが最も効率的ですが、私はスコットに完全に同意します。プロファイリング後にパフォーマンスがあることを知らない限り、私は常に2番目を選択します。ここでボトルネック。これらの両方(および他のほとんどの回答)は非常に高速になります-ほぼすべての目的に十分です。
リードコプシー2011

カンマがない場合に文字列を変更しないようにしたいとしますか?
カイルデラニー

15

おそらくこれ:

str = str.Split(",").First();

これが答えの「最もエレガントな」ものだと思います-少なくともこれまでのところ。
トムブシェル2011

1
@ ReedCopseyのものについてどう思いますか?とても良いものだと思います。
カニ

@カニ:エレガンスの観点から、私はほとんどの回答が十分に投稿されている思います。それが本当にボトルネックであることが証明されない限り、私もパフォーマンスに悩まされることはありません。考慮すべき唯一のことは、異なる形式で来る文字列をどのように処理したいかです...
km

それ以上のコンマは気にしないので、2toの2番目の引数を渡すことを検討してくださいSplit
リチャード

5

これにより、カンマの後のすべてを除く文字列が返されます

str = str.Substring(0, str.IndexOf(','));

もちろん、これ文字列に実際に小数のコンマがあることを前提としています。そうでない場合、上記のコードは失敗します。さらにチェックを行いたいと思うでしょう:

commaPos = str.IndexOf(',');
if(commaPos != -1)
    str = str.Substring(0, commaPos)

そもそも文字列を使っていると思います。理想的には、floatやdoubleのように、最初から数値を操作している場合は、それをにキャストしてint、次のmyInt.ToString()ようにすることができます。

myInt = (int)double.Parse(myString)

これは、現在のカルチャを使用してdoubleを解析します(ここ米国では.、小数点に使用します)。ただし、これも入力文字列が解析できることを前提としています。


3
String.Format("{0:0}", 123.4567);      // "123"

初期値が10進数から文字列の場合は、変換する必要があります

String.Format("{0:0}", double.Parse("3.5", CultureInfo.InvariantCulture))  //3.5

この例では、不変のカルチャを選択しますが、必要なカルチャを使用できます。

将来、小数に2または3の先行数値が含まれる可能性があるかどうかわからないため、フォーマット機能を使用することをお勧めします。

編集:、、、Truncateまたはの後のすべてを削除するために使用することもできます。

Console.WriteLine(Decimal.Truncate(Convert.ToDecimal("3,5")));

ええと、この場合、昏睡状態で同じ数になります。
カニ

あなたが使用する正確な文字列は何ですか、そしてあなたのコンピュータはどの文化ですか?
Patrick Desjardins

例のように:dddd、dd、ここでdは数字です。この場合小数はの後にあります。いくつかの結果を標準化して、削除しています。そしてまたは使用の代わりに
Kani

string.Formatを使用してこれを個人的に行うかどうかはわかりません。それが機能している間、string.Formatに渡される前にdoubleをボックス化することになり、余分なオブジェクトが作成されます。
クリストファーカレンズ2011

文字列(部分文字列)で遊ぶかボクシングで遊ぶかで、パフォーマンスの面で何が優れているのかわからないと言わざるを得ません。集中的に使わなくても大丈夫だとは思いません。状況によって異なります:)
Patrick Desjardins 2011

1

使用する:

public static class StringExtensions
{
    /// <summary>
    /// Cut End. "12".SubstringFromEnd(1) -> "1"
    /// </summary>
    public static string SubstringFromEnd(this string value, int startindex)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return value.Substring(0, value.Length - startindex);
    }
}

私は2つの理由でここで拡張メソッドを好みます:

  1. Substringでチェーンできます。 Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. 速度。

1

LastIndexOfとSubstringを組み合わせて使用​​すると、スティング内のコンマの最後のインデックスの左側にあるすべての文字を取得できます。

string var = var.Substring(0、var.LastIndexOf( '、'));


0

を使用できますTrimEnd。それも効率的で、きれいに見えます。

"Name,".TrimEnd(',');

4
これにより、文字列の最後にある「、」文字のみが削除されます。文字列「123,45」は数字で終わるため、「123,45」"123,45".TrimEnd(',')を返します。
phoog 2011

Remove last characters from a string if this character is... 私にぴったりです。感謝。"oppa/ ".Trim().TrimEnd('/');
it3xl 2017年


-3

lastIndexOfを使用します。お気に入り:

string var = var.lastIndexOf(',');

varは変数名です。文字列の名前として使用しないでください。-1; さらに、これはインデックスを提供するだけなので、問題の一部しか解決しません。Remove()が必要です。
PatrickKnott19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.