C'est moi qui parse la valeur, à coup de strtof() (parce que les strtoX() sont les seules méthodes qui permettent de vérifier que ce que l'on a obtenu est correct (sans avoir à sortir l'artillerie lourde, genre boost::lexical_cast)).
Du coup, j'ai tenté de vérifier ma locale juste avant l'appel à strtof().
D'après http://www.cplusplus.com/reference/locale/locale/locale/, en C++ :
std::locale g = std::locale(); est sensé me donner ma locale globale (pas certain de ce que cela signifie),
std::locale d = std::locale(""); est sensé me donner la locale par défaut du système,
std::use_facet< std::numpunct >(la_locale).decimal_point(); est sensé me donner le séparateur décimal.
Sur les deux machines, la locale par défaut est C avec comme séparateur décimal est le point, et la locale globale est bien fr_FR.UTF-8 avec la virgule. Mais je ne suis pas certain de savoir laquelle est utilisée...
Sur ma machine virtuelle, c'est bien le point. Sur le serveur, c'est la virgule. Ce qui explique le comportement du serveur. Reste à trouver pourquoi il utilise une locale différente. Moi qui avait pris une LTS en pensant être tranquille...
Je pense qu'en attendant, je vais changer pour du lexical_cast.
[^] # Re: info
Posté par cfx . En réponse au message [Résolu] Problème de séparateur décimal. Évalué à 0. Dernière modification le 15 octobre 2013 à 19:34.
C'est moi qui parse la valeur, à coup de strtof() (parce que les strtoX() sont les seules méthodes qui permettent de vérifier que ce que l'on a obtenu est correct (sans avoir à sortir l'artillerie lourde, genre boost::lexical_cast)).
Du coup, j'ai tenté de vérifier ma locale juste avant l'appel à strtof().
D'après http://www.cplusplus.com/reference/locale/locale/locale/, en C++ :
std::locale g = std::locale(); est sensé me donner ma locale globale (pas certain de ce que cela signifie),
std::locale d = std::locale(""); est sensé me donner la locale par défaut du système,
std::use_facet< std::numpunct >(la_locale).decimal_point(); est sensé me donner le séparateur décimal.
Sur les deux machines, la locale par défaut est C avec comme séparateur décimal est le point, et la locale globale est bien fr_FR.UTF-8 avec la virgule. Mais je ne suis pas certain de savoir laquelle est utilisée...
Sauf qu'à priori, comme strtof() est une fonction C et non C++, elle utilise une autre locale.
D'après http://www.cplusplus.com/reference/clocale/localeconv/, les lignes suivantes me donne le séparateur décimal :
struct lconv * lc = localeconv();
std::cout << lc->decimal_point << std::endl;
Sur ma machine virtuelle, c'est bien le point. Sur le serveur, c'est la virgule. Ce qui explique le comportement du serveur. Reste à trouver pourquoi il utilise une locale différente. Moi qui avait pris une LTS en pensant être tranquille...
Je pense qu'en attendant, je vais changer pour du lexical_cast.