[.NET]String.Format met named parameters

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 07-07 11:15
Modbreak:Afgesplitst van De Devschuur Coffee Corner - Iteratie 2

Wat vinden jullie netter:

PHP:
1
echo "<img src=\"{$thumbnail[0]}\" width=\"{$thumbnail[1]}\" height=\"{$thumbnail[2]}\" />";


of

PHP:
1
echo "<img src=\"".$thumbnail[0]."\" width=\"".$thumbnail[1]."\" height=\"".$thumbnail[2]."\" />";


Zelf gebruik ik het liefst de eerste, altijd duidelijk waar de variabelen staan. Zijn er nog meer manieren in PHP om variabelen zo in een echo te zetten?

[ Voor 39% gewijzigd door Woy op 01-10-2012 16:06 ]


Acties:
  • 0 Henk 'm!

  • Sh4wn
  • Registratie: December 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

TheNephilim schreef op maandag 01 oktober 2012 @ 12:01:
[...]


Damn, dat is natuurlijk wel zuur! :o Zo te zien hebben meer IPS panelen er last van, hopelijk niet de pricewatch: Dell Ultrasharp U2312HM Zwart die ik voor m'n zusje besteld heb :+ Het zijn wel hele mooie displays trouwens!

Wat vinden jullie netter:

PHP:
1
echo "<img src=\"{$thumbnail[0]}\" width=\"{$thumbnail[1]}\" height=\"{$thumbnail[2]}\" />";


of

PHP:
1
echo "<img src=\"".$thumbnail[0]."\" width=\"".$thumbnail[1]."\" height=\"".$thumbnail[2]."\" />";


Zelf gebruik ik het liefst de eerste, altijd duidelijk waar de variabelen staan. Zijn er nog meer manieren in PHP om variabelen zo in een echo te zetten?
De laatste wordt toch gezien als de meest nette manier.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ik vind dit wel prettig lezen:
C#:
1
String.Format("<img src=\"{0}\" width=\"{1}\" height=\"{2}\" alt=\"{3}\" />", thumbnail.Url, thumbnail.Width, thumbnail.Height, thumbnail.Description);


>:)

[ Voor 13% gewijzigd door CodeCaster op 01-10-2012 12:05 ]

https://oneerlijkewoz.nl
Het ergste moet nog komen / Het leven is een straf / Een uitgestrekte kwelling van de wieg tot aan het graf


Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 02-07 11:24
Dan heb ik nog liever dit:

PHP:
1
2
<?php
echo '<img src="' . $thumbnail[0] . '" width="' . $thumbnail[1] . '" height="' . $thumbnail[2] . '" />';

Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 06-07 10:13

GateKeaper

#1 Procastinator

PHP:
1
2
3
<?php
echo sprintf('<img src="%s" width="%d" height="%d" />', $thumbnail[0], $thumbnail[1], $thumbnail[2]);
?>

Acties:
  • 0 Henk 'm!

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

CodeCaster schreef op maandag 01 oktober 2012 @ 12:03:
Ik vind dit wel prettig lezen:
C#:
1
String.Format("<img src=\"{0}\" width=\"{1}\" height=\"{2}\" alt=\"{3}\" />", thumbnail.Url, thumbnail.Width, thumbnail.Height, thumbnail.Description);


>:)
Vind het bij dit soort constructies altijd jammer dat de {0}, {1}, enz niet zoveel zeggen.

Veel mooier zou iets zijn als:
C#:
1
2
3
4
5
6
7
8
9
String.Format("<img src=\"{src}\" width=\"{w}\" height=\"{h}\" alt=\"{alt}\" />", 
    new 
    {
        src = thumbnail.Url, 
        w = thumbnail.Width, 
        h = thumbnail.Height, 
        alt = thumbnail.Description
    }
);

Dit zorgt er namelijk voor dat als je bijvoorbeeld meertaligheid inbouwd in teksten die door de string.format heen gaan je logische replacement tags kunt gebruiken. Vaak gebruik je dan een string.replace, maar dat is ook niet altijd even netjes/leesbaar.

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


Acties:
  • 0 Henk 'm!

  • Sh4wn
  • Registratie: December 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

.Gertjan. schreef op maandag 01 oktober 2012 @ 12:18:
[...]

Vind het bij dit soort constructies altijd jammer dat de {0}, {1}, enz niet zoveel zeggen.

Veel mooier zou iets zijn als:
C#:
1
2
3
4
5
6
7
8
9
String.Format("<img src=\"{src}\" width=\"{w}\" height=\"{h}\" alt=\"{alt}\" />", 
    new 
    {
        src = thumbnail.Url, 
        w = thumbnail.Width, 
        h = thumbnail.Height, 
        alt = thumbnail.Description
    }
);


Dit zorgt er namelijk voor dat als je bijvoorbeeld meertaligheid inbouwd in teksten die door de string.format heen gaan je logische replacement tags kunt gebruiken. Vaak gebruik je dan een string.replace, maar dat is ook niet altijd even netjes/leesbaar.
Python kan dat mooi:

Python:
1
print "{name}: {value}".format(name="Blaat", value="test")


of:
Python:
1
2
obj = SomeRandomObject()
print "{obj.prop1} - {obj.prop2}".format(obj=obj)


of:
Python:
1
2
blaat = ["dgfg", "test", "ghidf"]
print "{obj[0]} - {obj[1]} - {obj[2]}".format(obj=blaat)


of:
Python:
1
2
blaat = ["dgfg", "test", "ghidf"]
print "{0} - {1} - {2}".format(*blaat)


of:
Python:
1
2
blaat = {"var1": "test", "foo": "bar"}
print "{var1} - {foo}".format(**blaat)


http://docs.python.org/li...ing-formatting-operations

Wat een mooie taal Python <3

Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 06-07 10:13

GateKeaper

#1 Procastinator

Lijkt mij dat een extention method op String die functionaliteit wel moet kunnen implementeren?

Even met dynamics en regex spelen, en je zou een heel eind moeten komen, lijkt mij zo.

Acties:
  • 0 Henk 'm!

  • Ryur
  • Registratie: December 2007
  • Laatst online: 22:21
GateKeaper schreef op maandag 01 oktober 2012 @ 12:26:
Lijkt mij dat een extention method op String die functionaliteit wel moet kunnen implementeren?

Even met dynamics en regex spelen, en je zou een heel eind moeten komen, lijkt mij zo.
Als iemand dat voor elkaar krijgt, ben ik diegene heeeeel dankbaar. _/-\o_
Mijn C# kennis is nog te basic om er zelf mee bezig te gaan (ben pas part-time halfjaar bezig met C#)

Acties:
  • 0 Henk 'm!

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

GoTCoast schreef op maandag 01 oktober 2012 @ 12:29:
[...]

Als iemand dat voor elkaar krijgt, ben ik diegene heeeeel dankbaar. _/-\o_
Mijn C# kennis is nog te basic om er zelf mee bezig te gaan (ben pas part-time halfjaar bezig met C#)
Zal eens wat leuks in elkaar fietsen straks. Hoeft niet zo heel moeilijk te zijn, pas nog bezig geweest met reflection dus kan die kennis mooi overnemen.

Nadat ik mijn stukje had getypt heb ik hem meteen op mijn todo lijst geslingerd :P Moet zeggen dat ik sinds ik gebruik maak van mind-maps mijn lijsten wel wat overzichtelijker zijn geworden :)

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 19:35
Heb hem wel even voor PHP in elkaar gehakt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

function string_format($str, $args) {
    $matches = array();
    preg_match_all('/\{.*?\}/', $str, $matches);
    if(count($matches) > 0) {
        foreach($matches[0] as $match) {
            if(array_key_exists(trim($match,'{}'), $args)) {
                $str = str_replace($match, $args[trim($match, '{}')], $str);
            }
        }
    }
    return $str;
}

$subject = '<img src="{src}" alt="{alt}" width="{width}" height="{height}" />';
echo string_format($subject, array(
    'src' => 'http://some-image.com/awesome.jpg',
    'alt' => 'Alternative text',
    'width' => '250px',
    'height' => '300px'
));

// output: <img src="http://some-image.com/awesome.jpg" alt="Alternative text" width="250px" height="300px" />


Disclaimer: Dit is uberhaubt de eerste keer dat ik iets met regexps probeer. Daar probeer ik normaal gesproken ver weg van te blijven.

Effectief dus een 'template-engine' a la Twig/Smarty gemaakt ;)

[ Voor 3% gewijzigd door armageddon_2k1 op 01-10-2012 12:48 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 04-06 11:57
Ruby on Rails:
Ruby:
1
2
3
image_tag "http://cool-images.com/some-image.jpg", width: 250, height: 500, alt: "peanut butter"
# of
content_tag :div, "content hier", class: "peanut butter", data: { role: "header" }


Alle content en attributen worden automatisch ge'escape't. data: { role: "header" } vertaalt zich naar data-role="header"

ps @ arma: "px" achter width/height in de HTML attributes werken niet.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CodeCaster schreef op maandag 01 oktober 2012 @ 12:03:
Ik vind dit wel prettig lezen:
C#:
1
String.Format("<img src=\"{0}\" width=\"{1}\" height=\"{2}\" alt=\"{3}\" />", thumbnail.Url, thumbnail.Width, thumbnail.Height, thumbnail.Description);


>:)
Ik hanteer altijd graag de sprintf variant in PHP :P
[edit]Oh, die stond er al. Die dus :P
GateKeaper schreef op maandag 01 oktober 2012 @ 12:26:
Lijkt mij dat een extention method op String die functionaliteit wel moet kunnen implementeren?

Even met dynamics en regex spelen, en je zou een heel eind moeten komen, lijkt mij zo.
[google=.net string.format named parameters]
[google=.net string.format tokens]
Zijn al zat kant-en-klare opties, waaronder NuGet packages zoals (maar niet exclusief) deze. Simpeler krijg je 't niet :P

[ Voor 50% gewijzigd door RobIII op 01-10-2012 13:11 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 18:04
.Gertjan. schreef op maandag 01 oktober 2012 @ 12:18:
[...]

Vind het bij dit soort constructies altijd jammer dat de {0}, {1}, enz niet zoveel zeggen.

Veel mooier zou iets zijn als:
C#:
1
2
3
4
5
6
7
8
9
String.Format("<img src=\"{src}\" width=\"{w}\" height=\"{h}\" alt=\"{alt}\" />", 
    new 
    {
        src = thumbnail.Url, 
        w = thumbnail.Width, 
        h = thumbnail.Height, 
        alt = thumbnail.Description
    }
);

Dit zorgt er namelijk voor dat als je bijvoorbeeld meertaligheid inbouwd in teksten die door de string.format heen gaan je logische replacement tags kunt gebruiken. Vaak gebruik je dan een string.replace, maar dat is ook niet altijd even netjes/leesbaar.
Meertaligheid zou in thumbnaal.Description moeten zitten. Zie nog niet in waarom ik de 0 voor een w of een h zou willen vervangen :?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
jip_86 schreef op maandag 01 oktober 2012 @ 13:16:
Zie nog niet in waarom ik de 0 voor een w of een h zou willen vervangen :?
Hij doelt op CodeCaster in "De Devschuur Coffee Corner - Iteratie 2" ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 16:43
TheNephilim schreef op maandag 01 oktober 2012 @ 12:01:
[...]
Wat vinden jullie netter:

PHP:
1
echo "<img src=\"{$thumbnail[0]}\" width=\"{$thumbnail[1]}\" height=\"{$thumbnail[2]}\" />";


of

PHP:
1
echo "<img src=\"".$thumbnail[0]."\" width=\"".$thumbnail[1]."\" height=\"".$thumbnail[2]."\" />";
PHP:
1
<img src="<?= $thumbnail; ?>" style="width: <?= $thumbnailWidth; ?>; height: <?= $thumbnailHeight; ?>;" />

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 06-07 10:13

GateKeaper

#1 Procastinator

Heb hier geen ReSharper oid, dus vergeef me mijn schoonheidsfoutjes. O-)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class StringExtentions
{
    public static String Format(this string str, dynamic parameters)
    {
        var properties = parameters.GetType().GetProperties();

        for (var i = 0; i < properties.Length; i++)
            str = str.Replace("{" + properties[i].Name + "}", 
                properties[i].GetValue(parameters, null).ToString());

         return str;
     }
}

var s = "<img src=\"{src}\" width=\"{w}\" height=\"{h}\" alt=\"{alt}\" />";
var parameters = new { src = "http://domein.com/plaatje.png", w = 50, h = 75, alt = "mooi hé" };
var formattedString = s.Format(parameters);

[ Voor 3% gewijzigd door GateKeaper op 01-10-2012 13:32 . Reden: dacht dat string al een Format method had, maar niet dus :) ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
GateKeaper schreef op maandag 01 oktober 2012 @ 13:27:
Heb hier geen ReSharper oid, dus vergeef me mijn schoonheidsfoutjes. O-)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static class StringExtentions
    {
        public static String FormatEx(this string str, dynamic parameters)
        {
            var properties = parameters.GetType().GetProperties();

            for (var i = 0; i < properties.Length; i++)
                str = str.Replace("{" + properties[i].Name + "}", 
                    properties[i].GetValue(parameters, null).ToString());

            return str;
        }
    }

   var s = "<img src=\"{src}\" width=\"{w}\" height=\"{h}\" alt=\"{alt}\" />";
   var parameters = new { src = "http://domein.com/plaatje.png", w = 50, h = 75, alt = "mooi hé" };
   var formattedString = s.FormatEx(parameters);
Jammer dat je meteen geen mogelijkheid meer voor formating paramters hebt ;) En tevens geen ondersteuning voor escape sequences.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 06-07 10:13

GateKeaper

#1 Procastinator

Woy schreef op maandag 01 oktober 2012 @ 13:32:
[...]

Jammer dat je meteen geen mogelijkheid meer voor formating paramters hebt ;) En tevens geen ondersteuning voor escape sequences.
Ja hé... time is limited :P Kan natuurlijk wel, maar hier staat toch al een leuke basis. :>

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 07-07 11:15
Mooie oplossingen! :D

Zelf ben ik nooit zo weg van de sprintf manier, het is voor mij gewoon niet zo duidelijk denk ik. Zitten er nog meer voordelen aan dan alleen een manier van het formateren van je gegevens aan?

$thumbnail[0] is inderdaad niet zo mooi als $thumbnail['src'], maar helaas produceert Wordpress deze array op die manier (wp_get_attachment_image_src()). Eventueel kan ik er met list() wel $thumbnail['src']... etc van maken.
armageddon_2k1 schreef op maandag 01 oktober 2012 @ 12:48:
Heb hem wel even voor PHP in elkaar gehakt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 0) {
        foreach($matches[0] as $match) {
            if(array_key_exists(trim($match,'{}'), $args)) {
                $str = str_replace($match, $args[trim($match, '{}')], $str);
            }
        }
    }
    return $str;
}

$subject = '';
echo string_format($subject, array(
    'src' => 'http://some-image.com/awesome.jpg',
    'alt' => 'Alternative text',
    'width' => '250px',
    'height' => '300px'
));

// output: 


Effectief dus een 'template-engine' a la Twig/Smarty gemaakt ;)
Haha nice, het deed me inderdaad denken aan Twig (die zit in Symfony2 toch).

[ Voor 3% gewijzigd door TheNephilim op 01-10-2012 13:38 ]


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 22-01-2024

Korben

() => {};

Woy schreef op maandag 01 oktober 2012 @ 13:32:
[...]

Jammer dat je meteen geen mogelijkheid meer voor formating paramters hebt ;) En tevens geen ondersteuning voor escape sequences.
Zoiets dan?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string StringFormatExtended(string format, object parameters)
{
    Regex regex = new Regex(@"{(?<identifier>[a-z]\w*)(?<alignment>,-?\d+)?(?<format>:(?:[^{}]+|{{|}})*)?}", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
    
    MatchCollection matches = regex.Matches(format);
    
    var uniqueNames = matches.Cast<Match>().Select(match => match.Groups["identifier"].Value).Distinct().Select((identifier, index) => new { identifier, index }).ToDictionary(i => i.identifier, i => i.index);
    
    string newFormat = regex.Replace(format, match => "{" + uniqueNames[match.Groups["identifier"].Value] + match.Groups["alignment"].Value + match.Groups["format"].Value + "}");
    object[] values = new object[uniqueNames.Count];

    foreach (var pair in uniqueNames.OrderBy(p => p.Value))
    {
        values[pair.Value] = parameters.GetType().GetProperty(pair.Key).GetValue(parameters, null);
    }
    
    return string.Format(newFormat, values);
}

Zullen ongetwijfeld fouten in zitten, maar hij werkt voor simpele cases wel:

C#:
1
2
3
4
5
6
7
8
    StringFormatExtended("<img src=\"{src}\" width=\"{w}\" height=\"{h,-19:{{HH:mm}}}\" alt=\"{alt,-19}\" />",
                         new
                         {
                            src = "lolcakes",
                            w = 19,
                            h = DateTime.Now,
                            alt = "lolcakes",
                         })


Resultaat:
code:
1
<img src="lolcakes" width="19" height="{14:15}            " alt="lolcakes           " />


Wilde nog iets met dynamic gaan doen, maar kon zo snel even niet vinden hoe je fatsoenlijk aan de hand van een property-naam de waarde ophaalt.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 06-07 10:13

GateKeaper

#1 Procastinator

Damn... mijn idee was 't zelfde, alleen iets anders uitgevoerd.

C#:
1
2
3
4
5
6
7
8
9
10
public static String Format(this string str, dynamic parameters)
{
    var properties = parameters.GetType().GetProperties() as PropertyInfo[];
    var values = properties.Select(x => x.GetValue(parameters, null)).ToArray<object>();

    var i = 0;
    str = Regex.Replace(str, @"{([a-zA-Z0-9]*)(:?[a-zA-Z0-9_\-#]*)}", m => "{"+ (i++) + m.Groups[2].Value+"}");
  
    return string.Format(str, values);
}

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
GateKeaper schreef op maandag 01 oktober 2012 @ 15:20:
[...]


Damn... mijn idee was 't zelfde, alleen iets anders uitgevoerd.

C#:
1
2
3
4
5
6
7
8
9
10
public static String Format(this string str, dynamic parameters)
{
    var properties = parameters.GetType().GetProperties() as PropertyInfo[];
    var values = properties.Select(x => x.GetValue(parameters, null)).ToArray<object>();

    var i = 0;
    str = Regex.Replace(str, @"{([a-zA-Z0-9]*)(:?[a-zA-Z0-9_\-#]*)}", m => "{"+ (i++) + m.Groups[2].Value+"}");
  
    return string.Format(str, values);
}
En het volgende ;)
C#:
1
var test = String.Format("{{Test}}, {Test}", new {Test="Test"});

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 22-01-2024

Korben

() => {};

Woy schreef op maandag 01 oktober 2012 @ 15:28:
[...]

En het volgende ;)
C#:
1
var test = String.Format("{{test}}, {test}", new {Test="Test"});
Je zegt 'test' in de format string, maar 'Test' in je anonymous type... Moet het case-insensitive zijn? Ik weiger te buigen voor de incompetenties van VB.NET-programmeurs.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik doelde niet op de case sensitivity, dat was gewoon een foutje van mijn. Maar op de escaping van de eerste {{test}} die ik dus gewoon in mijn output wil hebben :P

net zoals dat
C#:
1
var test = String.Format( "{{0}}, {0}", "test" );

het volgende als resultaat zal hebben.
{0}, test

[ Voor 30% gewijzigd door Woy op 01-10-2012 15:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 06-07 10:13

GateKeaper

#1 Procastinator

Woy schreef op maandag 01 oktober 2012 @ 15:28:
[...]

En het volgende ;)
C#:
1
var test = String.Format("{{Test}}, {Test}", new {Test="Test"});
Geeft netjes een exception: "Index (zero based) must be greater than or equal to zero and less than the size of the argument list." O-)

Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 22-01-2024

Korben

() => {};

Woy schreef op maandag 01 oktober 2012 @ 15:32:
Ik doelde niet op de case sensitivity, dat was gewoon een foutje van mijn. Maar op de escaping van de eerste {{test}} die ik dus gewoon in mijn output wil hebben :P

net zoals dat
C#:
1
var test = String.Format( "{{0}}, {0}", "test" );

het volgende als resultaat zal hebben.
{0}, test
Fixed. Lang leve lookahead en lookbehind.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string StringFormatExtended(string format, object parameters)
{
    Regex regex = new Regex(@"(?<=^|[^{]|{{){(?<identifier>[a-z]\w*)(?<alignment>,-?\d+)?(?<format>:(?:[^{}]+|{{|}})*)?}(?=$|[^}]|}})", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
    
    MatchCollection matches = regex.Matches(format);
    
    var uniqueNames = matches.Cast<Match>().Select(match => match.Groups["identifier"].Value).Distinct().Select((identifier, index) => new { identifier, index }).ToDictionary(i => i.identifier, i => i.index);
    
    string newFormat = regex.Replace(format, match => "{" + uniqueNames[match.Groups["identifier"].Value] + match.Groups["alignment"].Value + match.Groups["format"].Value + "}");
    object[] values = new object[uniqueNames.Count];

    foreach (var pair in uniqueNames.OrderBy(p => p.Value))
    {
        values[pair.Value] = parameters.GetType().GetProperty(pair.Key).GetValue(parameters, null);
    }
    
    return string.Format(newFormat, values);
}

C#:
1
StringFormatExtended("{{test}}, {test}", new { test = "Test" })

{test}, Test

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
var test = StringFormatExtended("{{{{Test}}}}, {Test}", new { Test = "Blaat" });

Geeft nog steeds niet het gewenste resultaat
{{Test}}, Blaat

maar
{{0}}, Blaat

;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Woy schreef op maandag 01 oktober 2012 @ 15:44:
var test = StringFormatExtended("{{{{Test}}}}, {Test}", new { Test = "Blaat" });

Geeft nog steeds niet het gewenste resultaat
Some people, when confronted with a problem, think: “I know, I'll use regular expressions.” Now they have two problems.
Ik denk dat de beste oplossing in deze ook niet echt een Regex is. Zéker niet als je ook een beetje leuk wat formatting parameters e.d. in die string wil kunnen meegeven.

[ Voor 10% gewijzigd door RobIII op 01-10-2012 15:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 06-07 10:13

GateKeaper

#1 Procastinator

Woy schreef op maandag 01 oktober 2012 @ 15:44:
var test = StringFormatExtended("{{{{Test}}}}, {Test}", new { Test = "Blaat" });

Geeft nog steeds niet het gewenste resultaat
{{Test}}, Blaat

maar
{{0}}, Blaat

;)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public static String Format(this string str, dynamic parameters)
{
    var properties = parameters.GetType().GetProperties() as PropertyInfo[];
    var values = properties.Select(x => x.GetValue(parameters, null)).ToArray<object>();

    var i = 0;
    str = Regex.Replace(str, @"(?<!\{){([a-zA-Z0-9]*)(:?[a-zA-Z0-9_\-#]*)}(?!\})", m => "{" + (i++) + m.Groups[2].Value + "}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
  
    return string.Format(str, values);
}

// test equals "{Test}, Blaat"
var test = "{{Test}}, {Test}".Format(new { Test = "Blaat" });


*edit, houdt dus alleen nog geen rekening met het feit dat je 1 parameter misschien wel 2x wilt gebruiken.

[ Voor 5% gewijzigd door GateKeaper op 01-10-2012 15:54 ]


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 21:01

Sebazzz

3dp

GateKeaper schreef op maandag 01 oktober 2012 @ 15:52:
[...]


*edit, houdt dus alleen nog geen rekening met het feit dat je 1 parameter misschien wel 2x wilt gebruiken.
Het is niet nodig om voor dat dynamic te gebruiken, en je code stopt ook met werken als je er een object van type ExpandoObject in stopt.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 22-01-2024

Korben

() => {};

RobIII schreef op maandag 01 oktober 2012 @ 15:48:
[...]


[...]

Ik denk dat de beste oplossing in deze ook niet echt een Regex is. Zéker niet als je ook een beetje leuk wat formatting parameters e.d. in die string wil kunnen meegeven.
Hoezo? Dát kan nou weer net wel. Alleen escaping is een probleem met regexes.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 14:42
Er zijn inderdaad nogal wat edge cases. Het is in ieder geval niet zo straight-forward dan je zou denken.

Phil Haacked heeft hier een hele tijd geleden iets over geschreven.

Ah gevonden

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RobIII schreef op maandag 01 oktober 2012 @ 15:48:
[...]


[...]

Ik denk dat de beste oplossing in deze ook niet echt een Regex is. Zéker niet als je ook een beetje leuk wat formatting parameters e.d. in die string wil kunnen meegeven.
Dat was eigenlijk ook het punt wat ik wilde maken, nou zeg ik niet dat het niet op te lossen is met regexen, maar ik vermoed dat het uiteindelijk een oplossing wordt die of niet helemaal correct is, of totaal niet onderhoudbaar is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 22-01-2024

Korben

() => {};

Maar de oplossing die Phil Haack aanbiedt is dus eigenlijk een prima oplossing...

Het zipje wat hij aanbiedt heeft alle oplossingen waar over wordt gepraat. Even getest hoe goed die werken.

C#:
1
"{foo} {{{{foo}}}} is a {bar} is a {baz} is a {qux:#.#}} lol} is a really big {fizzle:{{HH:mm}}}}}}}"


Hanselformat took 0,04332 ms
Hanselformat result: 123 {{{{foo}}}} is a True is a this is a test is a 123,5} lol} is a really big {{16:33}}}}}}
OskarFormat took 0,07384 ms
OskarFormat result: 123 {{{123}}} is a True is a this is a test is a 123,5} lol} is a really big {16:33}}}}}}
JamesFormat took 0,02918 ms
JamesFormat result: 123 {{foo}} is a True is a this is a test is a 123,5} lol is a really big {16:33}}}
HenriFormat took 0,02782 ms
HenriFormat result: FAILED
HaackFormat took 0,0153 ms
HaackFormat result: 123 {{foo}} is a True is a this is a test is a 123,5} lol is a really big {16:33}}}


Nog meer tests te verzinnen? IMO produceren alleen JamesFormat en HaackFormat de correcte output. HenriFormat deed dat ook, totdat ik die dubbel-geëscapete brackets toevoegde. :+

[ Voor 91% gewijzigd door Korben op 01-10-2012 16:35 ]

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?

Pagina: 1