Homepage Inspire-world | Forum
CGI/Perl Workshops Zahlen expandieren (führende Nullen)

 Inhaltsverzeichnis/Workshops Übersichtsseite/Zahlen expandieren (führende Nullen)
In diesem Workshop soll es darum gehen Zahlen mit führenden Nullen (aus z.B. 8 wird 000008 und 34 wird zu 000034 ) aufzufüllen. Dies wird oft benutzt/benötigt um gespeicherte Dateien in einer einheitlichen Reihenfolge zu speichern. Im zweiten Teil soll dies in einer Subroutine untergebracht werden die auf die übergebenen Parameter reagiert und entsprechend die Zahlen zurückliefert.

1. Funktionsweise allgemein

$zahl = 34;
$zahl = sprintf ('%06d', $zahl); 
print $zahl # ergibt 000034
Wie funktioniert's?

Hier wird die Zahl 34 per sprintf und der Angabe %06d zu einer Dezimalzahl 6 stelliger Länge "umgeformt". Da in dem Fall aber zu den 6 Stellen 4 fehlen wird die Zahl mit Nullen aufgefüllt.

Hinweis:
sprintf dient im Gegensatz zu printf dazu den Wert nicht auf dem Bildschirm auszugeben.


2. Das ganze als Multifunktionelle Subroutine

Mitunter kommt es vor das man eine solche Funktion mit verschiedenen Parametern immer wieder mal braucht. So das man Dateien mit 8 Stelligen Zahlen darstellen möchte und die Daten in dr Datei vielleicht nur 3 stellig haben möchte.

Zunächst das komplette Beispiel:
#!/usr/bin/perl

#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
# Zahl die "expandiert" werden soll
my $zahl = 34;

# Ausgabe per Subroutinenaufruf
print my $expandierte_zahl = &expander("$zahl","6");

# Subroutine 
sub expander  {
my $laengenwert = '%' . '0' . $_[1] . 'd';
my $wert = sprintf ($laengenwert, $_[0]);
return $wert;
}
Hier wird nun mit dem Subroutinenaufruf print my $expandierte_zahl = &expander("$zahl","6"); die Zahl $zahl und die gewünschte Länge 6 an die Subroutine übergeben.

Diese empfängt die Werte in dem Standardarray @_ auf das mit $_[0], $_[1] usw. zugegriffen werden kann.

Um nun $laengenwert Dynamisch zusammenzusetzen bedient man sch der Stringverkettung wie hier '%' . '0' . $_[1] . 'd' dargestellt. Durch die Punkte wird dann aus den Einzelteilen %06d

return liefert dann das Ergebnis der Geschichte zurück.

3. Die Subroutine mit einer for Schleife benutzen

Hier noch ein Anwendungsbeispiel mit einer for Schleife (siehe auch Workshops Schleifen). Dies könnte z.B. dazu benutzt werden vorhandene Zahlenwerte in einer Datei mit den führenden Nullen zu versehen.

Das komplette Beispiel:
#!/usr/bin/perl

#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";

for ($zahl=1; $zahl <= 15; $zahl++) {
# Ausgabe per Subroutinenaufruf
print my $expandierte_zahl = &expander("$zahl","6") . "\n";
}

# Subroutine 
sub expander  {
my $laengenwert = '|' . '%' . '0' . $_[1] . 'd' . '|';
my $wert = sprintf ($laengenwert, $_[0]);
return $wert;
}
Ergibt:
|000001|
|000002|
|000003|
|000004|
|000005|
|000006|
|000007|
|000008|
|000009|
|000010|
|000011|
|000012|
|000013|
|000014|
|000015|


Das häufig verwendete Datenbanktrennzeichen | habe ich hier in die Stringvekettung mit eingefügt. Natürlich sind hier auch weitere Möglichkeiten realisierbar.


 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Zahlen expandieren (führende Nullen)
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!