Mooi
Anmeldungsdatum: 15. August 2014
Beiträge: 187
|
Hallo, ich lasse mir große Zahlen gerne punktieren und benutze dafür eine Funktion in meiner bashrc:
Punktiere(){ local g c s=${2-3}; [[ $s =~ ^[0-9]*$ ]] || s=3; s=$((10#$s)); ((s)) || s=3; for (( c=${#1}; c>s; c=((c-s)) )) do g=".${1:$((c-s)):$s}$g"; done; echo "${1:0:$c}$g"; } Zahlen in 3er Gruppen:
~> Punktiere 1234567890
1.234.567.890 Telefonnummern in 4er Gruppen:
~> Punktiere 1234567890 4
12.3456.7890 Kommt mir ein wenig aufgeblasen vor, die Funktion (die Hälfte besteht aus Fehlerbehandlung). Vielleicht kennt hier jemand einen eleganteren Weg.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Bei mir heißt der Kerl numformat.sh, kennt keine 4er-Gruppen und sieht so aus:
| sed ':a;s/\B[0-9]\{3\}\>/ &/;ta'
|
So wird's benutzt:
| echo 23456789876543 | numformat.sh
23 456 789 876 543
|
und Fehlerbehandlung kennt der Code nicht. Wie man sieht benutze ich Blanks als Trenner was moderner ist, weil es den US/DE-Konflikt zwischen Punkt und Komma vermeidet, allerdings hätten diese den Vorteil dass eine so formatierte Zahl nicht in der Mitte umbebrochen wird von den verschiedenen Tools.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Vielleicht kann man es auch ganz systematisch machen, etwa so: x=1234567890; y=""
while [ "$x" -gt 999 ]; do y=".${x: -3}$y"; x="${x%???}"; done; echo $x$y Das schneidet immer eine 3-er-Gruppe hinten ab und setzt sie mit Punkt hinten an $y an. Und es schmeißt automatisch einen Fehler, wenn $x nicht ganzzahlig ist, und macht dann nichts weiter. LG, track
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Hey, das ist jetzt noch nicht ganz das gewünschte Format, aber dafür sehr einfach: $ echo "obase=1000; 12345678" | bc
012 345 678 Grüße Frink
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Na, auf so einem einfachen Wege kann das ja jeder ... 😉 Hier habe ich es auch nochmal gefunden: track@lucid:~$ x=1234567890
track@lucid:~$ printf "%'.i\n" "$x"
1.234.567.890 LG, track
|
Mooi
(Themenstarter)
Anmeldungsdatum: 15. August 2014
Beiträge: 187
|
4 Antworten, 4 verschiedene Möglichkeiten - vielen Dank dafür! 👍 Nach einer Möglichkeit mit printf habe ich sogar zuerst gestöbert, aber nichts gefunden (ich kann leider nur "Stammelenglisch").
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Mooi schrieb: 4 Antworten, 4 verschiedene Möglichkeiten - vielen Dank dafür! 👍
Warte, ich hab noch eine $ ruby -e 'puts ARGV[0].gsub(/\d{1,3}(?=(?:\d{3})+\b)/, "\\&.")' 1234567890
1.234.567.890 Die Sache mit dem Lookahead finde ich sehr elegant - auch, wenn das vielleicht nicht super effizient ist.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
user unknown schrieb: Bei mir heißt der Kerl numformat.sh, kennt keine 4er-Gruppen und sieht so aus:
| sed ':a;s/\B[0-9]\{3\}\>/ &/;ta'
|
Diese Lösung finde ich übrigens auch sehr elegant. 👍
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
rklm schrieb: user unknown schrieb: Bei mir heißt der Kerl numformat.sh, kennt keine 4er-Gruppen und sieht so aus:
| sed ':a;s/\B[0-9]\{3\}\>/ &/;ta'
|
Diese Lösung finde ich übrigens auch sehr elegant. 👍
Leider verstehe ich sie selbst nicht mehr. Entweder ich hatte das Handbuch in der Hand oder habe sie selbst von irgendwoher. Mit :a und ta kenne ich mich nicht soweit aus, dass ich das aus dem Kopf erklären könnte, selbst nicht mit diesem Codeschnipsel, von dem ich weiß was er tun soll. ☺
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
user unknown schrieb: rklm schrieb: user unknown schrieb: Bei mir heißt der Kerl numformat.sh, kennt keine 4er-Gruppen und sieht so aus:
| sed ':a;s/\B[0-9]\{3\}\>/ &/;ta'
|
Diese Lösung finde ich übrigens auch sehr elegant. 👍
Leider verstehe ich sie selbst nicht mehr.
😀
Entweder ich hatte das Handbuch in der Hand oder habe sie selbst von irgendwoher. Mit :a und ta kenne ich mich nicht soweit aus, dass ich das aus dem Kopf erklären könnte, selbst nicht mit diesem Codeschnipsel, von dem ich weiß was er tun soll. ☺
":a" ist ein Label. Der Trick ist das Kommando "t": wenn eine Ersetzung erfolgte, dann springe zum Label - "a" in diesem Fall. Es wird also so lange eine Sequenz von drei Zahlen gefolgt von einer Nicht-Zahl ("\>") und mit vorangestelltem Wort-Zeichen ("\B" matched eine Non Word Boundary) ersetzt durch sich selbst mit vorangestelltem Leerzeichen, bis keine Ersetzungen mehr möglich sind.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Danke, das ist jetzt als Kommentar Teil meines Scripts, so dass ich es in 3-4 Jahren selbst rekonstruieren kann. ☺
|
Mooi
(Themenstarter)
Anmeldungsdatum: 15. August 2014
Beiträge: 187
|
Ui, geht ja noch weiter, der Thread, Danke nochmal. Mit printf ist schon das "Killerprogramm" für mich gefunden.
|