Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Journal : Pourquoi je hais les locales

Posté par Troy McClure (page perso, ) le 16 janvier 2007
Mon cher journalounet,
Je ne suis en aucun cas un expert en matière d'i18n ou de localization, j'ai même été parfois pris en flagrant délit d'anti utf8isme primaire. Néanmoins je m'interroge très fortement sur la santé mentale des gens qui ont trouvé que c'était une bonne idée de localiser le séparateur décimal (cad virgule pour les français et point pour le reste du monde). Encore plus pour les quelques guignols qui ont jugé utile de rendre toutes les fonctions de "base" (atof, scanf etc) de la libc "locale-aware" alors qu'elles n'ont pas été conçues pour ça. Ainsi que le côté "global" de la locale: quand on fait un appel à setlocale ça s'applique à tout le monde dans l'appli: le programme comme les libs, et toutes les threads.

Alors à quoi on abouti, mon journalounet ? j'ai mon module python qui lit des fichiers de données. Ces fichiers sont en texte (pour la portabilité et la facilité d'édition), c'est de l'ascii tout gentil. Ils contiennent entre autres plein de nombres en virgule flottante. C'est du C à l'ancienne, sans fioritures ni headers exotiques. C'est du costaud, du robuste, ça a voyagé et vu plein d'Unix et de compilateurs différents. Tout marche bien, c'est super. Et là tout à coup je charge un autre module python, qui en charge un autre etc et dans le paquet y'en a un qui se dit "et si je faisais un setlocale pour bien causer la langue de l'autochtone?" . Et il le fait ce con. Et du coup, ben au lieu de lire des nombres à virgule flottante mon module ne lit plus que la partie à gauche du point décimal, parce qu'après il attend une virgule. Et qu'est-ce qui se passe ? ben ça bugge, le moteur gauche de la fusée demarre avec 0.5 seconde d'avance, elle part en vrille et va s'abattre sur la maison blanche, En représaille le président des Etats Unis d'Amerique appuie sur son bouton rouge et 3000 missiles vont s'abattre sur la russie et la corée du nord. Qui répliquent. Game over.

voilà pourquoi je hais les locales (et particulierement LC_NUMERIC)

> Lire le journal (50 commentaires, moyenne: 3,4).  

Vous avez demandé le commentaire #794870.

[+] perl

Posté par Mathieu Stumpf (Jabber id, page perso, ) le 16/01/2007 à 12:48. (lien). Évalué à -1.

Suffit de reformater ton fichier :


perl -pi -e "s/./,/g" ton_fichier

  • [^]Re: perl

    Posté par Plop () le 16/01/2007 à 12:52. (lien). Évalué à 3.

    "Ils contiennent entre autres plein de nombres en virgule flottante."

    ou l'art de flinguer un fichier de données.

    Je pense que la solution serait d'utiliser un format xml pour le stockage des données :-)

    Il y en a marre de devoir écrire des tonnes de parseurs buggés tout le temps.

    --
    http://linuxfr.org/board <-- des moules, du sang, de la violence
    • [^]Re: perl

      Posté par Thierry Boudet (page perso, ) le 16/01/2007 à 13:19. (lien). Évalué à 10.

      je pense que la solution serait d'utiliser un format xml pour le stockage des données

      Quand tu exposes un problème que tu as en informatique, il y a toujours une bonne âme pour te proposer une solution avec XML. Ensuite, tu as DEUX problèmes...

      • [^]Re: perl

        Posté par Plop () le 16/01/2007 à 13:24. (lien). Évalué à 2.

        Quand on fait une citation, il est plus honnête de laisser le smiley qui indique la déconnade.

        Maintenant, la horde de moinsseurs de panurge vont s'abattre sur mon misérable petit post.

        --
        http://linuxfr.org/board <-- des moules, du sang, de la violence
        • [+] [^]Re: perl

          Posté par Gniarf () le 16/01/2007 à 17:47. (lien). Évalué à -3.

          Quand on fait des smileys, il est préférable d'en connaitre l'usage approprié.

          --
          Windows has no users. It has hostages.

        [^]Re: perl

        Posté par Krunch (Jabber id, page perso, ) le 16/01/2007 à 13:29. (lien). Évalué à 2.

        AFAIK à la base on (jwz ?) disait ça pour les expressions rationnelles donc tout le monde à tord dans ce thread en fait.

        --
        Free Softwares Users Group Arlon (Sud Luxembourg, Belgique)
        pertinent, e adj. Approprié ; qui se rapporte exactement à ce dont il est question.
        • [^]Re: perl

          Posté par Jebediah Tramo () le 16/01/2007 à 13:39. (lien). Évalué à 4.

          donc tout le monde à tord

          Et surtout toi, car, ne l'oublions pas, le tord due !

      [^]Re: perl

      Posté par taratatatata () le 16/01/2007 à 14:40. (lien). Évalué à 10.

      XML is like violence : if it doesn't work, use more.

      [^]Re: perl

      Posté par alpage (Jabber id, page perso, ) le 16/01/2007 à 18:12. (lien). Évalué à 1.

      Moi je vote pour le format binaire optimisé, léger et tellement plus fun :-)

    [^]Re: perl

    Posté par Thomas Douillard () le 16/01/2007 à 12:52. (lien). Évalué à 2.

    Ou ptete un (pseudocode)

    -> setlocale(localeinit)

    parsing du fichier

    -> setlocale(localedest)

    (ré)écriture du fichier



    Ceci suppose bien évidemment de connaître la locale init et la locale dest. C'est un problème parce que c'est rarement gardé (idéalement ça devrait être des metas-données du fichiers) et que dans les vieux progs on s'en foutais.

    • [^]Re: perl

      Posté par Troy McClure (page perso, ) le 16/01/2007 à 12:57. (lien). Évalué à 4.

      en plus le setlocale c'est pas super thread-safe donc si t'as un autre thread en même temps qui lit des trucs ça risque de pas être beau

    [^]Re: perl

    Posté par Krunch (Jabber id, page perso, ) le 16/01/2007 à 13:22. (lien). Évalué à 1.

    $ echo 13,37 | perl -pe's/./,/g'
    ,,,,,

    Avec le -i sans argument ça aurait été beau tiens.

    --
    Free Softwares Users Group Arlon (Sud Luxembourg, Belgique)
    pertinent, e adj. Approprié ; qui se rapporte exactement à ce dont il est question.

    [^]Re: perl

    Posté par Guillaume Rossignol () le 16/01/2007 à 18:49. (lien). Évalué à 2.

    On pourrait peut etre verifier qu'il y a des nombres avant et apres le point pour etre sur d'etre sur un nombre flottant et changer le . que dans ce cas

    • [^]Re: perl

      Posté par briaeros007 () le 16/01/2007 à 21:15. (lien). Évalué à 2.

      dans ce cas
      cat file | sed 's/\([0-9]\),\([0-9]\)/\1\.\2/g'

      et pas besoin de perl
      (pas besoin de perl avant non plus ;))

      --
      Subete ga wakatta toki…watashi ga anta wo korosu.
      • [^]Re: perl

        Posté par Smarter () le 16/01/2007 à 21:42. (lien). Évalué à 1.

        Alors autant y aller comme ça:
        sed -i 's/\([0-9]\),\([0-9]\)/\1\.\2/g' monfichier
        si le but c'est de modifier le fichier de base.

        • [^]Re: perl

          Posté par Moonz () le 17/01/2007 à 07:32. (lien). Évalué à 2.

          oui, mais avec perl tu peux utiliser les look around (quelqu'un connaitrait le terme francisé, d'ailleurs ?) :)
          s/(?<=\d)(?=\d),/./