Decimalkomma/punkt i Terminal

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1

Har ett program som skriver ut data i en fil enligt (egentligen har filen många fler kolumner och rader):

5     1.41694030713076
10     0.3449405981087724
15     0.15255939632942522

För att få in dessa i en LaTeX-rapport vill jag minska antalet decimaler i högerkolumnen. Det gör jag med

awk '{ printf "%4d %1.3f\n",$1,$2 }' data.txt

På mitt Linux-system får jag

5 1.417
  10 0.345
  15 0.153

vilket är korrekt, medan när jag kör i Mac OS X (10.5.1) Terminal.app får jag

5 1,000
  10 0,000
  15 0,000

alltså, siffror efter decimalpunkt blir nollor.
Efter lite mixtrande fann jag att den använder decimalkomma som används i svenska, men som sällan används inom programmering. Det går så klart att ändra genom att köra

sed "s/\./,/g"

på filen och sen pajpa den till awk. Men, det blir mycket skrivande. Finns det något sätt att ändra hur terminalen hanterar decimalkomma och decimalpunkt?

  • Medlem
  • Stockholm
  • 2008-07-18 19:42

Ditt program har antagligen aktiverat en "locale". Troligtvis default-lokalen genom att ange tom sträng som andra parameter till setlocale(). Då styrs locale med environment-variabler (LANG).

Exemplet nedan visar ett program som sätter upp en locale (setlocale) och skriver ut ett flyttal. Eftersom jag har svensk locale satt per default (kommandot locale) så får jag decimalkomma. Detta kan enkelt ändras genom att ändra miljövariabeln LANG för processen (vilket visas nedan). Om du inte vill använda localen en_US.UTF-8 kanske du kan prova C eller POSIX.

Lästips:
man 3 setlocale
man 1 locale

pb-2:osperf per$ cat pi.c
#include "stdio.h"
#include "locale.h"

int main()
{
  double pi = 355.0/113.0;
  setlocale(LC_ALL, "");
  printf("%f\n", pi);
}
pb-2:osperf per$ make pi
cc     pi.c   -o pi
pb-2:osperf per$ locale
LANG="sv_SE.UTF-8"
LC_COLLATE="sv_SE.UTF-8"
LC_CTYPE="sv_SE.UTF-8"
LC_MESSAGES="sv_SE.UTF-8"
LC_MONETARY="sv_SE.UTF-8"
LC_NUMERIC="sv_SE.UTF-8"
LC_TIME="sv_SE.UTF-8"
LC_ALL=
pb-2:osperf per$ ./pi
3,141593
pb-2:osperf per$ LANG=en_US.UTF-8 ./pi
3.141593

Tack så mycket!

Det var ju en lätt lösning -- bara sätta LANG=C framför. Jag sökte på nätet efter decimalkomma/decimalpunkt men fann bara jobbiga guider hur man genom att kopiera en inställningspanel från Panther kan ändra den inställningen, med mera, jobbiga lösningar som dessutom ändrar systemet helt.

  • Medlem
  • Stockholm
  • 2008-07-19 09:51

Om du använder LANG=C så får du se upp med åäö. I denna locale finns inte dessa tecken alls (man kör ASCII som är 7-bitars och saknar åäö). Om ditt program bara kopierar text in/ut (eller inte arbetar med text alls) spelar det ingen roll, men om programmet någonsin försöker konvertera text till internt unicode-format (datatypen wchar_t) så får du problem. Då bör du istället använda kommandot locale -a och välja någon av de locales som finns definierade där.

Nu hade jag bara en väldans massa siffror, men jag ska komma det till nästa gång!
Tack!

1
Bevaka tråden