1

I have one trouble with custom formatting string.
I want to make smth like that:

var str = "SOME_ORIGINAL_FIELD_NAME";
var format1 = "XX_X_X";
var format2 = "X_XXX";

var strFormat1 = String.Format(str, format1); // SOMEORIGINAL_FIELD_NAME
var strFormat2 = String.Format(str, format2); // SOME_ORIGINALFIELDNAME

Does anybody know the right direction for searching? Maybe I should look at IFormatProvider and ICustomFormatter side.

2
  • Can you provide expected input and output clearly please? Commented Oct 8, 2021 at 11:56
  • 1
    input: string = "SOME_ORIGINAL_FIELD_NAME"; format = "XX_X_X"; output: string = "SOMEORIGINAL_FIELD_NAME". Every "X" is the word. And I want to delete underscores between words like at pattern. Commented Oct 8, 2021 at 12:03

2 Answers 2

3

Sure, you just have to:

  • split the source string into its components,
  • use {i} placeholders instead of X, and
  • reverse the parameters to String.Format (format is first, data follows).

Example code (fiddle):

var components = "SOME_ORIGINAL_FIELD_NAME".Split('_');
var format1 = "{0}{1}_{2}_{3}";
var format2 = "{0}_{1}{2}{3}";

var strFormat1 = String.Format(format1, components); // SOMEORIGINAL_FIELD_NAME
var strFormat2 = String.Format(format2, components); // SOME_ORIGINALFIELDNAME
Sign up to request clarification or add additional context in comments.

1 Comment

+1 for non-regex solution - even though format1 & format2 have changed, OP probably had the same intention
1

Replace the X's in the format string with successive placeholders, and split the input string value into a string array, then apply string.Format():

public static string FormatSplitAndJoin(string input, string formatTemplate, string delimiter = "_", string placeholder = "X")
{
    // split "a_b_c" into ["a", "b", "c"]
    var parts = input.Split(delimiter);

    // turn "X_X_X" into "{0}_{1}_{2}"
    var index = 0;
    var formatString = Regex.Replace(formatTemplate, placeholder, m => string.Format("{{{0}}}", index++));

    // validate input length
    if(index > parts.Length)
        throw new ArgumentException(string.Format("input string resulted in fewer arguments than expected, {0} placeholders found", index));

    // apply string.Format()
    return string.Format(formatString, parts);
}

Now you can do:

var str = "SOME_ORIGINAL_FIELD_NAME";
var format1 = "XX_X_X";
var format2 = "X_XXX";

var strFormat1 = FormatSplitAndJoin(str, format1); // SOMEORIGINAL_FIELD_NAME
var strFormat2 = FormatSplitAndJoin(str, format2); // SOME_ORIGINALFIELDNAME

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.