przecinek vs. kropka

0

Witam jak zrobić by w przypadku próby przypisania np.: double a=23,569
program zamienił mi automatycznie z 23,569 na 23.569 ( z przecinka na kropkę ) lub przynajmniej ostrzegał że w ciągu znaków, które chcę przypisać do wartości typu double znajduje się niedozwolony znak czyli przecinek a nie, żeby program automatycznie mi wyskakiwał ?
Korzystając z jednej z funkcji STL robił mi tak, że po napotkaniu pierwszego niedozwolonego znaku przyjmował mi za wartość to co znajdowało się przed tym znakiem np.: a double;
cout << " wypisz jakas liczbę double :" << endl
// tutaj wypisuję 23,569
cin >> a;
cout << "wprowadziles a = " << a << endl;
// i wtedy program wyrzuca mi 23 , czyli obcina
// od pierwszego niedozwolonego znaku
[???]
Tak nie chcę ; chcę aby mi automatycznie zamieniał na kropkę, lub mówił żebym jeszcze raz próbował wprowadzić liczbę w sposób poprawny.
Interesuje mnie jedynie kod w czystym C++ lub w C++ z zastosowaniem biblioteki standardowej.
Szukałem w archiwum, ale nie znalazłem.
Z góry dzięki za odpowiedź.

0

Zapisałbym tą liczbę jako łaćcuch znaków (char). Jedna pętla załatwiłaby zamianę "," na ".". Sprawdzasz po kolei każdy znak i jeśli znak jest równy ",' to zamieniasz go na ".", dodatkowo mozesz jeszcze sprawdzac czy uzytkownik wpisal tylko liczby czy tez niedozwolone znaki takie jak litery. Pozniej zamieniasz ciag znakow na liczbe, byla do tego jakas funkcja ale nie pamietam jak sie nazywala, poszukaj na msdn.microsoft.com

0

Tylko od czego jest biblioteka locale?!
Ręczny parsing znaków?? A liczby 1e-2 to co, tu przecież JEST litera :P
Korzystajmy może z tego co oferuje C++:

#include <iostream>
#include <locale>
using namespace std;

class comma_punct : public std::numpunct<char>
{
protected:
    char do_decimal_point() const
    {
        return ',';
    }
  //    char do_thousands_sep()   const {return ',';}
//    std::string do_grouping() const {return "\003";}
  public:
    comma_punct() : std::numpunct<char>(){}
};

int main()
{
    std::locale loc;
    std::locale new_loc(loc, new comma_punct);
    std::cout.imbue(new_loc); // wyjscie drukuje 22,78
    std::cin.imbue(new_loc); // wejscie pobiera z przecinkiem
    
    double d;
    cin >> d;
    cout << "Liczba: " << d << endl;
}

Warto zauważyć, że znak można oddzielnia zmienić dla cin i cout, pobrać 22,78 a wyświetlić 22.78 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1