Någon som har en kodsnutt för att konverera XML decimaltal till double. Grejen är ju att XML alltid använder decimalpunkt oavsett vilken locale man har på datorn. Men har du ingen bra XML-komponent som skickar ut det som ett riktigt flyttal? Använd de angivna prefixen (borde stå i alla böcker) för temporär konvertering av datatyper. Inte för att vara otrevlig, men som ny bör du nog vara här ett tag och titta runt lite innan du börjar svara på alla trådar. > Men har du ingen bra XML-komponent som skickar ut det som ett riktigt flyttal? >Nej, har du? >Sen så har du väl iofs skrivit fel, if-satsen borde väl varaKonvertera flyttal
Värdet är validerat av ett schema med typen xs:decimal så det behövs inte någon felkontroll.
istream, atof, scanf, boost::lexical_cast använder ju alla LC_LOCALE. Jag vet att man kan gör imbue på en istream men det verkar lite overkill i det här fallet.Sv: Konvertera flyttal
Annars finns ju den allra fulaste varianten - läsa in det till en sträng, plocka fram den lokala motsvarigheten, göra en replace, och sen använda stringstream...
Sen finns det väl någon möjlighet att ändra en localen?Sv: Konvertera flyttal
te.x
om 3200 är av typen integer
och du tillfälligt måste konvertera den till typen Long Behöver du bara använda
3200L (L-Prefixet) eller (long)3200 eller L3200Sv: Konvertera flyttal
För det första: Flera av trådarna du har svarat i är ganska gamla. Om du inte tillför något fundamentalt nytt och viktigt så gör vissa trådar bäst i att dö ut.
För det andra: Var säker på vad det är du svarar på innan du svarar.
I den här tråden, t.ex., är ditt svar helt felaktigt.
1. Han vill inte konvertera till long, utan han vill läsa in ett decimalvärde från en XML-fil till en double.
2. Detta vill han göra i runtime med dynamiska värden, han kan alltså inte använda några prefix.
3. Problemet rör inte själva konverteringen utan att alla inputströmmar använder datorns lokala inställningar för att avgöra om tal läses in med punkt eller komma som decimalskiljare, men att XML alltid har samma.
Inte för att vara elak, utan för att vi försöker hålla hög kvalitet på forumet.Sv: Konvertera flyttal
Nej, har du?
Jag använder MSXML4 och där finns ju .nodeTypedValue men den fungerar inte med schema (returnerar alltid en sträng) om man inte explicit sätter datatypen ("r8") på varje fält innan man läser det.
> Sen finns det väl någon möjlighet att ändra en localen?
Jodå, det kändes bara som det här är ett problem som alla som jobbar med XML i C++ måste ha. (I VB finns ju Str/Val som är locale oberende)
Så här ser min lösning ut:
double XML_StrToDouble(const char* str) {
std::istringstream istr; istr.str(std::string(str));
istr.imbue(std::locale::classic());
double tmp; istr >> tmp;
if (!istr.fail() && istr.eof()) return tmp;
return 0;
}Sv: Konvertera flyttal
Hehe... nä...
Men det där var väl ganska snyggt ändå?
Skulle iofs gärna slänga ett exception snarare än return 0, och kanske se till att inte behöva skapa en ny istr varje gång, men i övrigt så är väl det bra?
Sen så har du väl iofs skrivit fel, if-satsen borde väl vara
if (!(istr.fail() && istr.eof()))
?Sv: Konvertera flyttal
>if (!(istr.fail() && istr.eof()))
"fail" är falsk om konverteringen gick bra (dock kanske inte hela strängen användes)
"eof" är sann om hela strängen användes