2011-08-08 11 views
3

3番目の最後の文字が時々,の文字列を持っています。この場合、.に置き換えます。,の文字列にも使用できます。これに優雅な解決策はありますか?c#文字列の置換

編集:ありがとうございました。ただ、第三の最後で、私は、フォームxxxxxx,xxの文字列を意味はい、明確にする(それは欧州通貨のことだ)

についてどのように
+0

置き換えられるカンマは常に* 3番目のfrに表示されますか?最後のポジション(全く表示されている場合)? –

+1

サンプルストリングを投稿できますか? –

+0

@Fredrik - はい、常に3番目の最後の位置に表示されます。 –

答えて

7

if (text[text.Length - 3] == ',') 
{ 
    StringBuilder builder = new StringBuilder(text); 
    builder[text.Length - 3] = '.'; 
    text = builder.ToString(); 
} 

編集:私希望上記だけです最も効率的なアプローチについてです。代わりに、char型の配列を使用して試みることができる:

if (text[text.Length - 3] == ',') 
{ 
    char[] chars = text.ToCharArray(); 
    chars[text.Length - 3] = '.'; 
    text = new string(chars); 
} 

同様に動作しますSubstringを使用して、私はそれが任意のより読みだとは思わない:

if (text[text.Length - 3] == ',') 
{ 
    text = text.Substring(0, text.Length - 3) + "." 
      + text.Substring(text.Length - 2); 
} 

編集:私はと仮定してきましたこの状況では、テキストは少なくとも3文字の長さであることをすでに知っています。そうでない場合は、明らかにそのテストも必要です。

+0

+1 StringBuilderは少し重いですね。 –

+0

@コード:何と比較して重い?私はより効率的なアプローチを考えることができません - あなたはできますか? –

+2

+1 - オペアンプが最後から3番目を意味する場合、これまでのところ、動作するように思われる唯一の解決策です。 – JonH

4
string text = "Hello, World,__"; 

if (text.Length >= 3 && text[text.Length - 3] == ',') 
{ 
    text = text.Substring(0, text.Length - 3) + "." + text.Substring(text.Length - 2); 
} 

// text == "Hello, World.__" 
+2

+1が返されますが、「3番目の最後の文字」と表示されるため、3番目の**〜最後の文字を意味するかどうかわかりません。 –

+0

+1も+1 – JonH

+0

+1 @dtb - 素晴らしい回答です。申し訳ありませんが、私は2つの正しい回答を出すことはできません。 –

1

あなたは文字通り、文字列全体で3番目に最後の文字を意味する「第三の最後の文字」によるならばそれはそれを行う必要があり、この

System.Text.RegularExpressions.Regex.Replace([the_string], "(,)(.{2})$", ".$2") 

を試してみてください。

これは、新しい行があるかどうかを微調整する必要があります。余分なパラメータとしてRegexOptions.Singleline列挙型を追加します。パフォーマンスを向上させるため

- おそらく - あなたはクラス本体内部の正規表現事前に宣言することができます:あなたはそれを使用したいときに

static readonly Regex _rxReplace = new Regex("(,)(.{2})$", RegexOptions.Compiled); 

だけです:

var fixed = _rxReplace.Replace([the_string], ".$2"); 
+0

+1 @Andras - あなたの答えのためにありがとう –

2

より適切な方法おそらく文化を使用することになるでしょう

string input = "12345,67"; 
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL"); 
decimal value = System.Convert.ToDecimal(input); 
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
string converted = string.Format("{0:C}", value); 
+0

私は今質問が「完了」ですが+1であることを知っています。私はこれを、OPが彼が実際に何をしたのかを含めるように編集したと思った。 –