Wie kann ich bc dazu bringen, Dezimalbrüche mit einer führenden Null zu beginnen?

Wie kann ich bc dazu bringen, Dezimalbrüche mit einer führenden Null zu beginnen?

Wie kann ich bcDezimalzahlen mit einer führenden Null beginnen?

$ bc <<< 'scale=4; 1/3'
  .3333

Ich möchte 0,3333.

Antwort1

bcunterstützt das Hinzufügen von Nullen nicht nativ.

Die Problemumgehung ist:

echo 'scale=4; 1/3' | bc -l | awk '{printf "%.4f\n", $0}'
0.3333
  • \n  – Beenden Sie die Ausgabe mit einer neuen Zeile.

  • %f  – Gleitkomma

  • %.4f– die Anzahl der anzuzeigenden Ziffern. Dies gibt 4 Ziffern nach dem Dezimalpunkt an.

Antwort2

Leider bcist es so geschrieben, dass Sie das nicht können. Diese Aussage gilt auch für das benachbarte dc. Als Lösung wird normalerweise vorgeschlagen, ein Textverarbeitungsprogramm zu verwenden, um bcdie Ausgabe zu ändern, oder ein völlig anderes Programm wie perloder pythonmit anderer Syntax zu verwenden, aber für mich scheinen sie für eine so einfache Aufgabe zu schwerfällig zu sein.

Aus Ihren anderen Fragen geht hervor, dass Sie zshBenutzer sind. Ich würde daher vorschlagen zcalc, das eine sehr ähnliche Syntax für grundlegende Operationen hat, wie bc:

$ zcalc -e '1/3'
0.333333

Zuerst müssen Sie diese Funktion laden (z. B. innerhalb .zshrc) und wahrscheinlich möchten Sie alle Zahlen immer als Gleitkommazahlen behandeln mit -fder folgenden Option:

autoload -U zcalc
alias zcalc='zcalc -f'

Als Bonus können Sie mit ZCALCPROMPTParametern eine spezielle Eingabeaufforderung für den Rechner definieren, Einzelheiten finden Sie unter man zshcontrib.

Antwort3

bckann dazu überredet werden, eine führende Null zu verwenden:

for div in 10 1000; do 
  echo "scale=3;v=158/$div; if(v > -1 && v < 1) print 0,v,\"\n\" else print v, \"\n\"" | bc
done

Antwort4

Dies ist eine Lösung mit allen Mitteln, die die Fehler meiner vorherigen Antwort behebt. Diese kleine Funktion findet einigermaßen intelligent heraus, wann und wo die führende 0 und das Minuszeichen eingefügt werden müssen, und verwendet den backspaceSteuercode, um im gedruckten Wert rückwärts zu gehen. Dies funktioniert nicht im Posix- -s|--standardModus (oder wenn es auf einem Teletype gedruckt wird!):

#!/usr/bin/env bc
# this is lz.bc
define lz(d) {
  if (ibase != 10 || obase != 10) {
    print "(io)base must be decimal (10)\n"
    return -1
  }
  n=0; b=0; a=0
  if (d<0) n=1 # negative
  if (d>-1 && d<0) b=1 # below
  if (d>0 && d<1) a=1  # above
  print " ", d
  for (i=length(d)+1; i>=0; i--) {
    print "\b"
    if(i==0 && (b || a)) print "0\b\b"
  }
  if(n) print "-"
  print "\n"
  return 0
}

v[0]=-.234
v[1]=.234
v[2]=-2.345
v[3]=2.345
v[4]=-123.4567
v[5]=123.456
for(x=0;x<6;x++) {
  print v[x], " ... "
  r=lz(v[x])
}
obase=16
r=lz(v[5])
quit

welches beim Aufrufen Folgendes anzeigt:

$ bc lz.bc 
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
-.234 ... -0.234
.234 ... 0.234
-2.345 ...  -2.345
2.345 ...  2.345
-123.4567 ...  -123.4567
123.456 ...  123.456
(io)base must be decimal (10)

verwandte Informationen