¿Cómo obtengo bc (1) para imprimir el cero inicial?

Hago algo como lo siguiente en un Makefile:

echo "0.1 + 0.1" | bc 

(en el archivo real, los números son dynamics, por supuesto)

Imprime .2 pero quiero que imprima 0.2 .

Me gustaría hacer esto sin recurrir a sed pero parece que no puedo encontrar la manera de hacer que bc imprima el cero. ¿O simplemente no puede hacer esto?

También puede recurrir a awk para formatear:

  echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}' 

o con awk haciendo los cálculos:

  echo "0.1 0.1" | awk '{printf "%f", $1 + $2}' 

Esto podría funcionar para usted:

 echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc 

Después de echar un vistazo rápido a la fuente (ver bc_out_num() , línea 1461), no veo una manera obvia de hacer que el 0 inicial se imprima si la parte entera es 0 . A menos que omita algo, este comportamiento no depende de un parámetro que se puede cambiar usando el indicador de línea de comando.

Respuesta corta: no, no creo que haya una manera de hacer números impresos en bc la manera que desee.

No veo nada de malo con el uso de sed si aún quieres usar bc . Lo siguiente no se ve tan horrible, en mi humilde opinión:

 [me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./' 0.2 

Si realmente quieres evitar sed , las sugerencias de eljunior y de la choroba son bastante simples , pero requieren ajustes dependientes del valor para evitar los ceros al final. Eso puede o no ser un problema para ti.

No puedo encontrar nada sobre el formato de salida en la documentación. En lugar de sed, también puedes usar printf:

 printf '%3.1f\n' $(bc< <<0.1+0.1) 
 $ bc -l < << 'x=-1/2; if (length (x) == scale (x) && x != 0) { if (x < 0) print "-",0,-x else print 0,x } else print x' 

Este es puro bc . Detecta el cero al comparar el resultado de la length con la scale de la expresión. Funciona tanto en número positivo como negativo.

Este también manejará números negativos:

 echo "0.1 - 0.3" | bc | sed -r 's/^(-?)\./\10./' 

esto solo usa bc, y funciona con números negativos:

 bc < << "x=-.1; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x"; 

Pruébalo con:

 for y in "0" "0.1" "-0.1" "1.1" "-1.1"; do bc < << "x=$y; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x"; echo; done 

Probablemente, bc no es realmente la mejor “calculadora de banco” para la edad moderna. Otros idiomas te darán más control. Aquí hay ejemplos de trabajo que imprimen valores en el rango (-1.0 .. + 1.0) con un cero inicial. Estos ejemplos usan bc , AWK y Python 3 .

 #!/bin/bash echo "using bc" time for (( i=-2; i< =+2; i++ )) { echo $(bc<<<"scale=1; x=$i/2; if (x==0||x<=-1||x>=1) { print x } else { if (x<0) { print \"-0\";-x } else { print \"0\";x } } ") } echo echo "using awk" time for (( i=-2; i< =+2; i++ )) { echo $(echo|awk "{printf \"%.1f\",$i/2}") } echo echo "using Python" time for (( i=-2; i<=+2; i++ )) { echo $(python3<<<"print($i/2)") } 

Tenga en cuenta que la versión de Python es aproximadamente 10 veces más lenta, si eso es importante.

Para números positivos, puede ser tan simple como imprimir (una cadena) cero:

 $ echo '"0";0.1+0.1' | bc 0.2 

evite el cero si el número es mayor (o igual) a 1:

 $ echo 'x=0.1+0.1; if(x<1){"0"}; x' | bc 0.2 

Se vuelve un poco más complejo si el número puede ser negativo:

 echo 'x= 0.3 - 0.5 ; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1) {"0"};x' | bc -0.2 

Puede definir una función y agregarla a una biblioteca:

 $ echo 'define leadzero(x){auto s; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"}; return(x)}; leadzero(2.1-12.4)' | bc -10.3 $ echo 'define leadzero(x){auto s; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"}; return(x)}; leadzero(0.1-0.4)' | bc -0.3 

Basándose en la respuesta de los potongs,

Para resultados fraccionarios:

 echo "x=0.1 + 0.1; if(x<1 && x > 0) print 0; x" | bc -l 

Tenga en cuenta que los resultados negativos no se mostrarán correctamente. Aquarius Power tiene una solución para eso.

echo "$a / $b" | bc -l | sed -e 's/^-\./-0./' -e 's/^\./0./'

Esto debería funcionar para todos los casos donde los resultados son:

  • “-.123”
  • “.123”
  • “-1.23”
  • “1,23”

Explicación:

  1. Para todo lo que solo comienza con -. , reemplazar -. con -0.

  2. Para todo lo que solo comienza . , reemplazar . con 0.