Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10422[/thread]

zentrierte Darstellung mit printf möglich?

Leser: 1


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
Duff
 2007-09-19 13:41
#99654 #99654
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe mal eine (vielleicht blöde oder einfache) Frage zu printf in perl.
Konnte leider nichts gebrauchbares dazu finden.

Kann ich bei der Formatierung mit printf auch einen Text oder Zahl zentriert darstellen???

Danke.
D'OH
Daniel
renee
 2007-09-19 13:51
#99657 #99657
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So kannst Du es machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

chomp( my $text = <STDIN> );
my $width  = 30;
my ($rand) = int( ($width - length $text) / 2 );
my $format = ">>%*s%s%*s<<";
print sprintf $format, $rand, ' ', $text, ($width - length($text) - $rand), ' ';
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-09-19 14:00
#99660 #99660
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke für die schnelle Antwort, aber kannst du vielleicht noch ein paar Schritte dazu erklären?

Wie würde ich das ganze denn realisieren müssen, wenn ich vorhern ein printf benutze, das ungefähr so aussieht:

Code: (dl )
printf("%-10s %06d %20s\n", $variable1, $variable2, $variable3);


z.B. sollen dann die $variable2 zentriert dargestellt werden.
D'OH
Daniel
renee
 2007-09-19 14:12
#99662 #99662
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Duff+2007-09-19 12:00:30--
Danke für die schnelle Antwort, aber kannst du vielleicht noch ein paar Schritte dazu erklären?


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/perl

# das sollte klar sein ;)
use strict;
use warnings;

# hole den Text
chomp( my $text = <STDIN> );

# So breit soll das "Fenster" für den Text insgesamt sein
my $width  = 30;
# berechne den linken rand
my ($rand) = int( ($width - length $text) / 2 );

# das Format:
# %*s  => ein String (%s), dessen Länge erst noch festgelegt werden muss (*)
# %s => der eigentliche Text
# %*s => der rechte Rand, im Prinzip das gleiche wie beim ersten Format-Teil
my $format = ">>%*s%s%*s<<";

# gebe den Text aus...
# übergebe an sprintf folgende Parameter:
# breite des linken Rands (ersetzt das erste *)
# Leerzeichen (als "Text" für den linken Rand)
# der eigentliche Text
# Breite des rechten Rands (ersetzt das zweite *)
# Leerzeichen (als "Text" für den rechten Rand)
print sprintf $format, $rand, ' ', $text, ($width - length($text) - $rand), ' ';



Quote
Wie würde ich das ganze denn realisieren müssen, wenn ich vorhern ein printf benutze, das ungefähr so aussieht:

Code: (dl )
printf("%-10s %06d %20s\n", $variable1, $variable2, $variable3);


z.B. sollen dann die $variable2 zentriert dargestellt werden.


Was willst Du da groß zentriert haben? Zentriert zwischen $variable1 und $variable3? Da würde ich mir ne kleine Funktion bauen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-09-19 14:16
#99663 #99663
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ja danke.

Sorry, was ich meinte ist, dass ich eine Auswertung mache und dann eine Ausgabe.
Ich quasi eine Tabelle, die eine Überschrift hat für jede Spalte und die einzelnen Werte für die Spalten sollen unterschiedlich dargestellt werden (links-, rechts-bündig oder aber zentriert).
D'OH
Daniel
renee
 2007-09-19 14:20
#99664 #99664
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Meinst Du so etwas:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl

use strict;
use warnings;

my @values = (
    ['T',20,'H'],
    ['Hallo',3,'Welt'],
    ['Test',1035,'Eintrag'],
);

my $length = 30;

for my $ref ( @values ){
    print_formatted( $length, @$ref );
}

sub print_formatted{
    my ($max,$t1,$zahl,$t2) = @_;
    $zahl = sprintf '%06d', $zahl;
    
    my ($rand) = int( ($max - length $zahl) / 2 );
    my $left   = $rand - length $t1;
    
    my $format = "%s%*s%s%*s%s\n";
    print sprintf $format, $t1,$left,' ',$zahl,$left,' ',$t2;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-09-19 14:46
#99667 #99667
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Nicht ganz.
Meine eine Ausgabe, die dann ungefähr so aussieht:
Code: (dl )
1
2
3
4
5
spalte1 spalte2 spalte3
-----------------------
1 1 value1
2 20 value2
3 2000 value3
D'OH
Daniel
renee
 2007-09-19 14:52
#99669 #99669
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl

use strict;
use warnings;

my @values = (
    ['T',20,'H'],
    ['Hallo',3,'Welt'],
    ['Test',1035,'Eintrag'],
);

my $length = 6;

print sprintf "%-7s| %s |%9s\n",'col1','col2','col3';
for my $ref ( @values ){
    print_formatted( $length, @$ref );
}

sub print_formatted{
    my ($max,$t1,$zahl,$t2) = @_;
    
    my ($rand) = int( ($max - length $zahl) / 2 );
    my $right  = $max - $rand - length $zahl;
    
    my $format = "%-7s|%*s%s%*s|%9s\n";
    print sprintf $format, $t1,$rand,' ',$zahl,$right,' ',$t2;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2007-09-19 14:57
#99672 #99672
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Sowas geht mit dem eingebauten format Anweisungen, aber habe die noch nie genutzt, bzw richtig durchgelesen.

Siehe dazu:
http://perldoc.perl.org/perlform.html

Oder:
Perl6::Form

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl
use strict;
use warnings;

my @values = (
    [ 1, 1,    'value1' ],
    [ 2, 20,   'value2' ],
    [ 3, 2000, 'value3' ],
);

print "spalte1 spalte2 spalte3\n",
      "-----------------------\n";

for my $value ( @values ) {

format STDOUT =
@<<<<<< @|||||| @>>>>>>
$value->[0], $value->[1], $value->[2]
.

    write;
}
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2007-09-19 15:12
#99673 #99673
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, da ich nicht mit format arbeite (habe eine unerklärliche Abneigung dagegen), denke ich da nicht dran...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2007-09-19 13:41.