2

私の文字列は「2345000012999922」です

2345 0000 12 9999 22 に変換します。パターンは常に同じ AAAA BBBB CC DDDD EEですが、EE はオプションであり、入力できない場合があります。

私は試した:

string.format("{0:#### #### ## #### ##});

成功しませんでした。文字列の代わりに変数を使用しましたlongが、まだ成功していません。

4

5 に答える 5

5

これを試して:

void Main()
{
    var d = decimal.Parse("2345000012999922");

    Console.Out.WriteLine("{0:#### #### ## #### ##}", d);
}

最初に 10 進数に変換してから、独自の戦略を使用してください。

数値の書式設定は右から左に機能します。つまり、次のように 2 つの数値がある場合です。

  • 2345000012999922
  • 23450000129999

そして、私たちは次のようなことをしました:

void Main()
{
    var d1 = decimal.Parse("23450000129999");
    var d2 = decimal.Parse("234500001299");

    Console.Out.WriteLine("{0:#### #### ## #### ##}", d1);
    Console.Out.WriteLine("{0:#### #### ## #### ##}", d2);
    Console.Out.WriteLine("{0:0000 0000 00 0000 00}", d1);
    Console.Out.WriteLine("{0:0000 0000 00 0000 00}", d2);
}

次のようになります。

23 4500 00 1299 99
 2345 00 0012 99
0023 4500 00 1299 99
0000 2345 00 0012 99

(0 パディングに注意してください)。

フォーマット文字列では、"0" は、対応する数字が存在する場合はここに配置することを意味し、存在しない場合は 0 で埋めます。"#" は、存在する場合は対応する数字をここに配置し、存在しない場合は無視することを意味します。

これを念頭に置いて、あなたの最善の戦略は次のようなものになると思います:

void Main()
{
    var s1 = "23450000129999";
    var s2 = "234500001299";
    var n1 = s1.Length;
    var n2 = s2.Length;
    var c = 12;
    var f1 = "{0:#### #### ## #### ##}";
    var f2 = "{0:#### #### ## ####}";
    var d1 = decimal.Parse(s1);
    var d2 = decimal.Parse(s2);

    Console.Out.WriteLine(n1 > c ? f1 : f2, d1);
    Console.Out.WriteLine(n2 > c ? f1 : f2, d2);
}

これにより、次のようになります。

23 4500 00 1299 99
23 4500 00 1299

アイデアは、最初に入力文字列の文字列の長さを確認することです。12 の場合、最後のオプション ビットがないため、切り捨てられたフォーマット文字列を使用します。12 を超える (または 14 に等しい) 場合は、完全な format-string を使用します。

正規表現や文字列操作などの他のアプローチも優れたアプローチですが、パフォーマンスは劣ると思います。ただし、すべてのアプローチをテストする必要があります。特に、このコードが何度も実行される場合 (たとえば、テーブルにデータを表示している場合) は特にそうです。

次のようなものを定義することにより、拡張メソッドを使用してコードの可読性をさらに向上させることができます

public static class FormattingHelper
{
    public static string GetFormatString(this string s)
    {
        if (s.Length == 12)
            return "{0:#### #### ## ####}";
        else
            return "{0:#### #### ## #### ##}";
    }
}

void Main()
{
    var s1 = "23450000129999";
    var s2 = "234500001299";
    var d1 = decimal.Parse(s1);
    var d2 = decimal.Parse(s2);

    Console.Out.WriteLine(s1.GetFormatString(), d1);
    Console.Out.WriteLine(s2.GetFormatString(), d2);
}
于 2013-02-11T13:13:23.497 に答える
4
string s = "2345000012999922";
s = s.Insert(14, " ").Insert(10, " ").Insert(8, " ").Insert(4, " ");
Console.WriteLine(s);

注: 元の文字列のインデックスを使用できるように、最後にスペースを挿入します (つまり、インデックスが下がります)。他の方法で試した場合は、現在スペースを追加している場所の前に追加された新しいスペースを考慮して、各インデックスに 1 を連続して追加する必要があります。重要ではありませんが、インデックスが元の文字列のスペースを追加する場所と一致すると理解しやすいと思います。

于 2013-02-11T13:13:46.293 に答える
2

それを行う別の方法と同じように(すべて少しばかげています):

string input = "2345000012999922";
string Formatted = new Regex(@"(\d{4})(\d{4})(\d{2})(\d{4})(\d{2})").
    replace(input, "$1 $2 $3 $4 $5");

//Formatted = 2345 0000 12 9999 22
于 2013-02-11T13:55:22.150 に答える
1

使用時に機能しますlong(PowerShellテスト、C#でも同じはずです):

PS> '{0:#### #### ## #### ##}' -f 2345000012999922
2345 0000 12 9999 22
于 2013-02-11T13:12:16.603 に答える
0
string.Format("{0:#### #### ## #### ##}", 2345000012999922)

出力

2345 0000 12 9999 22

編集済み

これもあなたのために働くでしょう

string str = "2345000012999922";

string str2 = string.Format("{0:#### #### ## #### ##}", Convert.ToDouble(str));
于 2013-02-11T13:20:36.937 に答える