简体   繁体   中英

formatting string in MVC /C#

I have a string 731478718861993983 and I want to get this 73-1478-7188-6199-3983 using C#. How can I format it like this ?

Thanks.

By using regex:

    public static string FormatTest1(string num)
    {
        string formatPattern = @"(\d{2})(\d{4})(\d{4})(\d{4})(\d{4})";
        return Regex.Replace(num, formatPattern, "$1-$2-$3-$4-$5");
    }

    // test
    string test = FormatTest1("731478718861993983");
    // test result: 73-1478-7188-6199-3983

If you're dealing with a long number, you can use a NumberFormatInfo to format it:

First, define your NumberFormatInfo (you may want additional parameters, these are the basic 3):

NumberFormatInfo format = new NumberFormatInfo();
format.NumberGroupSeparator = "-";
format.NumberGroupSizes = new[] { 4 };
format.NumberDecimalDigits = 0;        

Next, you can use it on your numbers:

long number = 731478718861993983;
string formatted = number.ToString("n", format);
Console.WriteLine(formatted);

After all, .Net has very good globalization support - you're better served using it!

string s = "731478718861993983"
var newString = (string.Format("{0:##-####-####-####-####}", Convert.ToInt64(s));

LINQ-only one-liner:

var str = "731478718861993983";
var result = 
    new string(
        str.ToCharArray().
            Reverse(). // So that it will go over string right-to-left
            Select((c, i) => new { @char = c, group = i / 4}). // Keep group number
            Reverse(). // Restore original order
            GroupBy(t => t.group). // Now do the actual grouping
            Aggregate("", (s, grouping) => "-" + new string(
                grouping.
                    Select(gr => gr.@char).
                    ToArray())).
            ToArray()).
    Trim('-');

This can handle strings of arbitrary lenghs.

Simple (and naive) extension method :

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("731478718861993983".InsertChar("-", 4));
    }
}

static class Ext
{
    public static string InsertChar(this string str, string c, int i)
    {
        for (int j = str.Length - i; j >= 0; j -= i)
        {
            str = str.Insert(j, c);
        }

        return str;
    }
}

If you're dealing strictly with a string, you can make a simple Regex.Replace, to capture each group of 4 digits:

string str = "731478718861993983";
str = Regex.Replace(str, "(?!^).{4}", "-$0" ,RegexOptions.RightToLeft);
Console.WriteLine(str);

Note the use of RegexOptions.RightToLeft , to start capturing from the right (so "12345" will be replaced to 1-2345 , and not -12345 ), and the use of (?!^) to avoid adding a dash in the beginning.
You may want to capture only digits - a possible pattern then may be @"\\B\\d{4}" .

string myString = 731478718861993983;
myString.Insert(2,"-");
myString.Insert(7,"-");
myString.Insert(13,"-");
myString.Insert(18,"-");

My first thought is:

String s = "731478718861993983";
s = s.Insert(3,"-");
s = s.Insert(8,"-");
s = s.Insert(13,"-");
s = s.Insert(18,"-");

(don't remember if index is zero-based, in which case you should use my values -1) but there is probably some easier way to do this...

Here's how I'd do it; it'll only work if you're storing the numbers as something which isn't a string as they're not able to be used with format strings.

string numbers = "731478718861993983";
string formattedNumbers = String.Format("{0:##-####-####-####-####}", long.Parse(numbers));

Edit: amended code, since you said they were held as a string in your your original question

If the position of "-" is always the same then you can try

string s = "731478718861993983";
s = s.Insert(2, "-");
s = s.Insert(7, "-");
s = s.Insert(12, "-");
s = s.Insert(17, "-"); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM